汇编实验:
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); //禁止发缓冲器空中断, } }