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

发布时间:2023-06-25  

‍经常有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

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


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

相关文章

    仪器 测序您可能想要检测的另一个常见故障是排序不正确——导轨未按正确顺序出现、导轨根本未出现或导轨出现时序不正确都是不正确排序的示例。与过压和欠压故障注入一样,有两种方法可以引发时序故障:数字......
    电工证考试简易常识(2024-09-06 18:05:54)
    设备。 5. 接拆电线的正确顺序:接线路时,先接零线,后接火线。 拆线路时, 先拆火线,后拆零线。 6. 低压断路器,也称为自动空气开关,主要......
    >RST>IIC指令。 软件方向: 查验寄存器配置 ,发现其故障原因是芯片在初始化过程中先打开了CLASS-D, 后打开DAC。正确顺序应该是先打开DAC再打开CLASS-D,修改为正确寄存器顺序......
    每个字节拆分成多个数据位,并按照顺序发送 (3)发送端发送起始位,表示数据传输的开始 (4)发送端依次发送数据位,最高位先发送 (5)发送端发送校验位,用于检测数据的正确性 (6)发送端发送停止位,表示数据传输的结束 2......
    五章关于这部分详细介绍。 七、CRC校验 配置文件载入完成后,为了验证数据的正确性,FPGA还自动设置了CRC校验(CRC是同步进行),导入完成后会将计算的CRC值与期望CRC值进行比较。如果CRC......
    网线连接起来。下图是两台计算机的IPv4地址,左边是主机,右边是从机。 图2主机/从机IPv4地址配置 在Windows网卡配置正确后,可以在Multi CANoe Settings对话......
    的最后一步完结的时间(到“时”、“分”),亦由监护人负责填写。 操作顺序: 按操作的正确顺序进行组合后的总顺序......
    . ipconfig 命令 如果计算机和所在的局域网使用了动态主机配置协议 DHCP,使用 ipconfig 命令可以了解到你的计算机是否成功地租用到了一个 IP 地址,如果已经租用到,则可......
    体机 VR 都是当前市场上主要的虚拟现实设备。它们在硬件配置、使用方式和支持的游戏应用上存在一些差异。PC VR 设备具备更高的图形质量和处理能力,但需要连接到计算机上,并需要额外的传感器支持。一体机 VR......
    软件和Simaticnet6.0(或以上版本)的通讯配置软件和授权; 5)Profibus-S7通过方式:需要在组态王所在的计算机上安装STEP7编程软件,但不需要安装SIMATICNET软件。 ......

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

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

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

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

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

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

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