在STM32F2上使用两个运行速度为115200波特率的USART,一个用于与无线电模块通信,另一个用于从PC接收串行数据。时钟速度为120MHz。
当同时从两个USART接收数据时,可能会在其中一个USART上出现溢出错误。进行一些简单的笔算,应该有足够的时间来处理两个USART的数据,因为中断只是简单地将字节复制到循环缓冲区中。
从理论和测量结果来看,将字节推入缓冲区的中断代码应该/确实以2-4µS的顺序运行,在115200波特率下,我们有大约70us的时间来处理每个字符。
为什么我们会看到偶尔在其中一个USART上出现ORE?
更新-附加信息:
MDK-ARM版本为4.70
RTOS使用systick中断,因此无法计时,其他ISR每个字节需要2-3µS。
当同时从两个USART接收数据时,可能会在其中一个USART上出现溢出错误。进行一些简单的笔算,应该有足够的时间来处理两个USART的数据,因为中断只是简单地将字节复制到循环缓冲区中。
从理论和测量结果来看,将字节推入缓冲区的中断代码应该/确实以2-4µS的顺序运行,在115200波特率下,我们有大约70us的时间来处理每个字符。
为什么我们会看到偶尔在其中一个USART上出现ORE?
更新-附加信息:
- 我们的代码中没有其他ISR在此时触发。
- 我们正在运行Keil RTX,并配置systick中断每10mS触发一次。
- 我们此时没有禁用任何中断。
- 根据这本书(Cortex-M处理器系列的设计指南),中断延迟约为12个周期(并不致命)
MDK-ARM版本为4.70
RTOS使用systick中断,因此无法计时,其他ISR每个字节需要2-3µS。
PRIMASK
设置得足够高以禁用你的 UART 中断(可能是无意中)?我知道 FreeRTOS 在 CM3 上会这样做,以便让你仍然拥有不使用操作系统的“快速”中断,但它们需要设置在特定优先级以上。 - rjp