有人使用STM32H7系列芯片,用到UART做字符串输出时遇到点小问题。这里一起聊聊该问题,并分析问题原因。【注:下面所用IDE乃ARM keil MDK】
事情是这样的,他基于DMA方式通过UART对外发送“Hello”字符串,可无意中发现当该字符串以不同的变量形式提供给函数时结果却不一样。不妨以下面示意的功能代码为例来看。
上图中的主要功能就是基于DMA方式通过UART发送两次字符串,一个字符串是“Hello,STM32-1!”,另一个是“Hello,STM32-2!”,两字符串一字之差以示区别,便于调试。
可是,按照上面写法和默认编译条件,测试发现只有第一个UART发送函数有效,第二个UART发送函数没有相应输出。见下面输出截图:
那是为什么呢?两个函数的实现及变量几乎一模一样。如果不使用DMA方式做UART发送会怎么样呢?即将UART的发送改成查询方式的API函数,见下面截图:
结果发现,如果按照上面的写法,两行功能代码的输出又是正常的,见下面输出结果截图。
看来,问题的出现跟使用DMA有关。既然问题跟DMA有关,为什么同样使用基于DMA方式的UART发送函数,一行可以另一行却无效呢?这两行的唯一差别就是在提供发送字符串的形式上的差异。一行是基于字符串常量提供给函数,一行是基于内存变量提供给函数。
现在的情况是,基于字符串常量提供给函数的可行,基于内存变量提供给函数的不可行。
这就可能涉及到DMA访问地址空间的可行性问题,一般来讲,每个DMA往往有其可访问的地址范围问题,并非无所不达。具体到STM32H7系列,其通用DMA是没法访问TCM区域的。当然,对于内核CUP而言,它自然没有访问不到的地址空间问题,所以刚才基于查询式做发送时两行函数功能都正常。
具体到这里,第一个字符串以常量形式提供给UART发送函数时,DMA可以访问到,第二个字符串以内存变量形式提供给UART发送函数时,DMA则访问不到。我们可以知道,字符串以常量形式提供给UART发送函数时,字符串是存放在FLASH里的。我们可以借助调试工具找到此时第一个字符串的具体存放地址,显然是片内Flash地址。见下图:
在STM32H7系列里,通用DMA方式片内Flash是没有问题的。所以解释了第一行代码输出正常。
那么,当第二个字符串以内存变量形式提供给UART发送函数时,该字符串到底存放在哪里呢?其实,其地址如果没有刻意通过用户指定的话,是编译器根据当前的编译配置自动安排的。我们借助调试工具,不难看到第二个字符串变量【TX_Buffer】就是存放下面的地址,即0x20000008开始的一段地址空间:
结合STM32H7系列手册相关地址布局说明,不难得知第二个字符串存放在DTCM区域,正是通用DMA访问不到的地址空间。
既然知道了原因,解决起来就就简单了。我们可以在代码里直接将字符串存放地址指定到通用DMA可以访问到的地方,比方AXIRAM,SRAM1/SRAM2/SRAM3任意区间。
我在下面使用AXI RAM作为默认的内存空间,也无须通过用户代码做地址的指定,只是稍微调整了ARM MDK IDE的链接配置选项,见下面示意图。【注:不同的IDE,这个地方的操作会略有差异。】
然后基于之前的代码重新编译、运行,结果正常,不再有发不出去的Hello了。
DMA作为CPU的强力帮手,也有鞭长莫及的时候,我们在STM32应用中要加以留意。
设计资源 培训 开发板 精华推荐
- LT3750EMS,大电流电容充电电路
- LTC1275、12 位、300 ksps 采样 A/D 转换器和基准电压源的典型应用
- DER-882 - 使用 LinkSwitch-HP 的 15 W 隔离式反激式适配器,适用于小型电器
- 使用 Analog Devices 的 LT1086CT-2.85 的参考设计
- LTM8003IY 5Vout 从 7Vin 到 40Vin 降压转换器的典型应用电路
- VAR-DVK-MX6,基于 VAR-SOM-MX6 SOM 处理器的开发套件
- OM13089: LPCXpresso54114电路板
- LTM8064EY 58VIN、2.5V/7A 系列超级电容器的典型应用电路
- LTC1255 的典型应用 - 双路 24V 高侧 MOSFET 驱动器
- LTC1266,高精度微处理器电源
- 揭Altera MAX10神秘面纱,下载白皮书,抢楼赢好礼!
- 翻开《射频技术For Dummies系列》书籍,跟帖漫谈射频世界
- 是德科技有奖问答活动之四,使用实时示波器进行串扰分析,答题闯关赢好礼!
- 免费申请测评 | Sipeed MAix BiT AIoT 开发套件,搭载K210、屏幕和摄像头
- 安世半导体&世平集团 高效能&小型化, Nexperia MOSFET的5G解决方案 观看、下载 闯关赢好礼!
- 有奖直播 | 微软 Azure Sphere助力稳定,安全和灵活的物联网解决方案
- 下载《基于巨磁(GMR)的Allegro IC》白皮书,赢50元京东卡
- OMNIMATE® 4.0鼠笼式板载连接器
- 免费申请TI 样片,晒单赢好礼!