stm32 串口中断总结_第1页
stm32 串口中断总结_第2页
stm32 串口中断总结_第3页
stm32 串口中断总结_第4页
stm32 串口中断总结_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文以USART1为例,叙述串口中断的编程过程。1、先来讲述一下在应用串口中断时涉及到的一些库文件。首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。接下来就是我们要用到的相关外设了。毫无疑问,串口文件stm32f10x_usart.c是必须的。串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpio.c文件。另外,因为有中断的产生,所以中断文件stm32f10x_it.c也是必要的,当然这个文件一般和main.c放在一个文件夹下(一般习惯为User文件夹),因为我们的中断响应函数是要在里面自己编写的。当然还有其他的基

2、本必须文件如系统配置文件等在这地方就不说了,这个是创建一个工程应该知道的。2、初始化对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比较烦人的,不像别的芯片那样简洁明了)。l 首先时钟使能配置。STM32内部的时钟有很多,感兴趣的自己看看参考手册。此处以USART1为例说明。有USART1时钟、GPIOA时钟、GPIO复用(AFIO)时钟。由于此处USART1和GPIOA、AFIO均在APB2上,所以可以一次配置完成。如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Peri

3、ph_USART1 ,ENABLE);l 其次中断配置。主要有优先级组设定、USART1中断使能、该中断的优先级,中断初始化。程序如下:void NVIC_Configuration(void)  NVIC_InitTypeDef NVIC_InitStructure;  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);/选择分组方式0    /* 使能 USART1 中断 */ 

4、 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  NVIC_Init(&NVIC_InitStructure);l 然后GPIO复用功能配置。一般情况下我们使用原始的外设和GPIO端口引脚的映射关

5、系,如果要改变其映射的话,请另外查看参考手册上关于GPIO重映射部分。对于GPIO的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。void GPIO_Configuration(void)  GPIO_InitTypeDef GPIO_InitStructure;  /* 配置 USART1 Rx 作为浮空输入 */  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  GP

6、IO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);  /* 配置 USART1 Tx 作为推挽输出 */  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  GPIO_InitStructure.GPIO_Speed =&

7、#160;GPIO_Speed_50MHz;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);l 串口初始化配置。主要有串口基本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。(1) 基本参数配置USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudR

8、ate = 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_HardwareFlowContr

9、ol_None; /硬件流控制无USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /发送与接受两种方式USART_Init(USART1, &USART_InitStructure);/用配置的参数惊喜串口初始化(2) 串口中断使能USART_ITConfig(USARTy, USART_IT_RXNE, ENABLE);/使能接受中断,在接受移位 寄存器中有数据是产生USART_ITConfig(U

10、SARTy, USART_IT_TXE, ENABLE);/使能发送中断,在发送完数据 后产生。一般情况下,如果与PC通信的话,我们只用接受中断即可。(3) 串口使能USART_Cmd(USART1, ENABLE); /USART1使能好了,经过以上不走之后呢,我们就可以进行数据的收发了。3、发送数据使用函数USART_SendData(USART1, char data),一次只能发送一个字符。当然我们可以用如下函数发送字符串。void USART1_Puts(char * str

11、)  while(*str)  USART_SendData(USART1, *str+);  /发送一个字符while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET);  /等待发送完毕 当然我们也可以循环发送字符串数组for(i = 0; TxBuf1 != '0' i+) / TxBuf1为定义好的字符串数组

12、USART_SendData(USART2 , TxBuf1);while(USART_GetFlagStatus(USART2, USART_FLAG_TC)=RESET);4、接收数据由于我们使用的是接受中断,所以当有数据需要接收时,会执相应的中断函数。此处我们USART1的中断函数在stm32f10x_it.c文件中。找到函数void USART1_IRQHandler(void),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。当然你也可以在其他文件中写下该中断函数。当产生中断进入该函数之后,我们就可以进行自己的操作了。void 

