汇编实验:
STACK_TOP EQU 0x20002000 ; SP初始值,常数
NUM EQU 20
; Vector Table Mapped to Address 0 at Reset
AREA RESET, CODE, READONLY ;(段名为RESET)
DCD STACK_TOP ; Top of Stack
DCD START ; Reset Handler
ENTRY ; 指示程序从这里开始执行
START ; 主程序开始
LDR R0, =src ;从R0的地址(0x08000044)开始,先加载地址,在相应地址赋值,即在相应地址放入代码段里定义的值
LDR R1, =dst ;从R1的地址(0x2000000)开始,连续开辟一段空间(大小等于NUM),其值都为0
MOV R2, #NUM ;将立即数20放入R2(0x00000014)h
MOVS R3, R2, LSR #3 ;R3 <-(R2>>3) R3(0x00000002)h
BEQ COPYWORDS ;关系标志位(Z=1时跳转)R3(0x00000002)h
STMFD SP!, {R4-R11} ;//R4~R11全部为((0x00000000)h)
;从sp指针的位置,以地址递减储存的方式连续储存R4-R11 ,栈顶放的是LR
OCTCOPY
LDMIA.W R0!, {R4-R11} ; R4~R11 分别放入的是1~8
;从地址R0处读取多个字,并依次储存到R4-R11,每储存一个字后R0自增一次
STMIA.W R1!, {R4-R11} ; R4~R11的内容R1的地址(0x2000000)开始,依次放入
;从地址R1开始依次读取多个字,每次读取后R1自增一次
SUBS R3, R3, #1 ;R3=R3-1 并更新标志位
BNE OCTCOPY ; 条件:上一次操作时(z=0时跳转)
;第一次运行后R3(0x0000001)h;
;回到上部 OCTCOPY处从新执行,目的将剩余的数放入R4~R11中内容是9~16
;第二次运行后R3(0x0000000)h
LDMFD.W SP!, {R4-R11} ;将sp指针所指的内容赋值给R4~R11 目的将R4~R11清空
COPYWORDS
ANDS R2, R2, #7 ; number of odd words to copy
BEQ STOP ; 判断R2中的内容是否为1 此时R2(0x00000004)
WORDCOPY
LDR R3, [R0], #4; ; 【R0】赋值给R3; R0=R0+4; R3(0x0000012)h R0(0x0800008c)
STR R3, [R1], #4;0x20000040 ; store a word to the destination
SUBS R2, R2, #1 ; decrement the counter
bne WORDCOPY ; 循环完毕后从R1的地址连续储存三个数分别是 18 19 20
STOP
B . ; 工作完成后,进入无穷循环
;定义数据区
AREA mydata1, DATA, READONLY
src DCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
AREA mydata2, DATA, READWRITE
dst SPACE NUM
END ; 标记文件结束
LED闪烁:
#include "stm32f10x.h"
// pb5 led1
// pD6 led2
// pD3 led3
void rcc_configration()
{
SystemInit(); // 初始化系统硬件信息等
}
void led_configration()
{
GPIO_InitTypeDef GPIO_InitStructure; // 结构体声明
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE); // 使能
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main()
{
rcc_configration() ;
led_configration();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOD,GPIO_Pin_6);
GPIO_SetBits(GPIOD,GPIO_Pin_3);
GPIO_ResetBits(GPIOD,GPIO_Pin_3); // 清除端口为位
while(1);
}
}
#include "stm32f10x.h"
void LED_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1 V6 配置为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LCD背光控制
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD, GPIO_Pin_13); //LCD背光关闭
}
void RCC_Configuration(void){
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
}
void Delay_us(uint32_t n);
uint8_t a;
int main()
{
RCC_Configuration();
LED_Config();
//SysTick_Config(72000000);
a=0;
while(1)
{
Delay_us(50000);
GPIO_SetBits(GPIOB, GPIO_Pin_5); //LED1 亮
Delay_us(50000) ;
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //LED1 灭
}
while(1);
}
//
/***************************************************************************************************
*\Function Delay_us
*\Description 系统滴答时间
*\Parameter n
*\Return void
*\Note
*\Log 2014年6月16日15:53:09 Ver 1.0 孙晓磊
* 系统延时函数
***************************************************************************************************/
void Delay_us(uint32_t n) 延时多少微秒,n就输入多少!
{
SysTick->LOAD=72*n; //装载计数值,因为时钟72M,72次在1μs
SysTick->CTRL=0x00000005;//时钟来源设为为HCLK(72M),打开定时器
while(!(SysTick->CTRL&0x00010000));//等待计数到0
SysTick->CTRL=0x00000004;//关闭定时器
}
键盘处理中断 ledl亮灭:
/* LED1-LED3 ---V6——V8
V6----- PB5-LED1
V7----- PD6-LED2
V8----- PD3-LED3
k1------ PC5
k2-------PC2
k3-------PC3
*/
#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
/***************************************************************************************************
*\Function Rcc_configration
*\Description RCC配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 创建函数。
***************************************************************************************************/
void Rcc_configration()
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
}
/***************************************************************************************************
*\Function GPIO_configration
*\Description GPIO配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 配置函数。
***************************************************************************************************/
void GPIO_configration()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
/***************************************************************************************************
*\Function NVIC_Configration
*\Description NVIC配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 配置函数。
***************************************************************************************************/
void NVIC_Configration()
{
NVIC_InitTypeDef NVIC_Structure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //选定优先级分组
NVIC_Structure.NVIC_IRQChannel=EXTI9_5_IRQn; // 对各个通道进行优先级设定
NVIC_Structure.NVIC_IRQChannelSubPriority=0;
NVIC_Structure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init(&NVIC_Structure);
NVIC_Structure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_Structure.NVIC_IRQChannelSubPriority=0;
NVIC_Structure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init(&NVIC_Structure);
NVIC_Structure.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_Structure.NVIC_IRQChannelSubPriority=0;
NVIC_Structure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Init(&NVIC_Structure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); // 选择通道 GPIO_PinSource0~15
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line5; // 对应相应的中断通道 ,开启相应的中断 EXTI_Line0~15
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
unsigned char _it0=0,num=0;
/***************************************************************************************************
*\Function Delay
*\Description 延时函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 配置函数
***************************************************************************************************/
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
/***************************************************************************************************
*\Function find_key
*\Description 检测键盘函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 配置函数
***************************************************************************************************/
void find_key()
{
if(_it0==1)
{
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5))
{
Delay(0x3ffff);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5))
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
}
}
GPIO_ResetBits(GPIOD,GPIO_Pin_6);
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
}
else if(_it0==3)
{
if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3))
{
Delay(0x3ffff);
if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3))
{
GPIO_SetBits(GPIOD,GPIO_Pin_3);
}
}
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOD,GPIO_Pin_6);
}
else if(_it0==2)
{
if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6))
{
Delay(0x3ffff);
if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6))
{
GPIO_SetBits(GPIOD,GPIO_Pin_6);
}
}
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOD,GPIO_Pin_3);
}
}
int main()
{
Rcc_configration();
GPIO_configration();
NVIC_Configration();
_it0=0;
while(1)
{
find_key(); // 循环检测,当对应通道为低电平时,触发外部中断!
}
}
// stm32f10x_it.c
/***************************************************************************************************
*\Function EXTI9_5_IRQHandler
*\Description 中断处理函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 中断函数
***************************************************************************************************/
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET) //判别是否有键按下
{
_it0=1; //按键中断标志
EXTI_ClearITPendingBit(EXTI_Line5); //清除中断请求标志
}
}
/*
/***************************************************************************************************
*\Function EXTI2_IRQHandler
*\Description 中断处理函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 中断函数
***************************************************************************************************/
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET) //判别是否有键按下
{
_it0=2; //按键中断标志
EXTI_ClearITPendingBit(EXTI_Line2); //清除中断请求标志
}
}
/***************************************************************************************************
*\Function EXTI3_IRQHandler
*\Description 中断处理函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 中断函数
***************************************************************************************************/
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) != RESET) //判别是否有键按下
{
_it0=3; //按键中断标志
EXTI_ClearITPendingBit(EXTI_Line3); //清除中断请求标志
}
}
*/
usart中断发送字符:
#include "stm32f10x.h"
#include "platform_config.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "stdarg.h"
/*
TXD2----- PA2-US2-TX
RXD2----- PA3-US2-RX
速率:9600,n,8,1
*/
/***************************************************************************************************
*\Function RCC_configration
*\Description RCC配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 创建函数。
***************************************************************************************************/
void RCC_configration()
{
SystemInit();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOD |
RCC_APB2Periph_AFIO,ENABLE);
// RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE);
}
/***************************************************************************************************
*\Function RCC_configration
*\Description RCC配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 创建函数。
***************************************************************************************************/
void GPIO_configration()
{
GPIO_InitTypeDef GPIO_Structure;
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Structure.GPIO_Pin=GPIO_Pin_9;
GPIO_Structure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_Structure);
GPIO_Structure.GPIO_Pin=GPIO_Pin_10;
GPIO_Structure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_Structure);
}
/***************************************************************************************************
*\Function Usart_configration
*\Description Usart配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 创建函数。
***************************************************************************************************/
void Usart_configration()
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
/***************************************************************************************************
*\Function NVIC_configration
*\Description NVIC配置
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* 创建函数。
***************************************************************************************************/
void NVIC_configration()
{
NVIC_InitTypeDef NVICInitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVICInitStructure.NVIC_IRQChannel = USART1_IRQn;
NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVICInitStructure.NVIC_IRQChannelSubPriority = 0;
NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVICInitStructure);
}
int main()
{
RCC_configration();
GPIO_configration();
Usart_configration();
NVIC_configration();
//复位时先发送ABC
//
USART_SendData(USART1,'A');
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
USART_SendData(USART1,'B');
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
USART_SendData(USART1,'C');
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
while(1);
}
/stm32f10x_it.c//
/***************************************************************************************************
*\Function USART1_IRQHandler
*\Description Usart1中断函数
*\Parameter void
*\Return void
*\Note
*\Log 2014.05.28 Ver 1.0 孙晓磊
* Usart1中断函数
***************************************************************************************************/
void USART1_IRQHandler(void) //串口2 中断服务程序
{
uint8_t c;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
{
c=USART_ReceiveData(USART1);
USART_SendData(USART1,c);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG // 发送中断还没有清零
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //禁止发缓冲器空中断,
}
}