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

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

3天内不再提示

STM32CubeMx的初始配置顺序是怎么影响DMA功能的

茶话MCU 来源:茶话MCU 作者:茶话MCU 2022-10-13 10:14 次阅读

‍经常有STM32开发者基于STM32CubeMx进行配置并生成基于HAL库的初始化代码,当涉及到DMA功能时,发现DMA功能无效,但从配置操作及代码本身又似乎找不出原因来的情况。此情此景 往往挺令人抓狂的。

比方曾有人反馈,他使用STM32F4系列芯片进行产品开发,通过STM32CubeMx配置并生成初始化代码,使用了UART的DMA传输。但他发现DMA根本不工作。后来他无意中发现,是因为他在用户代码里不经意地调整过UART外设和DMA外设初始化代码的前后顺序,当他重新调整二者的先后顺序后就一切正常了【此时DMA初始化代码在前,UART初始化代码在后】。他想知道这个顺序是怎么影响DMA功能的。

我顺手拿了块STM32F334的Nucleo板,开启UART1/UART3的数据通信功能,使用DMA进行数据的循环传输。UART1发送数据,UART3接收数据。基于STM32CubeMx配置后生成初始化代码,添加用户代码。如下图所示:

4f3cb8c8-4a23-11ed-a3b6-dac502259ad0.png

经测试验证,发现基于UART1/3的DMA传输功能是正常的。

结合客户的反馈,我将DMA与UART初始化顺序前后调换下,如下图:

4f58a6e6-4a23-11ed-a3b6-dac502259ad0.png

果真发现DMA不工作了,UART1/UART3之间也没有数据通信。UART1/3的数据寄存器内容维持0值而没有任何变化,尤其作为发送端的UART1的数据寄存器也毫无动静。

看来,DMA和UART的初始化代码的顺序的确影响到了二者的功能,也就是说如果代码是基于现有CubeMX生成的初始化代码,二者的初始化顺序不能随意调整,那到底怎么回事呢?

首先查看这两个初始化代码内容,试图找到蛛丝马迹。很遗憾,并未很快发现原因。后来,当再次查看DMA初始化函数MX_DMA_Init();的具体内容时,发现代码其实很简单,就两个动作:

4f68620c-4a23-11ed-a3b6-dac502259ad0.png

一个动作是开启DMA外设的时钟,另一个就是使能DMA相关的中断矢量控制。

既然这样,我尝试将该DMA初始化函数体位置依然保持放在UART初始化代码的后面,但将DMA初始化函数里的那句开启DMA外设时钟的代码提取出来,并移至UART初始化代码之前,据此进行验证。这次,结果就一切正常了。

看来,基于现有初始化代码,这个DMA时钟的开启要放在UART初始化代码之前,那是为什么呢?感觉UART的配置跟DMA时钟没有啥关系啊。

继续挖掘原因!

再回头细看UART的初始化代码,在UART初始化函数的一个子函数HAL_UART_MspInit()那里发现了端倪。

MX_USART1_UART_Init()==》HAL_UART_Init()==》HAL_UART_MspInit();

因为我们开启了跟UART传输事件相关的DMA功能,在HAL_UART_MspInit();函数里不仅有对与UART相关的GPIO的复用功能配置,而且,还有跟UART事件相关的DMA配置。看来UART的初始化还是跟DMA有关联的。

4f7e0e04-4a23-11ed-a3b6-dac502259ad0.png

结合上面DMA初始化函数里的那句开启DMA外设时钟代码,到这里基本明白怎么回事了。

因为我们在UART初始化代码里要做跟DMA有关的配置,如果不事先将DMA外设的时钟开启,加上UART初始化函数里也没有开启DMA外设时钟的代码,那么,在UART初始化代码进行有关DMA的配置操作就没法保证有效。

到此,开篇中提到的因为DMA和UART初始化代码顺序影响DMA功能的原因应该说揭晓了。

在做嵌入式开发过程中,很多的初始化配置都是基于硬件本身的,有些初始化顺序可能有硬件方面的时序要求。关于这些,各芯片手册中一般都会有明确描述和说明。我们在编写初始化代码时须遵循相关规定。当然,有些配置顺序可能还得结合具体应用,实际体会后而做灵活调整。

回到文中案例,一般来说,STM32CubeMx在生成初始化代码时已经考虑到初始化时序这点了,只是用户在整理代码过程中可能无意调整了二者的初始化顺序而不自知,再加上我们对初始化代码本身缺乏足够的了解而可能一度陷入困境。

据个人体验,在实际应用中,当我们基于CubeMx来回调整配置时,这个顺序也可能会被打乱。请注意这点。说实在的,这个地方非常隐蔽,即使知道有这么回事也还是可能忘记或忽略。当因此而出现DMA传输异常时,如果不是基于代码做跟踪调试或阅读是很难找到问题症结的,因为配置操作和所调用的库函数代码本身是没有问题的。核心问题就是初始化代码的执行顺序。

比方这两天连续有人反馈,他们使用STM32芯片的ADC并启用DMA传输时,都是因为这个原因使得ADC数据无法被DMA取走而产生异常。总之,在现有情况下, 保证DMA初始化代码放在其它与DMA有关的各个外设初始化之前就不会有类似问题。比方就像下面的样子:

4fa40d02-4a23-11ed-a3b6-dac502259ad0.png

