stm32 HAL库 发送接受 到了一定的字符串后就卡在.s文件中

2023-12-13 06:47:28

问题介绍:

某个项目开发过程中,串口接收中断,开启了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生成代码的时候不必要的中断服务函数直接别点自动生成了,中断服务函数的管理要理清楚,别弄懵了。

?美女镇楼!!!!!!

?

文章来源:https://blog.csdn.net/qq_21370051/article/details/134954059
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。