stm32 不断进入串口中断的bug解决方法

在使用stm32的时候,发现usart会莫名的卡在串口中断里,然而串口初始化只配置了RXNE中断,打断点发现不断进入中断却没不是RXNE中断引起的,经过查找资料发现是ORE的问题,2篇博文解决方案如下:

http://bbs.21ic.com/icview-160999-1-1.html

http://blog.csdn.net/origin333/article/details/49992383

大致原因为开启了RXNE中断之后 ORE也开启了,但是使用USART_GetITStatus却无法读取到ORE的标志位(未使能ERR时),这样也无法消除中断申请,自然一直进入串口中断,如果要消除ORE需要使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) ;然后再读取DR:USART_ReceiveData(USART1);就可以消除该中断请求。

STM32F4 中,串口空闲中断是一种非常有用的机制。当串口接收完一帧数据后,如果接收缓冲区中没有新的数据到达,则会触发空闲中断。这种中断可以有效地解决数据接收时的误码问题,提高数据的可靠性。 下面是一个简单的实现步骤: 1. 初始化串口,并开启空闲中断。可以通过 HAL 库来实现这一步骤。 2. 在空闲中断处理函数中,读取串口接收缓冲区中的数据,并行处理。 3. 在处理完数据后,重新开启串口接收中断。 代码示例: ```c // 初始化串口 void UART_Init(void) { // 其他初始化代码... // 开启空闲中断 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 其他初始化代码... } // 串口空闲中断处理函数 void HAL_UART_IDLE_IRQHandler(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 读取数据 uint16_t len = huart->RxXferSize - huart->RxXferCount; uint8_t data[len]; memcpy(data, huart->pRxBuffPtr, len); // 处理数据 // ... // 重新开启接收中断 __HAL_UART_CLEAR_IDLEFLAG(huart); HAL_UART_Receive_DMA(huart, huart->pRxBuffPtr, huart->RxXferSize); } } ``` 在上面的代码中,我们使用了 HAL 库来初始化串口并开启空闲中断。在空闲中断处理函数中,我们先读取了接收缓冲区中的数据,并行了处理。最后,我们通过重新开启接收中断来继续接收数据。注意,这里使用了 DMA 方式来行数据的接收,以提高接收效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值