[其他ST产品] STM32 不断进入串口中断问题 解决方法

[复制链接]
815|13
 楼主| c17 发表于 2023-4-30 20:15 | 显示全部楼层 |阅读模式
STM32 有时候会不断进入中断,解决方法如下

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

  2. void Usart_Init(void)  

  3. {  

  4.   

  5.   

  6.     GPIO_InitTypeDef GPIO_InitStructure;  

  7.     NVIC_InitTypeDef NVIC_InitStructure;  

  8.     USART_InitTypeDef USART_InitStructure;  

  9.       

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

  11.       

  12.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);  

  13.     GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);  

  14.       

  15.     GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9 | GPIO_Pin_10;  

  16.     GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;  

  17.     GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;  

  18.     GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;  

  19.     GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_UP;  

  20.     GPIO_Init(GPIOA,&GPIO_InitStructure);  

  21.          

  22.   

  23.       

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

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

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

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

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

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

  30.   

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

  32.   

  33.       

  34.     USART_Cmd(USART1,ENABLE);     

  35.   

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

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

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

  39.   

  40.     NVIC_Init(&NVIC_InitStructure);  

  41.       

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

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

  44.   

  45.   

  46. }  





 楼主| c17 发表于 2023-4-30 20:15 | 显示全部楼层
在中断中,检测溢出中断并作处理,代码如下所示


  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. }  
 楼主| c17 发表于 2023-4-30 20:15 | 显示全部楼层
这样就可以解决,串口不断进入中断的问题
Clyde011 发表于 2024-6-16 07:08 | 显示全部楼层

电源电压处于1.6V到5.5V之间
公羊子丹 发表于 2024-6-16 08:01 | 显示全部楼层

电压范围称为工作电源电压
万图 发表于 2024-6-16 09:04 | 显示全部楼层

内部电路工作电圧是通过内部电压调节器调节电源电压得到的
Uriah 发表于 2024-6-16 10:07 | 显示全部楼层

单片机的外部都连接有象电池等电源部分
帛灿灿 发表于 2024-6-16 12:03 | 显示全部楼层

通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。
Bblythe 发表于 2024-6-16 13:06 | 显示全部楼层

主时钟振荡器主要用作CPU的工作时钟
周半梅 发表于 2024-6-16 15:02 | 显示全部楼层

防止因瞬间大电流引起的电源电压下降
Pulitzer 发表于 2024-6-16 16:05 | 显示全部楼层

要在外部连接一个振荡电路提供时钟信号
童雨竹 发表于 2024-6-16 18:01 | 显示全部楼层

与15号引脚连接的C1称为旁路电容
Wordsworth 发表于 2024-6-16 19:04 | 显示全部楼层

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

40

主题

312

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部