关于这个话题,三年前我已经在此分享过了。这个过程中,依然陆续也有人会遇到这个问题,我觉得有必要再分享之,所以在这里再分享一遍,以资提醒,愿君在开发过程中少一份坎坷。

三年,算来没完没了的新冠疫情也持续近三年了,真难啊!我在此放一首加油曲在下方,愿一切尽快正常起来!

审核编辑:汤梓红

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

    关注

    2240

    文章

    10675

    浏览量

    348848
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99973
  • dma
    dma
    +关注

    关注

    3

    文章

    536

    浏览量

    99068
  • STM32F4
    +关注

    关注

    3

    文章

    192

    浏览量

    27680
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14448

原文标题:STM32CubeMx的初始配置顺序与DMA传输异常之提醒

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

收藏 人收藏

    评论

    相关推荐

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC缺少DMA Settings配置是怎么回事?

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC1,缺少DMA Settings配置
    发表于 04-08 07:25

    STM8CubeMXSTM32CubeMX功能一样吗?

    STM8CubeMXSTM32CubeMX功能一样吗?
    的头像 发表于 10-31 16:59 1199次阅读
    STM8<b class='flag-5'>CubeMX</b>和<b class='flag-5'>STM32CubeMX</b><b class='flag-5'>功能</b>一样吗?

    STM32CubeMX介绍,功耗计算,中间件,CAD视图

    ,方便,并且直观的方式来完成这些工作。所有的配置完成后,它还可以根据所选的IDE生成对应的工程和初始化C代码。除此以外,STM32CubeMX还提供了功耗计算工具,可
    的头像 发表于 10-28 08:00 1197次阅读
    <b class='flag-5'>STM32CubeMX</b>介绍,功耗计算,中间件,CAD视图

    基于STM32CubeMX开发U盘访问应用

    电子发烧友网站提供《基于STM32CubeMX开发U盘访问应用.pdf》资料免费下载
    发表于 09-25 09:19 2次下载
    基于<b class='flag-5'>STM32CubeMX</b>开发U盘访问应用

    基于STM32U5 的 STM32CubeMX环境搭建

    基于STM32U5 的 STM32CubeMX环境搭建
    的头像 发表于 09-21 17:35 903次阅读
    基于<b class='flag-5'>STM32</b>U5 的 <b class='flag-5'>STM32CubeMX</b>环境搭建

    STM32CubeMX配置和C代码的生成

    电子发烧友网站提供《STM32CubeMX配置和C代码的生成.pdf》资料免费下载
    发表于 09-20 09:53 4次下载
    <b class='flag-5'>STM32CubeMX</b>的<b class='flag-5'>配置</b>和C代码的生成

    如何在CubeMx配置界面将DMA中断的默认使能关闭

    能不能在CubeMx配置界面将DMA中断的默认使能关闭? 这里再顺便分享一个跟CubeMx配置有关的话题。目前来看,我相信对不少人还是有帮助
    的头像 发表于 09-09 16:01 995次阅读
    如何在<b class='flag-5'>CubeMx</b><b class='flag-5'>配置</b>界面将<b class='flag-5'>DMA</b>中断的默认使能关闭

    STM32CubeMx配置USART1增加打印功能

    STM32CubeMx配置USART1增加打印功能
    的头像 发表于 08-22 10:32 671次阅读
    <b class='flag-5'>STM32CubeMx</b><b class='flag-5'>配置</b>USART1增加打印<b class='flag-5'>功能</b>

    STM32CUBEMX开发GD32F303

    在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。
    的头像 发表于 07-27 09:32 966次阅读
    <b class='flag-5'>STM32CUBEMX</b>开发GD32F303

    STM32CubeMx入门教程(4):PWM应用

    导语“使用STM32CubeMx配置定时器输出PWM波,生成初始化代码。”
    发表于 07-11 15:23 905次阅读
    <b class='flag-5'>STM32CubeMx</b>入门教程(4):PWM应用

    STM32CubeMx入门教程(3):定时器的使用

    导语“ 使用STM32CubeMx 生成初始化定时器代码,实现定时器特定定时”
    发表于 07-11 15:22 2347次阅读
    <b class='flag-5'>STM32CubeMx</b>入门教程(3):定时器的使用

    CubeMX配置stm32的DAC

    我们使用 STM32CubeMX 软件进行配置。DAC 的配置是相对很简单的,如下图所示。
    的头像 发表于 06-12 09:18 1980次阅读
    <b class='flag-5'>CubeMX</b><b class='flag-5'>配置</b><b class='flag-5'>stm32</b>的DAC

    STM32CubeMX简介和安装使用方法

    STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,
    发表于 06-07 15:43 1.4w次阅读
    <b class='flag-5'>STM32CubeMX</b>简介和安装使用方法

    STM32CubeMx外部中断基本使用方法

    第一步:现在STM32CubeMx配置所需要IO口外部中断模式。
    发表于 05-31 15:32 2857次阅读
    <b class='flag-5'>STM32CubeMx</b>外部中断基本使用方法

    STM32CubeMX-电机控制1-STM32CubeMX配置部分

    给相同处境的人一些参考; 4. 目前使用的STM32CubeMX版本为5.6.1,不同版本之间配置稍微有些区别; 关于STM32CubeMX在电机控制方面的配置,个人觉得主要分以下几
    发表于 05-06 11:37 1次下载
    <b class='flag-5'>STM32CubeMX</b>-电机控制1-<b class='flag-5'>STM32CubeMX</b><b class='flag-5'>配置</b>部分