STM32 串口溢出中断未处理 中断优先级不合理 引发的反复进中断 处理记录

基于HAL库的 STM32F4 工代代码

在DMA中断中要处理大块数据 中断占用时间高达200us

同时串口还在一直进数据

DMA中断优先级设置为:

HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn);

串口中断优先级设置为:

HAL_NVIC_SetPriority(USART6_IRQn, 5, 5);
HAL_NVIC_EnableIRQ(USART6_IRQn);

导致串口接收到数据后 刚好碰到DMA还在进行中 由于优先级的原因 0级高于5级 串口中断无法进入
也就无法及时将接收的数据搬走 发生了溢出中断 中断时的SR寄存器值的0XD8

然而在串口中断服务函数中 一开始没有对溢出中断做处理 也就是没有 ORE 和 NE 中断检查和清除的这就导致串口中断一直进去 但是标志位一直没有清除掉

解决办法:

1.对 ORE 和 NE 中断检查和清除

uint32_t isrflags = READ_REG(_pUart->Instance->SR);

if (isrflags & USART_SR_ORE) // 0x08
{
// ORE 置位
READ_REG(_pUart->Instance->DR); // 先读 SR,再读 DR 来一次性清除所有错误标志(ORE、NE、FE、PE)

}
if (isrflags & USART_SR_NE) // 0x04
{
// NE 置位
READ_REG(_pUart->Instance->DR); // 先读 SR,再读 DR 来一次性清除所有错误标志(ORE、NE、FE、PE)

}

  1. 修改优先级 将可能阻塞串口中断的其他中断优先级适当降低 比如在我的应用中
    将DMA中断优先级修改为了

    HAL_NVIC_SetPriority(DMA2_Stream4_IRQn, 6, 6);
    HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn);

posted @ 2026-07-08 20:20  baiyang80  阅读(19)  评论(0)    收藏  举报