13、USARTy_IRQHandler(void)  if(USART_GetITStatus(USARTy, USART_IT_RXNE) != RESET)/如果寄存器中有数据      /* Read one byte from the receive data register */    RxBuffer1RxCounter1+ = 

14、;USART_ReceiveData(USART1);     /*  if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET)             USART_SendData(USARTy, TxBuffer1TxCounter1+);     

15、0;/这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个/中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。*/别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止一下接受中断 /* 禁止 USART1 接收中断 */ USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);/* 禁止 USART1 发送中断 */USART_ITConfig(USART1, USART_I

16、T_TXE, DISABLE);5、main函数int main(void) /这个地方和特别,我们知道一般main函数是没有返回值的,但在STM32 /的编程中其返回类型为int。  RCC_Configuration();  NVIC_Configuration();  GPIO_Configuration();  USART_InitStructure.USART_BaudRate = 9600;  USART_InitStruc

17、ture.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;&#

18、160; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  USART_Init(USART1, &USART_InitStructure);    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  /USART_ITConfig(USART1, USART_IT_TXE, ENABL

19、E);  USART_Cmd(USART1, ENABLE);  while (1)/等待中断    当然你也可以在main()中添加一些发送指令之类的东西。以上内容为个人总结,转载请注明出处。若有错误,本人概不负任何责任。STM32 外部中断配NVIC_Configuration 函数实现配置嵌套向量中断中断优先级并使能中断。其中的NVIC_PriorityGroupConfig 函数配置中断优先级的组织方式,STM32 的嵌套向量中断控制器可以配置 16 个可编程的优先等级,使用了 4 位表

20、示中断优先级(2 的 4 此方就是 16),16 个可编程的优先等级又可以分为主优先级和次优先级,例如参数 NVIC_PriorityGroup_1表示 1bit 主优先级(pre-emption priority)3 bits 次优先级(subpriority )。一、配置中断1、 分配中断向量表:/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);2、 设置中断优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGro

21、up_0); /设置中断优先级3、 初始化外部中断:/*允许EXTI4中断 */NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel; /中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= PreemptionPriorityValue; /占先优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /响应(次级)优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /通道中断使

22、能NVIC_Init(&NVIC_InitStructure);       /初始化中断注意:如果我们配置的外部针脚为PA4,或PB4,或PC4,PD4等,那么采用的外部中断也必须是EXTI4,同样,如果外部中断针脚是PA1,PB1,PC1,PD1 那么中断就要用EXTI1,其他类推。二、配置GPIO针脚作为外部中断的触发事件1、 选择IO针脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;注意,如果的针脚是端口的4号针脚,配置的中断一定是EXTI42、 配置针脚为输入GPIO_InitSt

23、ructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;3、 初始化针脚GPIO_Init(GPIOD,&GPIO_InitStructure);3配置EXTI线,使中断线和IO针脚线连接上1、 将EXTI线连接到IO端口上将EXTI线4连接到端口GPIOD的第4个针脚上      GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);注意:如果配置的针脚是4号,那么参数必须是GPIO_PinSource4   

24、60;         如果配置的针脚是3号,那么参数必须是GPIO_PinSource32、配置中断边沿       /*配置EXTI线4上出现下降沿,则产生中断*/      EXTI_InitStructure.EXTI_Line = EXTI_Line4;       注意:如果配置的4号针脚,那么EXTI_Line4是必须的&#

25、160;      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /下降沿触发       EXTI_InitStructure.EXTI_LineCmd = ENABLE;     /中断线使能 

26、      EXTI_Init(&EXTI_InitStructure);                 /初始化中断       EXTI_GenerateSWInterrupt(EXTI_Line4);         /EXTI_Li

27、ne4中断允许到此中断配置完成,可以写中断处理函数。举例:配置函数/* 函数名      NVIC_Configration* 描述          配置各个中断寄存器*/void NVIC_Configration(void)        NVIC_InitTypeDef NVIC_InitStructure;/#ifdef VECT_TAB_RAM  

