STM32F103_LL库+寄存器学习笔记11 - 串口收发的中断优先级梳理
导言
推荐的STM32 USART+DMA 中断优先级设置(完整方案):
以你的STM32F103 USART1 + DMA实例为例:
推荐中断优先级设置 | 中断优先级 |
---|---|
USART1空闲中断(接收相关) | 优先级0 |
DMA1通道5接收中断(半满/满传输) | 优先级0 |
DMA1通道4发送中断(发送完成) | 优先级2 |
NVIC_SetPriority(USART1_IRQn, 0); // USART空闲中断最高
NVIC_SetPriority(DMA1_Channel5_IRQn, 0); // DMA接收通道跟空闲中断一样高
NVIC_SetPriority(DMA1_Channel4_IRQn, 2); // DMA发送通道最低
接收端的所有中断(USART空闲+DMA接收)优先级均高于发送端(DMA发送)。另外,如果有其他实时性要求更高的外设,需要把串口通讯的中断优先级调低的话,也要保证规则:USART空闲中断 = DMA接收通道中断 > DMA发送通道中断。
一、先明确“优先级”高低的含义
中断优先级高意味着当两个中断同时发生时,优先级高的中断会优先被CPU响应和处理。
二、为什么接收中断的优先级要比发送的中断优先级要高?
- 接收数据存在丢失风险
- 数据接收缓冲区大小有限,若Rx数据未及时取出,容易造成后续数据覆盖或丢失。因此,接收中断必须尽快响应并处理。 比如,若外部设备持续发送数据,而你未及时处理接收中断,数据将不断积压,可能导致数据缓冲区溢出。反之发送中断慢一点响应,一般也只是稍微影响数据发送速度,并不会导致致命问题。
- 发送中断的延迟容忍度较高
- 发送数据通常由程序控制,主动权在STM32手中。稍微延迟发送(即发送中断的响应慢一些)不会对系统造成严重影响,只是数据发送节奏稍慢而已,不会引发数据错位、丢失。发送数据被短暂延迟,只会导致数据发送稍慢,不影响数据完整性。
- 工业级通信协议与实践经验
- 在实际的工业设备中,接收数据通常比发送数据具有更高的实时性要求。接收端数据若未及时处理,容易影响整个系统通信状态。而发送端稍有延迟影响并不严重。