项目场景:
stm32H743使用串口MDA发送数据,减轻MCU负担
问题描述
通过stm32cubeMX配置串口3,使用DMA发送数据,生成工程后DMA发送数据没问题,但是发送的数据全部为0x00,并不是我发的数据,通过仿真查看发现直到DMA发送函数内部数组的数据都是正确的,但是发出来的数据就变成了0x00,经过各种查找,网上搜索终于发现问题。
参考文章:https://blog.csdn.net/winnerycy/article/details/119544125
https://blog.csdn.net/qq_35862573/article/details/104193991
1、没修改前串口3DMA发送的数据如下图:
2、解决bug后正确的数据如下图:
原因分析:
1、stm32h743的DMA比较特别,他有几个内存区,默认的内存区与DMA不相连,所以定义buf的时候要定义到与DMA相连的地址上,否则DMA将传输错误的数据。
解决方案:
一、使用keil建立的工程解决如下:
1、修改.sct文件
2、在程序中添加宏和修改变量定义
3、就这样解决了问题,花了很长时间各种debug,一开始以为是程序问题,因为一下子用了四个串口,有时候屏蔽一些串口数据就正常,有时候又不正常,以为是串口相互影响,后面发现并不是,是因为我删减程序时重新编译了程序,不指定串口buf存储的地址就是随机的,有时候会是DMA可以传输的地址,有时候不是,所以各种怀疑,直到网上搜索到相应参考。
更新问题解决方法:
后面使用还发现有问题,前面的分析是错的,罪魁祸首是开启了CPU DCache,关掉CPU DCache就可以正常使用DMA了,地址的RAM2 DMA也没有问题的。至于CPU DCache开启要怎么才能使用DMA,后续再研究了。