28、0;   /* Set the Vector Table base location at 0x20000000 */      NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);/#else /* VECT_TAB_FLASH */      /* Set the Vector Table base location at 0x08000000 */      /NVIC_SetVecto

29、rTable(NVIC_VectTab_FLASH, 0x0); /#endif        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /设置中断优先级       /*允许EXTI4中断 */      NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;   &#

30、160;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     

31、0; NVIC_Init(&NVIC_InitStructure);             /*允许EXTI9中断*/       NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriorit

32、y = 0;       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       NVIC_Init(&NVIC_InitStructure);         &#

33、160;   /*配置SysTick处理优先级:优先级以及子优先级*/* 函数名      GPIO_Configuration(void)* 描述          配置TIM2针脚*/void GPIO_Configuration(void)/*    GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin= G

34、PIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       GPIO_Init(GPIOA,&GPIO_InitStructure); */ 

35、      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;       GPIO_Init(GPIOC,&am

36、p;GPIO_InitStructure);       /*配置GPIOD的第一个管角为浮动输入*/       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;       GPIO_Init(GPIO

37、D,&GPIO_InitStructure);       /*配置GPIOB的第9个管脚为浮动输入*/       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;       GPIO_Init

38、(GPIOB,&GPIO_InitStructure);/* 函数           SysTick_Configuration* 描述          设置SysTick*/void SysTick_Configuration(void)      /*配置 HCLK 时钟做为SysTick 时钟源*/   

39、60;   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); /系统时钟8分频 72MHz       NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 8,2);       /*SysTick Interrupt each 1000Hz with HCLK equal to 72MHz*/    

40、;   SysTick_SetReload(9000);/中断周期1ms       /*Enable the SysTick Interrupt */       SysTick_ITConfig(ENABLE);/打开中断                 SysTick_CounterCmd(SysTic

41、k_Counter_Enable);       SysTick_CounterCmd(SysTick_Counter_Clear);                /* 函数名       EXTI_Configuration* 描述        

42、;   配置EXTI线*/void EXTI_Configuration(void)       /*将EXTI线4连接到PD4*/       GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource4);       /*配置EXTI线4上出现下降沿,则产生中断*/       E

43、XTI_InitStructure.EXTI_Line = EXTI_Line4;       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;       EXTI_InitStructure.EXTI_LineCmd = ENABLE;&

44、#160;      EXTI_Init(&EXTI_InitStructure);       EXTI_GenerateSWInterrupt(EXTI_Line4);             /*将EXTI线9连接到PB9上*/       GPIO_EXTILineConfig(GPIO_PortSou

45、rceGPIOB,GPIO_PinSource9);       /*将EXTI线9上出现下降沿产生中断*/       EXTI_InitStructure.EXTI_Line = EXTI_Line9;       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       EXTI_InitStr

46、ucture.EXTI_Trigger = EXTI_Trigger_Falling;       EXTI_InitStructure.EXTI_LineCmd = ENABLE;       EXTI_Init(&EXTI_InitStructure);       EXTI_GenerateSWInterrupt(EXTI_Line9);      &#

47、160;中断函数:void EXTI4_IRQHandler(void)       if(EXTI_GetITStatus(EXTI_Line4)!= RESET)              if(Ledflag = 0)               

48、60;     Ledflag = 1;                     GPIOC->ODR |= 0X00000080;                   &#

49、160;       else       Ledflag = 0;                             GPIOC->ODR &= 0XFFFFFF7F;

50、                    EXTI_ClearITPendingBit(EXTI_Line4); /清除EXTI0线路挂起位注:时钟设置的时候最好加上这句:RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); / 使能AFIO时钟=/* *例程名称:外部中断实验实验硬件:DP-miniSTM32硬件连接:指示灯连接  PA1 

51、         按钮连接    PA3功能描述:本例程实现外部中断的输入试验,按下按钮,指示灯闪烁一下       */#include <stm32f10x_lib.h>    / STM32F10x Library Definitions#include "STM32_Init.h"       /

