STM32连续进中断问题+

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

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

[cpp]  view plain  copy
  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. <span style="color:#ff0000;"> USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                  // 打开中断  
  42.     USART_ITConfig(USART1, USART_IT_ORE, ENABLE);</span>                  // 打开中断  
  43.   
  44.   
  45. }  

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

[cpp]  view plain  copy
  1. void USART1_IRQHandler(void)  
  2. {  
  3.     u8 dat;  
  4.   
  5. <span style="color:#ff0000;"if (USART_GetITStatus(USART1, USART_IT_ORE) == SET)  
  6.     {  
  7.         USART_ClearITPendingBit(USART1,USART_IT_ORE);      
  8.         USART_ReceiveData( USART1 );  
  9.   
  10.     }</span>  
  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. }  

这样就可以解决,串口不断进入中断的问题
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值