0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32H7系列芯片发不出去的hello问题

茶话MCU 来源:茶话MCU 2024-07-01 09:56 次阅读

有人使用STM32H7系列芯片,用到UART做字符串输出时遇到点小问题。这里一起聊聊该问题,并分析问题原因。【注:下面所用IDE乃ARM keil MDK】

事情是这样的,他基于DMA方式通过UART对外发送“Hello”字符串,可无意中发现当该字符串以不同的变量形式提供给函数时结果却不一样。不妨以下面示意的功能代码为例来看。

8d70157c-35cc-11ef-a4c8-92fbcf53809c.png

上图中的主要功能就是基于DMA方式通过UART发送两次字符串,一个字符串是“Hello,STM32-1!”,另一个是“Hello,STM32-2!”,两字符串一字之差以示区别,便于调试。

可是,按照上面写法和默认编译条件,测试发现只有第一个UART发送函数有效,第二个UART发送函数没有相应输出。见下面输出截图:

8da15952-35cc-11ef-a4c8-92fbcf53809c.png

那是为什么呢?两个函数的实现及变量几乎一模一样。如果不使用DMA方式做UART发送会怎么样呢?即将UART的发送改成查询方式的API函数,见下面截图:

8dbe9c10-35cc-11ef-a4c8-92fbcf53809c.png

结果发现,如果按照上面的写法,两行功能代码的输出又是正常的,见下面输出结果截图。

8de14b70-35cc-11ef-a4c8-92fbcf53809c.png

看来,问题的出现跟使用DMA有关。既然问题跟DMA有关,为什么同样使用基于DMA方式的UART发送函数,一行可以另一行却无效呢?这两行的唯一差别就是在提供发送字符串的形式上的差异。一行是基于字符串常量提供给函数,一行是基于内存变量提供给函数。

8d70157c-35cc-11ef-a4c8-92fbcf53809c.png

现在的情况是,基于字符串常量提供给函数的可行,基于内存变量提供给函数的不可行。

这就可能涉及到DMA访问地址空间的可行性问题,一般来讲,每个DMA往往有其可访问的地址范围问题,并非无所不达。具体到STM32H7系列,其通用DMA是没法访问TCM区域的。当然,对于内核CUP而言,它自然没有访问不到的地址空间问题,所以刚才基于查询式做发送时两行函数功能都正常。

具体到这里,第一个字符串以常量形式提供给UART发送函数时,DMA可以访问到,第二个字符串以内存变量形式提供给UART发送函数时,DMA则访问不到。我们可以知道,字符串以常量形式提供给UART发送函数时,字符串是存放在FLASH里的。我们可以借助调试工具找到此时第一个字符串的具体存放地址,显然是片内Flash地址。见下图:

8e1d8d10-35cc-11ef-a4c8-92fbcf53809c.png

在STM32H7系列里,通用DMA方式片内Flash是没有问题的。所以解释了第一行代码输出正常。

8ec3b9ba-35cc-11ef-a4c8-92fbcf53809c.png

那么,当第二个字符串以内存变量形式提供给UART发送函数时,该字符串到底存放在哪里呢?其实,其地址如果没有刻意通过用户指定的话,是编译器根据当前的编译配置自动安排的。我们借助调试工具,不难看到第二个字符串变量【TX_Buffer】就是存放下面的地址,即0x20000008开始的一段地址空间:

8ee6ac22-35cc-11ef-a4c8-92fbcf53809c.png

结合STM32H7系列手册相关地址布局说明,不难得知第二个字符串存放在DTCM区域,正是通用DMA访问不到的地址空间。

8f113762-35cc-11ef-a4c8-92fbcf53809c.png

既然知道了原因,解决起来就就简单了。我们可以在代码里直接将字符串存放地址指定到通用DMA可以访问到的地方,比方AXIRAM,SRAM1/SRAM2/SRAM3任意区间。

我在下面使用AXI RAM作为默认的内存空间,也无须通过用户代码做地址的指定,只是稍微调整了ARM MDK IDE的链接配置选项,见下面示意图。【注:不同的IDE,这个地方的操作会略有差异。】

8f52388e-35cc-11ef-a4c8-92fbcf53809c.png

8f6c7bae-35cc-11ef-a4c8-92fbcf53809c.png

然后基于之前的代码重新编译、运行,结果正常,不再有发不出去的Hello了。

8f9549da-35cc-11ef-a4c8-92fbcf53809c.png

