历史上的今天
返回首页

历史上的今天

今天是:2026年01月12日(星期一)

正在发生

2023年01月12日 | STM32 DMA应用中的几个常见问题

2023-01-12 来源:zhihu

1、概念上的误解

我们知道DMA传输是在DMA请求下,将数据从源端传输到目的端。

常有人将DMA请求跟DMA的源端或目的端混为一谈。这里,我们可以将DMA传输类比成收发快递,发件方即DMA源端,收件方即DMA目的端,而DMA请求端就是呼叫快递的人。这个呼叫快递的人可能是发件方、也可能是收件方,还可能是另外第三方。比方你要发个快递,叫快递的人可能是公司的前台美眉。

具体到我们STM32应用,比方通过DMA将内存数据传输给UART DR寄存器发送出去,源端是存储相关待发送数据的内存区域,目的端是UART DR数据寄存器。至于DMA请求,可以是UART发送空事件【TXE】,也可以是定时器的某个周期性触发事件等。

在STM32各个系列的参考手册的DMA章节部分,都有类似如下的DMA请求映射表。表格里填写的都只是针对各个DMA传输流的DMA请求事件,并非一定是源端或目的端。当然,不排除作为源端或目的端同时又担当DMA请求角色的可能。

2、配置上容易忽视的问题

我们在做DMA配置时,比较容易忽视两个小问题。第一个就是源端和目的端的数据宽度的定义问题,除了考虑配置满足实际需要的数据宽度外,还要注意将源端、目的端二者数据访问宽度配置一致。不然的话,往往会导致些奇怪的问题。

还有,就是要注意DMA的传输方向别弄错了,到底是PERIPHERIAL到MEMORY还是MEMORY到PERIPHERIAL或者说是Memory到Memory要配置正确。尤其是在用CubeMx配置时,这里有个默认配置是PERIPHERIAL到MEMORY。如果说你的真实意图根本不是从PERIPHERIAL到MEMORY,而你无意中使用了这个默认配置,结果可想而知,DMA传输根本没法正常运行。我前两天就被这个地方折腾过,用定时器触发DMA输出任意周期性的PWM波,白白多耗了近2个小时。此时,在调试环境里想强制使能相关DMA Stream的传输都不行,整个就不工作。

类似配置方面的小细节要多加注意,忽略了那些往往会累死人。

3、DMA传输作用范围问题

前面将DMA传输类比成发快递,发快递时,快递公司一般也没法无处不到,那DMA传输也有同样的问题,各个DMA模块往往有各自的服务范围。比方以下图STM32F4的一个框图为例。DMA1可以轻松访问右边黄色标注出来的外设,DMA2可以访问左边分数标注出来的各个外设。如果我们在程序里的DMA配置部分,将DMA1的源端或目的端安排为左边的粉色标注出来的外设、或者将DMA2的源端/目的端安排为右边的黄色标注出来的外设,结果一定会让你失望。因为你期望它访问它到达不了的地方。

这个地方比较隐蔽,因为我们在代码里只是根据DMA请求自行指定源端和目的端,有时会忽视所用DMA的服务范围。前面提过,各个STM32系列参考手册里DMA章节部分都有明确的基于各路DMA传输流的DMA请求事件源的描述和展示,但并未指定基于各个DMA请求的源端或目的端。所以我们在基于某个DMA请求来自指定源端或目的端时,一定注意你安排的源/目的端是不是该DMA可以到达的地方,具体要结合手册中功能框图和总线访问架构图。

比方说,下图是STM32F7系列一个总线访问框架图。不难看出,DMA1是访问不了AHB1外设和AHB2外设的。当然,DMA2访问AHB1外设和AHB2外设又没有问题。

再比方,下图是STM23H7系列一个总线访问框架图,其中BDMA是没法访问D1域或D2域的外设及内存的。D2域的DMA1/DMA2没法访问D1域中的DTCM/ITCM。D1域中的MDMA没法访问D2域中的AHB2外设。

关于这些总线框架性的东西,在我们的STM32应用中也要多加关注。比方有时在做通信数据传输时发现,使用中断没问题,用DMA就失败。这时不妨查看下DMA访问的外设或内存区域到底是不是它所能访问得到地方,如果不是就需要适当调整下。

4、跟DCache有关的问题

该问题往往跟我们使用带cache的M7内核的STM32F7或STMH7系列芯片有关,使用DMA传输时有时会遇到DMA访问到的数据不是实时的正确数据。这往往可能是因为DMA要访问的内存区域,跟CPU是共享的,同时又开启了相关区域的D-Cache属性,即CPU访问该内存区域数据时使用D-Cache,将内存数据拷贝到D-Cache。之后,CPU访问相关数据时往往只在Cache里进行。

