打印
[其他ST产品]

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

[复制链接]
525|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c17|  楼主 | 2023-4-30 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 有时候会不断进入中断,解决方法如下

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

void Usart_Init(void)  

{  

  

  

    GPIO_InitTypeDef GPIO_InitStructure;  

    NVIC_InitTypeDef NVIC_InitStructure;  

    USART_InitTypeDef USART_InitStructure;  

      

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

      

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);  

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);  

      

    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9 | GPIO_Pin_10;  

    GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;  

    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF;  

    GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;  

    GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_UP;  

    GPIO_Init(GPIOA,&GPIO_InitStructure);  

         

  

      

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

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

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

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

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

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

  

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

  

      

    USART_Cmd(USART1,ENABLE);     

  

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

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

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

  

    NVIC_Init(&NVIC_InitStructure);  

      

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

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

  

  

}  





使用特权

评论回复
沙发
c17|  楼主 | 2023-4-30 20:15 | 只看该作者
在中断中,检测溢出中断并作处理,代码如下所示


void USART1_IRQHandler(void)  

{  

    u8 dat;  

  

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

    {  

        USART_ClearITPendingBit(USART1,USART_IT_ORE);      

        USART_ReceiveData( USART1 );  

  

    }  

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

    {  

        USART_ClearITPendingBit(USART1,USART_IT_RXNE);  

        dat = USART_ReceiveData( USART1 );  

        uart_rec_buf[uart_len++]=dat;  

        RX_TIM=UART_INIT_TIM;  

         

    }     

  

}  

使用特权

评论回复
板凳
c17|  楼主 | 2023-4-30 20:15 | 只看该作者
这样就可以解决,串口不断进入中断的问题

使用特权

评论回复
地板
Clyde011| | 2024-6-16 07:08 | 只看该作者

电源电压处于1.6V到5.5V之间

使用特权

评论回复
5
公羊子丹| | 2024-6-16 08:01 | 只看该作者

电压范围称为工作电源电压

使用特权

评论回复
6
万图| | 2024-6-16 09:04 | 只看该作者

内部电路工作电圧是通过内部电压调节器调节电源电压得到的

使用特权

评论回复
7
Uriah| | 2024-6-16 10:07 | 只看该作者

单片机的外部都连接有象电池等电源部分

使用特权

评论回复
8
帛灿灿| | 2024-6-16 12:03 | 只看该作者

通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。

使用特权

评论回复
9
Bblythe| | 2024-6-16 13:06 | 只看该作者

主时钟振荡器主要用作CPU的工作时钟

使用特权

评论回复
10
周半梅| | 2024-6-16 15:02 | 只看该作者

防止因瞬间大电流引起的电源电压下降

使用特权

评论回复
11
Pulitzer| | 2024-6-16 16:05 | 只看该作者

要在外部连接一个振荡电路提供时钟信号

使用特权

评论回复
12
童雨竹| | 2024-6-16 18:01 | 只看该作者

与15号引脚连接的C1称为旁路电容

使用特权

评论回复
13
Wordsworth| | 2024-6-16 19:04 | 只看该作者

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

39

主题

311

帖子

1

粉丝