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

发布时间:2024-09-25  

有人使用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应用中要加以留意。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>