比如下面的一个基于STM32F7芯片的经典示例。首先CPU从flash里拷贝128字节常量数据到片内SRAM,然后通过DMA将SRAM里的这128字节数据拷贝进DTCM内存区。最后通过CPU将DTCM里的数据跟FLASH里的原始数据进行比较,这时会发现比较结果是二者内容根本不一致。

这是因为开启了SRAM的回写的Cache属性,第一次将数据从flash拷贝进SRAM过程中,数据还没有真正写进SRAM,还只是放在了Cache。当我们通过DMA将SRAM相关区域的数据拷贝进DTCM内存区时,并没有将真正的来自FLASH区的数据拷贝过去,导致最后的数据比较失败。

像这种情况下,我们可以有几种方案来解决这个问题:
1、在做将数据从SRAM拷贝到DTCM区之前,先做个D-Cache的清除操作【SCB_CleanDCache()】,将D-Cache里的数据写回到实际存储区SRAM里。

2、我们可以通过MPU设置SRAM区域的MPU属性,将其回写的Cache属性【writeback】调整为透写的Cache属性【writethrough】。

3、配置SRAM的MPU属性为shareable共享属性,令CPU访问它时不使用D-Cache.

4、将所有涉及到具有Cacheable可缓存属性的存储区域,都使用透写策略。这点可以通过配置M7内核相关控制寄存器位实现。

再举个实例,使用STM32F7芯片做UART的通信数据接收,UART接收到数据后触发DMA,DMA将数据从UART_DR寄存器拷贝到片内SRAM,CPU再从相应的SRAM区取走数据送到某LCD显示设备显示输出。这时,你很可能会发现一个奇怪的现象,显示设备输出的数据永远都时第一次接收到的数据,不管UART的发送方任何改变发送数据,显示出来的数据就是不变,只是跟第一次发送出来的数据相比是正确的。这是怎么回事呢?

原因是因为开启了SRAM的D-Cache属性,CPU第一次从SRAM读取数据后,同时又将数据放到D-Cache里,后面再来读取SRAM相应地址数据时并没有前往SRAM,而是直接区D-Cache里提取数据,从而导致每次显示出来的数据总是第一次接收到的数据,尽管UART那边后续接收的数据在不停变化,但并没有对D-Cache里的数据做同步更新。

这时我们可以在CPU读取SRAM数据前做个D-cache的清除操作,让实际存储器数据与D-Cache里数据同步更新,或者做D-Cache的失效操作,让CPU无视D-cache直接从SRAM区读取数据,或者说通过MPU配置禁用该SRAM区的Cache属性。当然,最终你选用哪种策略,得结合你的实际应用来定。


推荐阅读

史海拾趣

HALO Electronics公司的发展小趣事

鸿展光电(GPO)公司的发展故事

故事一:初创与定位

深圳市鸿展光电有限公司(GPO)成立于2009年6月12日,起初便定位于高端显示技术的研发与生产。公司创始人凭借对电子行业未来趋势的敏锐洞察,决定专注于玻璃盖板(CG)、外挂式液晶显示模组(LCM)、外挂式触控模组(TP)等产品的研发与生产。在成立初期,面对激烈的市场竞争,鸿展光电凭借高质量的产品和优质的服务,逐步在行业内站稳脚跟。随着技术团队的不断壮大和产品的持续优化,公司迅速成长为一家集研发、生产、销售于一体的国家级高新技术企业。

故事二:技术突破与创新

在发展过程中,鸿展光电始终将技术创新视为企业发展的核心动力。公司不断加大研发投入,积极引进国内外先进技术和设备,致力于提升产品的技术含量和附加值。特别是在内嵌式触控显示一体化模组(INCELL、ONCELL)以及新一代触控显示模组(MiniLED、MicroLED、AMOLED)等领域,鸿展光电取得了多项关键性技术突破,并成功将这些技术应用于实际生产中,进一步巩固了公司在行业内的领先地位。

故事三:市场拓展与品牌建设

随着产品线的不断丰富和技术实力的不断提升,鸿展光电开始积极拓展国内外市场。公司通过参加各类行业展会、举办技术交流会等方式,不断提升品牌知名度和影响力。同时,鸿展光电还积极与国内外知名企业建立合作关系,共同开发新产品、新技术,实现互利共赢。这些举措不仅为公司带来了更多的商业机会,也进一步提升了公司的市场地位和品牌价值。

故事四:产能扩大与效率提升

为了满足日益增长的市场需求,鸿展光电在扩大产能方面进行了不懈努力。公司通过优化生产流程、引进先进生产设备、提升员工技能水平等措施,不断提升生产效率和产品质量。同时,公司还加强了供应链管理,确保原材料的稳定供应和成品的及时交付。这些举措不仅有效提升了公司的产能和竞争力,也为公司的长期发展奠定了坚实基础。

故事五:社会责任与可持续发展

