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

问题介绍:

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

 美女镇楼!!!!!!

 

  • 38
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z文的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值