DMA作为CPU的强力帮手,也有鞭长莫及的时候,我们在STM32应用中要加以留意。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    454

    文章

    50502

    浏览量

    422330
  • uart
    +关注

    关注

    22

    文章

    1230

    浏览量

    101223
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20493

原文标题:发不出去的hello问题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    求助,调用HAL_UART_Transmit_DMA函数连续发送时发现发不出去是为什么?

    我在调用HAL_UART_Transmit_DMA函数连续发送时发现发不出去(while(1)可以持续发送但可能丢了不少包),返回值为HAL_BUSY,条件即huart->gState
    发表于 04-08 06:01

    ESP8266做网路电话收的到发不出去是什么原因导致的?

    我用 STM32F407 + ESP8266 做了一个网路电话, 用的AT模式 想实现全双工收发 在通话建立後 收的到却发不出去 感觉上是RX一直在收音频数据 没时间回传发送的 AT ACK.
    发表于 05-10 07:02

    2401发不出去

    我的无线2401发不出去信号呀!我该怎么做?
    发表于 06-12 09:20

    IMX283 信号死活发不出去

    问:收是0,发是1,死活发不出去?这个脚已经断开,强制拉高试过了,还是发不出去。串口试过了没问题,到485这就是发布出去数据。串口已经往外发了很多了,看着挺稳定的。但是485就发不出
    发表于 02-20 10:35

    STM32连接GSM发不出去信息而用电脑调试助手就能发送

    STM32串口连接GSM模块,一直发不出去短信,原因自己也找不出来了,求解求解啊。串口线是没错的,串口输出是可以将AT指令发送到电脑的,用电脑调试助手接收到的是AT+CSCS="
    发表于 04-25 00:23

    ESP8266网路电话发不出去

    我用ESP8266做了一个网路电话,用的AT模式想实现全双工收发在通话建立後收的到却发不出去感觉上是RX一直在收音频数据没时间回传发送的AT ACK。试过自己delay在发送或是不理会 ack 直接
    发表于 05-27 22:40

    基于89C52的ATK SIM800C模块第一条信息发不出去

    基于89C52的ATK SIM800C模块为什么第一条信息发不出去
    发表于 06-03 03:46

    为什么stm32 can正常模式发不出数据?

    stm32 can 正常模式下发不出数据 上位机是USBCAN环回模式是正常的 USBcan能监测到数据用的原子的103例程 就改了下环回变正常模式 。while循环里直接发送函数。。。。不知道为什么发不出!!有人遇到过吗?
    发表于 09-16 22:44

    NRF24l01双机通信用XCOM发不出去信息,一直都在循环显示asc码的解决办法?

    跑了原子哥的实验代码,进行双机通信,按键确认收发之后,用XCOM发不出去信息,一直都在循环显示asc码。该怎么办
    发表于 07-15 22:59

    STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO

    STM32H7教程】第19章 STM32H7的GPIO应用之按键FIFO
    发表于 11-23 18:21 9次下载
    【<b class='flag-5'>STM32H7</b>教程】第19章 <b class='flag-5'>STM32H7</b>的GPIO应用之按键FIFO

    STM32H7学习之路继续(stm32H7系列3) GPIO

    STM32H7学习之路继续(stm32H7系列3) GPIO
    发表于 11-30 12:36 20次下载
    <b class='flag-5'>STM32H7</b>学习之路继续(<b class='flag-5'>stm32H7</b><b class='flag-5'>系列</b>3)  GPIO

    STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)

    STM32H7教程】第21章 STM32H7的NVIC中断分组和配置(重要)
    发表于 12-04 14:36 13次下载
    【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中断分组和配置(重要)

    STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder

    STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder
    发表于 12-05 20:06 7次下载
    【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的终极调试组件Event Recorder

    STM32H7教程】第14章 STM32H7的电源,复位和时钟系统

    STM32H7教程】第14章 STM32H7的电源,复位和时钟系统
    发表于 12-09 11:21 36次下载
    【<b class='flag-5'>STM32H7</b>教程】第14章 <b class='flag-5'>STM32H7</b>的电源,复位和时钟系统

    AN5293 STM32F7系列移植到STM32H7系列

    AN5293 STM32F7系列移植到STM32H7系列
    发表于 11-21 12:57 1次下载
    AN5293 <b class='flag-5'>STM32F7</b><b class='flag-5'>系列</b>移植到<b class='flag-5'>STM32H7</b><b class='flag-5'>系列</b>