在追求经济效益的同时,鸿展光电也积极履行社会责任,推动企业的可持续发展。公司注重环境保护和节能减排工作,通过采用环保材料和节能技术、加强废水废气处理等措施,降低生产过程中的环境污染和资源消耗。此外,鸿展光电还积极参与公益事业和社会活动,为社会做出积极贡献。这些举措不仅提升了公司的社会形象和声誉,也为企业的长期发展注入了新的动力。

台湾凌通(Generalplus)公司的发展小趣事
可能是光线阈值设置不当,导致指示灯在光线变化时无法正确响应。可尝试调整光敏元件的灵敏度或重新设置光线阈值。
B&F;公司的发展小趣事

随着航空技术的不断发展,B&F公司开始积极探索与其他行业的跨界合作。例如,公司与一家知名电子公司合作,共同研发了一款新型飞行控制系统。这款系统采用了最先进的电子技术和算法,大大提高了飞机的操控性能和飞行效率。通过这种跨界合作,B&F公司不仅拓展了业务领域,还为公司带来了更多的发展机遇。

Global Navigation Systems公司的发展小趣事
远程无线防盗报警系统可以通过智能家居系统平台进行集成。通过智能家居系统的控制中心和通信协议,可以将防盗报警系统与家中的其他智能设备(如灯光、窗帘、空调等)进行联动控制。例如,当防盗报警系统触发报警时,可以自动关闭家中的门窗、开启灯光等,以吓退入侵者或提醒家庭成员注意安全。同时,用户还可以通过智能手机等终端设备远程查看和控制家中的安全状况和设备状态。
捷嘉电子(Chequers Electronic)公司的发展小趣事

随着市场需求的不断变化,捷嘉电子意识到只有不断创新才能保持竞争力。于是,公司投入大量资源进行技术研发,特别是在智能控制器PCBA制造及智能产品研发方面取得了显著成果。其中,公司研发的一款新型智能家居控制器,以其卓越的稳定性和易用性受到了市场的热烈欢迎。这款产品的成功,不仅提升了捷嘉电子的品牌知名度,也为其后续发展奠定了坚实的基础。

Elec & Eltek公司的发展小趣事

随着市场需求的不断变化,Elec公司意识到单一产品已无法满足客户的多样化需求。于是,Elec公司开始寻求与同行业公司的合作。在一次行业交流会上,Elec公司的代表与Eltek公司的代表相识,并发现双方的产品具有很强的互补性。经过多次深入交流,Elec公司与Eltek公司决定开展合作,共同研发具有更高性能、更广泛应用的电子产品。这一合作不仅增强了双方的竞争力,也为客户提供了更多样化的选择。

问答坊 | AI 解惑

模拟电子基本电路集35/90

首 页 | 资料下载 | VIP下载 | 技术中心 | 电子家园论坛 | 资料共享 | 问题反馈 www.cndzz.com 你的位置: 首页-> 基本电路-> 模拟电路 模拟电子基本电路集35/90 …

查看全部问答>

给讲一下自举电容好吗?

给讲一下自举电容好吗?谢谢 !…

查看全部问答>

数字多用表自动化校准系统

仪器计量校准是恢复、保持设备性能指标,保证测量准确可靠的技术手段,所以需要在国家授权的计量校准机构定期的进行校准。但是随着计算机技术、大规模集成电路技术和通信技术的飞速发展,仪器技术领域发生了巨大的变化,从最初的模拟仪器发展到现在 ...…

查看全部问答>

74ls164.IEC是什么?

我在proteus中找不到74ls164,只是有74ls164.IEC,不知道怎么用?…

查看全部问答>

家用医疗电子半导体市场分析

 维持身体健康一定得要仰赖医生吗?随着科技进步,医疗行为正从医院走出,转而进入互联网家庭,让现代人的就医习惯和医疗设备市场正面临巨大转变。  21世纪最具发展潜力的明星产业   根据市场研究机构Databeans预测,至2011年医疗电子用半导 ...…

查看全部问答>

wince.net 5.0 和wince 5.0有什么区别?

wince.net 5.0 和wince 5.0有什么区别?…

查看全部问答>

关于89S52串口发送波形问题

   我用89s52串口输出一个波形,但是一旦接至另外一个模拟电路部分,该波形就变成尖峰形状了    我的想法是用35M左右的载波调制该串口波形,然后经功率放大等电路发送出去。但是现在串口波形一接至高频部分电路,就不再是原来 ...…

查看全部问答>

磁带库,磁带机应用开发

小弟想写个磁带库,磁带机的管理程序,类似于veritas,TSM 这些备份软件管理磁带的方式,请问需要哪些方面的知识,如何与磁带库建立联系,带库有没有提供API呢?…

查看全部问答>

国赛的赞助商会规定芯片选型?

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 听人家说,好像因为比赛的赞助商不同可能会规定使用特定型号的芯片或是单片机。不知道大家是怎么看的?有人赐教下具体的情况吗?  …

查看全部问答>