52、STM32 Initialization /* 名    称:Delay()*/void Delay(vu16 cnt) uint16 i,j;for (i=0;i<cnt;i+) for (j=0;j<1000;j+)   /* 名    称:RCC_Configuration()*/void RCC_Configuration(void)    ErrorStatus HSEStartUpStatus;    /使能外部晶振

53、60;   RCC_HSEConfig(RCC_HSE_ON);    /等待外部晶振稳定    HSEStartUpStatus = RCC_WaitForHSEStartUp();    /如果外部晶振启动成功,则进行下一步操作    if(HSEStartUpStatus=SUCCESS)            /设置HCLK(AHB时钟)=SYSCL

54、K        RCC_HCLKConfig(RCC_SYSCLK_Div1);        /PCLK1(APB1) = HCLK/2        RCC_PCLK1Config(RCC_HCLK_Div2);        /PCLK2(APB2) = HCLK    

55、    RCC_PCLK2Config(RCC_HCLK_Div1);                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);        /启动PLL        RCC_PLLCmd(ENABLE);&

56、#160;       /等待PLL稳定        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET);        /系统时钟SYSCLK来自PLL输出        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

57、;      /切换时钟后等待系统时钟稳定        while(RCC_GetSYSCLKSource()!=0x08);        /* RCC system reset(for debug purpose) */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO , ENABLE); /给GPIOA和重映射提供时钟

58、,注意:一定要设置RCC_APB2Periph_AFIO/* 名    称:GPIO_Configuration()*/ void GPIO_Configuration(void)   GPIO_InitTypeDef  GPIO_InitStructure;  /*设置PA3为输入*/  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  GPIO_

59、InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  GPIO_Init(GPIOA,&GPIO_InitStructure);  /*设置PA1为输出*/  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;  G

60、PIO_Init(GPIOA, &GPIO_InitStructure); /* 名    称:EXTI_Configuration()*/void EXTI_Configuration(void)  EXTI_InitTypeDef  EXTI_InitStructure;  /* Configure EXTI Line3 to generate an interrupt on falling edge */  EXTI_InitStructure.EXTI_Line = EXTI_Line3; 

61、;                  /外部中断通道3  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    /下降沿触发  EXTI_InitStructure.EXTI_LineCmd = EN

62、ABLE;        /使能  EXTI_Init(&EXTI_InitStructure);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);  /将PA3连接到外部中断通道3/* 名    称:NVIC_Configuration()*/ void NVIC_Configuration(void)  NVIC_InitTypeDef NVIC_InitStru

63、cture;#ifdef  VECT_TAB_RAM  /* Set the Vector Table base location at 0x20000000 */  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else  /* VECT_TAB_FLASH  */  /* Set the Vector Table base location at 0x08000000 */  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  

64、#endif  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           /抢占式优先级别设置为无抢占优先级  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;    /指定中断源  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   &

65、#160;    /指定响应优先级别1  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         /使能外部中断通道3  NVIC_Init(&NVIC_InitStructure);int main (void) RCC_Configuration();  /配置时钟         

66、0;     GPIO_Configuration(); /配置IO口 NVIC_Configuration(); /中断配置 EXTI_Configuration(); /外部中断配置 while(1)     /* 说明:将LED灯的连接到PA1*/  void EXTI3_IRQHandler (void)    if(EXTI_GetITStatus(EXTI_Line3) != RESET)   

67、      /添加中断处理程序  GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)0);  Delay(1000);  GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)1);  Delay(1000);     EXTI_ClearFlag(EXTI_Line3);         /清除中断标志(必须)     EXTI_ClearITPendingBit(EXTI_Line3);/ 以上两条语句作用相同     &#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论