STM32串口使用心得(二)——串口溢出中断(ORE)
2017-11-14 18:20
387 查看
关于STM32的串口溢出中断,之前在网上看过两篇博客《STM32串口接收中断溢出问题解决》和《STM32 串口中的硬件BUG,请注意!》,也是从中学习到了串口ERROR的用法。关于串口溢出中断的相关寄存器操作和一些细节,两位博主已经讲得很详细了,在此感谢两位博主的辛勤付出。
接下来主要谈及CubeMX如何配置溢出中断以及本人遇到的一些问题。
首先,要把串口配置成RXNE中断,具体的配置步骤可以参考我的文章《关于CubeMX的串口全双工接收发送锁死的问题》。
然后,使能RXNE中断和ORE中断,main.c中的代码如下:
接着,在usart.c中加入串口错误中断回调函数的定义:
单纯处理溢出中断的话,这样就可以了;如果想处理其他一些错误,比如帧错误等等,就继续判断标志位;如果想在检测到错误之后做一些处理,也可以写在回调函数里。
最后还想说几点,在之前的程序中,溢出中断也与死机如影随行,如果出现了溢出中断就意味着百分百丢失了数据。而我们能做的处理无非就是清除标志位防止中断反复触发,从而使整个系统能继续运行下去。至于丢失的数据,已经不可能找回来了。
溢出中断只是作为一种防备手段来预防极小概率发生的情况,我当时用了3套串口,其中一个几乎满负荷运行,另一个用于接收GPS数据的低优先级串口使用了溢出中断,最后本来一秒一次的GPS数据在校验之后一分钟才能更新一次,甚至需要更长时间,最后还是不得不使用了串口空闲中断,为此需要为接收GPS数据保留一个1k的ram作缓存区。希望之后能找到更好的处理办法。。。
接下来主要谈及CubeMX如何配置溢出中断以及本人遇到的一些问题。
首先,要把串口配置成RXNE中断,具体的配置步骤可以参考我的文章《关于CubeMX的串口全双工接收发送锁死的问题》。
然后,使能RXNE中断和ORE中断,main.c中的代码如下:
void main(void) { ... if(HAL_UART_Receive_IT(&huart2,(u8 *)&i,1) != HAL_OK) Error_Handler(); /* 开启接收错误中断 */ __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR); ... }
接着,在usart.c中加入串口错误中断回调函数的定义:
/* 中断错误处理函数,在此处理overrun错误 */ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { uint8_t i = 0; if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) { __HAL_UART_CLEAR_OREFLAG(huart); HAL_UART_Receive_IT(huart,(u8 *)&i,1); } }
单纯处理溢出中断的话,这样就可以了;如果想处理其他一些错误,比如帧错误等等,就继续判断标志位;如果想在检测到错误之后做一些处理,也可以写在回调函数里。
最后还想说几点,在之前的程序中,溢出中断也与死机如影随行,如果出现了溢出中断就意味着百分百丢失了数据。而我们能做的处理无非就是清除标志位防止中断反复触发,从而使整个系统能继续运行下去。至于丢失的数据,已经不可能找回来了。
溢出中断只是作为一种防备手段来预防极小概率发生的情况,我当时用了3套串口,其中一个几乎满负荷运行,另一个用于接收GPS数据的低优先级串口使用了溢出中断,最后本来一秒一次的GPS数据在校验之后一分钟才能更新一次,甚至需要更长时间,最后还是不得不使用了串口空闲中断,为此需要为接收GPS数据保留一个1k的ram作缓存区。希望之后能找到更好的处理办法。。。
相关文章推荐
- STM32串口使用心得(一)——DMA+空闲中断接收
- STM32串口中断使用
- STM32使用SRAM方式仿真不进串口中断的解决方法
- STM32 使用HAL库做串口的DMA发送和中断接收
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- 关于stm32的MY_NVIC_Init()中断管理函数的使用心得!
- stm32-串口使用IDLE中断接受不定长数据方法
- STM32串口中断使用
- STM32串口使用IDLE中断接收不定长数据原理与源程序
- STM32使用DMA加串口空闲中断接收数据
- STM32使用串口中断发送和接受数据
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- STM32使用串口IDLE中断的两种接收不定长数据的方式
- STM32—无需中断来实现使用DMA接收串口数据
- STM32串口接收中断溢出问题解决
- STM32串口悬空导致CPU持续进入中断函数
- 使用STM32的串口进行大量数据传输
- STM32串口使用偶校验时初始化
- STM32串口一直进中断解决方法
- stm32学习笔记:GPIO外部中断的使用