×
单片机 > 单片机程序设计 > 详情

STM32 不断进入串口中断问题 解决方法

发布时间:2020-08-21 发布时间:
|

STM32 有时候会不断进入中断,解决方法如下

1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示

  1. void Usart_Init(void)  

  2. {  

  3.   

  4.   

  5.     GPIO_InitTypeDef GPIO_InitStructure;  

  6.     NVIC_InitTypeDef NVIC_InitStructure;  

  7.     USART_InitTypeDef USART_InitStructure;  

  8.       

  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);                          // 开启串口时钟  

  10.       

  11.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);  

  12.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);  

  13.       

  14.     GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9 | GPIO_Pin_10;  

  15.     GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;  

  16.     GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;  

  17.     GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;  

  18.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_UP;  

  19.     GPIO_Init(GPIOA,&GPIO_InitStructure);  

  20.           

  21.   

  22.       

  23.     USART_InitStructure.USART_BaudRate = 57600;                     // 配置波特率为115200  

  24.     USART_InitStructure.USART_StopBits = USART_WordLength_8b;       // 配置数据长度为8  

  25.     USART_InitStructure.USART_StopBits = USART_StopBits_1;          //设置停止位  

  26.     USART_InitStructure.USART_Parity    = USART_Parity_No;          // 配置奇偶校验为NONE  

  27.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 配置硬件流为NONE     

  28.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 打开Rx接收和Tx发送功能  

  29.   

  30.     USART_Init(USART1,&USART_InitStructure);                        // 配置  

  31.   

  32.       

  33.     USART_Cmd(USART1,ENABLE);     

  34.   

  35.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;               // 选择中断通道  

  36.     NVIC_InitStructure.NVIC_IRQChannelPriority = 2;                 // 抢断优先1  

  37.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 // 使能中断  

  38.   

  39.     NVIC_Init(&NVIC_InitStructure);  

  40.       

  41.  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                  // 打开中断  

  42.     USART_ITConfig(USART1, USART_IT_ORE, ENABLE);                  // 打开中断  

  43.   

  44.   

  45. }  


2.在中断中,检测溢出中断并作处理,代码如下所示


  1. void USART1_IRQHandler(void)  

  2. {  

  3.     u8 dat;  

  4.   

  5.  if (USART_GetITStatus(USART1, USART_IT_ORE) == SET)  

  6.     {  

  7.         USART_ClearITPendingBit(USART1,USART_IT_ORE);      

  8.         USART_ReceiveData( USART1 );  

  9.   

  10.     }  

  11.     if( USART_GetITStatus(USART1,USART_IT_RXNE) != RESET )              // 等价于if( !RI ) 检查串口数据是否已就位  

  12.     {  

  13.         USART_ClearITPendingBit(USART1,USART_IT_RXNE);  

  14.         dat = USART_ReceiveData( USART1 );  

  15.         uart_rec_buf[uart_len++]=dat;  

  16.         RX_TIM=UART_INIT_TIM;  

  17.           

  18.     }     

  19.   

  20. }  


这样就可以解决,串口不断进入中断的问题



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向