重庆市建设银行网站,一站式网站建设有哪些,php做网站常见实例,wordpress改密码忘记问题介绍#xff1a; 某个项目开发过程中#xff0c;串口接收中断#xff0c;开启了DMA数据传输#xff0c;开启了DMA中断#xff0c;开启DMA半满中断。然后程序运行的过程中#xff0c;接收了一部分数据后就会卡在启动文件的DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler 中断里。…问题介绍 某个项目开发过程中串口接收中断开启了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工程串口配置信息
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生成代码的时候不必要的中断服务函数直接别点自动生成了中断服务函数的管理要理清楚别弄懵了。 美女镇楼