近日,有人使用STM32C0系列芯片做产品开发,当尝试使用DMA搬运内存数据到GPIO时,发现怎么也没法成功。从配置上来回检查了很多遍,也没有发现有什么问题。令人不解和郁闷的是,别人使用其它STM32系列实现相同的功能,却玩得风生水起。
需求是这样的,选择TIM3的更新事件触发DMA,然后让DMA将内存数据搬运到GPIOA的BSRR寄存器,以修改指定GPIO管脚的电平,最终实现编码输出。
需求很通用,我也顺便看了他的CubeMx配置和实现代码,的确没发现什么不对劲的地方。所选的TIMER的确可以申请DMA,DMA配置为从内存到外设,字到字的传输方式;也不会有对齐方面问题。STM32C0系列属于ARM cortex-M0+产品,芯片架构也不像STM32H7或其它高性能STM32系列那么复杂,也没有Cache导致的数据一致性的问题。
可能是什么原因呢?
目前所选TIMER可以申请DMA是没啥好怀疑的,只是DMA访问的目的和源端是手动给定,难道这个给定的过程中出现了想当然?准确地说,难道目前所给定的目的端或源端中存在所选DMA到不了的地方?
此时的最佳做法就是打开芯片参考手册的存储与总线框图或数据手册中功能块图来确认。
下图是来自STM32C0参考手册的系统框图:
图中红色框代表DMA,它经DMA BUS,经BUS matrix可以访问SRAM是显而易见的。GPIOx是通过IOPORT与内核相连。看到这里,可以初步断定GPIOx是内核
专属访问外设,不太可能由DMA经DMA bus,再经matrix路由到system bus,再“穿过”内核经IOPORT访问GPIOx。
到底是不是这样呢?我们有必要先看看手册里对此处System bus和DMA bus的解释。
System bus (S-bus)
This bus connects the system bus of the Cortex®-M0+ core (peripheral bus) to a bus matrix that manages the arbitration between the core and the DMA.
我理解的是:
Cortex-M0+ core 自己的 system bus / peripheral bus,经过这个S- bus 连接到 Bus matrix,而bus matrix 在 core 和 DMA 之间实施访问请求仲裁,经仲裁后去访问图中Bus Matrix右边的各种外设或存储区。
客观地说,从S-Bus的功能定义看,没法用来判断DMA能否访问GPIOx。或者说有没有可能DMA经BUS-Matrix,再经S-bus去访问GPIOx。我们不妨接着看看DMA BUS的解释。
DMA bus
This bus connects the AHB master interface of the DMA to the bus matrix that manages the access of CPU and DMA to SRAM, flash memory and AHB/APB peripherals.
基本意思就是,DMA bus 将 DMA 的 AHB 主接口连接到 bus matrix 上;这个 bus matrix 负责管理 CPU 和 DMA 对 SRAM、Flash 以及 AHB/APB 外设的访问。
到此,DMA 的可访问对象应该是被明确了:
SRAM
Flash memory
AHB peripherals
APB peripherals
现在只需进一步确认,此时的IOPORT及GPIOx属于AHB/APB peripheral吗?或者说与相关BUS相连吗?我们可以借助数据手册的总线功能框图来看。
从上面框图不难看出,各GPIOx模块是通过IOPROT与内核相连,而IOPORT并没有与内核外部的AHB/APB总线相连,不属于AHB/APB外设,应该说IOPORT是内核对GPIOx的专属访问总线。
另外,我们也可以从芯片手册另外的地方找到佐证,IOPORT是单独用于内核访问GPIOx的总线,与AHB/APB总线是并列关系。见下图。
最终结论就是,DMA没法访问本芯片的GPIOx,如果此时期望DMA完成从内存到GPIOx的数据搬运是做不到的。显然,这个结论不是普适的,具体要看不同系列芯片的系统架构。
聊到这里,有人或许会说,当看到前面参考手册的那个存储与系统总线框图时就应该可以判断出DMA访问不了GPIOx。对于有经验的STM32开发者来说,的确从这里可以大致快速判断。不过经验也不是一天形成的,也不总是可靠。
在这个AI时代,遇到问题时大家可能会去咨询下AI。如果就这个问题咨询AI,目前大概率它会给你一个错误的答案。
我在整理本文时有意咨询了AI,因为我有个猜测,咨询者在咨询我之前,有可能咨询过AI,就想顺便看看AI会怎么回答。
我跟AI描述基本问题后,开门见山地问它这个地方能否被DMA访问,同时给它提供了前面贴出来的系统功能框图和SYSTEM BUS及DMA BUS的说明信息。途中我两次质疑它的结论,它总是坚持此处DMA可以访问GPIOx的观点,我甚至让它将DMA BUS定义看了两遍,直到我给它提供如下信息时它才改口。下图来自芯片数据手册。
AI最终给出的结论是:“当前更偏向“不支持或至少未被架构证明支持DMA可以访问GPIO”。呵呵~!差不多了,毕竟我们要原理判断结合动手验证。
OK,今天的话题就分享到这里,是小问题、小细节。不过,再细的砂砾在脚底也磨脚、再小的蚁穴可以溃堤。愿君厚积薄发,志在必得!
最后顺便分享一个有关STM32 EdgeAI应用培训的信息,是原厂STM32 Edge AI应用工程师主持。具体是本月20日【周三】在深圳举行,一整天时间。使用为Edge AI而生的STM32N6系列芯片,有原理介绍,有动手操作,机会难得。有兴趣的可以尝试报名参加,提前做好准备。
178