问题介绍:
某个项目开发过程中,串口接收中断,开启了DMA数据传输,开启了DMA中断,开启DMA半满中断。然后程序运行的过程中,接收了一部分数据后就会卡在启动文件的DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler 中断里。
如下图:
摘要:
本文主要干啥事内:某个项目开发过程中,串口接收中断,开启了DMA数据传输,开启了DMA中断,开启DMA半满中断。然后程序运行的过程中,接收了一部分数据后就会卡在启动文件的一个中断里。
本文介绍如何排查问题并解决该问题。
运行开发环境介绍
硬件环境 | STM32F091CCT6 J-LINK V11 |
软件开发环境 | IAR 8.32.1 VSCODE |
软件支持包 | ST官方HAL库 |
STM32工程串口配置信息
串口接收中断 | 开启 |
串口DMA | 开启 |
串口DMA半满中断 | 开启 |
串口DMA全满中断 | 开启 |
问题排查分析:
因为我用到了串口4 和DMA1 所以可以看出来,是DMA1串口中断出问题
经过仿真发现 程序总是接受了一段时间后,大约收到120字节数据后就进入上面的中断中。
而查看 串口配置里面 串口DMA接受缓冲区大小中好大约 256 256/2 128
非常接近,怀疑是串口DMA接收过半函数中断出问题
验证:
在下面的地方仿真打断点:
发现 没有进入,而用串口1的时候,下面的函数是进入的。
总结
后来发现,这部分代码原来是支持一个串口,后来我改为两个串口的时候,没有将串口4的DMA中断服务函数进行重写,实现。
其实本来CUBE 是自动生成了的
但是和我在usart.c里定义的冲突了 我就把这里的删除了
结果导致最后没人管串口4的DMA中断服务函数了。
打开注释。
容易踩的坑:
使用STM32 CUBE生成的程序,如果开启了生成串口中断服务函数后,如果你自己移植的代码中也有中断的服务函数就会报错函数重复定义,这时候如果屏蔽函数后忘记打开容易掉坑。 建议使用CUBE生成代码的时候不必要的中断服务函数直接别点自动生成了,中断服务函数的管理要理清楚,别弄懵了。
美女镇楼!!!!!!