两个USART中断溢出错误

Jon*_*ton 8 embedded serial-port interrupt stm32

在STM32F2上使用两个以115200波特率运行的USART,一个用于与无线电模块通信,另一个用于从PC进行串行通信.时钟速度为120MHz.

当同时从两个USART接收数据溢出时,可能会在一个USART或另一个USART上发生错误.快速回退包络计算应该有足够的时间来处理两者,因为中断只是简单地将字节复制到循环缓冲区.

在理论和测量中,将字节推送到缓冲区的中断代码应该/确实以2-4μS的顺序运行,在115200波特处我们有大约70us处理每个字符.

为什么我们在一个或另一个USART上看到偶尔的ORE?

更新 - 其他信息:

  1. 我们的代码中没有其他ISR此时正在触发.
  2. 我们正在运行Keil RTX,其中systick中断配置为每隔10mS触发一次.
  3. 我们目前没有禁用任何中断.
  4. 根据本书(Cortex-M处理器系列的设计者指南),中断延迟大约为12个周期(并非真正致命)

鉴于上述所有70us在我们清除中断的时间内至少是10倍 - 所以我不确定它是如此容易解释.我是否应该断定我必须考虑其他一些因素?

MDK-ARM是版本4.70

指纹中断由RTOS使用,因此无法计时其他ISR每个字节需要2-3μS才能运行.

小智 3

几个月前,我在 Cortex M4 (SAM4S) 上遇到了与您类似的问题。我有一个基于定时器中断以 100 Hz 调用的函数。

与此同时,我将 UART 配置为中断字符接收。UART 上的预期数据是 64 字节长的数据包,每个字符的中断会导致延迟,因此我的 100 Hz 更新功能以大约 20 Hz 的速度运行。100 Hz 在这个特定的 120 MHz 处理器上相对较慢,但每个字符的中断会导致大量延迟。

我决定将 UART 配置为使用 PDC(外设 DMA 控制器),我的问题立即消失了。

DMA 允许 UART 将数据存储在内存中,而无需中断处理器,直到缓冲区已满,从而节省大量开销。

就我而言,我告诉 PDC 将 UART 数据存储到缓冲区(字节数组)中并指定长度。当 UART 通过 PDC 填充缓冲区时,PDC 发出中断。

在 PDC ISR 中:

  1. 给 PDC 新的空缓冲区
  2. 重新启动 UART PDC(以便在我们在 ISR 中执行其他操作时可以收集数据)
  3. memcpy 完整缓冲区到 RINGBUFFER 中
  4. 退出ISR

正如 swineone 上面推荐的那样,实施 DMA,您就会热爱生活。