|
有人使用STM32H743芯片做应用开发,遇到个比较奇怪的事情。事情是这样的,他使用ST公司的图形化配置工具STM32CubeMx进行基本配置后,如果基于ARM MDK IDE创建工程并组织代码,编译除错后运行一切正常。但如果他基于IAR IDE创建工程并使用相同的用户代码时,发现程序没法正常运行,同时还没有任何报错。颇为奇怪。' C' r* _/ h! {5 `4 f 经进一步了解。他的代码要实现的一个主要功能就是ADC,并利用通用DMA将ADC结果搬运到内存。现在最明显的问题就是,当把IDE从MDK切换到IAR后,ADC的结果没有被搬运到内存。借助调试可以确认,ADC外设确实启动了、DMA配置也没有问题,那到底怎么回事呢?两个环境下的外设配置及用户应用代码是完全一样的。 借助调试,在调试过程中无意发现了一点点差异。那就是两个IDE分别为存放ADC结果的内存安排的地址不一样。下面两幅截图来自ARM MDK和IAR环境下存放ADC结果的内存地址。; L& r3 {0 D* ] ' p+ K" o/ D+ N( T! t! ]
不难看到,在MDK环境下,内存地址安排在0x2400008c开始的地方,而在IAR环境下内存地址被安排在0x20000084开始的地方。难道问题就出在这个地方? 0 F+ D& y1 W" e; k% b------正是! 我们先查看STMH7参考手册,看看上面2个地址位于哪些内存区。' I" b; k5 ]) G# S5 z/ J- T
也就是说,IAR默认将存放ADC结果的内存安排在DTCM区,而MDK将其安排在AXI SRAM区。我们可以查看手册得知,H7系列的通用DMA1或DMA2是没法访问DTCM的。DTCM只能被内核或MDMA访问。
上图中的短横杠表示不可访问。原来是这样,难怪编译过程中没有任何报错提示,只是所选DMA硬件上不支持对DTCM的访问而已。 既然知道了原因,问题就好解决了。我们可以在IAR环境里直接给定存储地址,能让DMA访问到就行。或者在IAR调试环境下修改内存使用的默认地址于AXI SRAM区【参考下面截图示意操作】。) {$ Z( U( G8 D% q: `5 i1 Z 3 |+ V2 A( j9 \% Y' E& ^" ^: P
OK,今天的话题就分享到这里。 ' X# i7 h; C( q+ W 如有侵权请联系删除 转载自:Miler! m% h, r A' y1 D" b ]0 s4 P |
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
《MCUBoot课程》学习笔记+从信任链原理到量产实践
STM32CubeIDE 2.2.0新版本发布
CubeMX生成CubeIDE工程代码乱码
STM32CubeIDE实时时钟(RTC)经验分享
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
【STM32U3 评测】人体行为识别
【STM32U3 评测】串口控制步进电机与LabVIEW数据采集
微信公众号
手机版