|
有人使用STM32G4系列芯片做产品开发,想实现如下需求: 定时器每触发一次,DMA分别向GPIOA、 GPIOB、 GPIOC 、GPIOD的相应管脚发送一个高低电平的控制。注意,是针对不同GPIO端口的操作。 简单点说就是基于每次的定时器事件并行修改属于不同GPIO模块的输出管脚电平。结合他目前选用的芯片,我前后考虑过几种方案,都不太好实现,或者说实现起来不太流畅。 后来,想到STM32G4芯片内部的LPTIMER,基于它的定时器事件并借助于DMAMUX模块产生DMA请求来完成。准确地说每次基于同一定时器事件产生多个DMA请求,各请求申请DMA来修改相应GPIO寄存器,这里假设是GPIOx->BSRR寄存器。这个思路是可行的,就此简单分享下,供参考。
下面的测试验证使用STM32G474 Nucleo 板来完成。简单地实现属于不同GPIO模块的管脚电平翻转,它们分别是PA9、 PB3、 PC3、 PD2管脚。
现在开始使用STM32CubeMx进行相关配置,下面只摆放关键配置的截图。 下面是LPTIM的配置。这里的配置允许波形输出,其实是否做波形输出不是必须的。调试时有个实际输出方便点。
下面是有关DMA的配置。LPTIM输出信号的边沿事件用来触发DMA请求。一共生成4个DMA请求,均来自LPTIM的定时器输出边沿事件,上沿或下沿都可以。这里选择LPTIM输出的上沿事件。这四个DMA请求除了申请到的DMA通道不一样外,其它配置都一样。换言之,一个LPTIM事件同时产生4个DMA请求。此处DMA是配置在循环模式,具体应用时可按需配置。
基于STM32CubeMx完成初始化配置后,添加必要的用户代码。
下面的API函数都是源于STM32HAL库,根据函数名即可知道做什么用的。
稍作调试后即可查看输出结果。下面截图中四路输出波形,上面三路是三个不同GPIO的翻转输出,最底下的第四路是LPTIM的输出波形。【当时示波器也就4个通道】
不难看出,在每次LPTIM输出的信号上沿处触发多路DMA传输,同时修改各个GPIO管脚的输出电平。 下面截图是我关闭LPTIM的实际输出后,将上面用于LPTIM输出示波器通道接到另外1路GPIO输出脚的最终输出波形。
不难看出,上面的实现还是比较简单的。当然,前提是你先得有相关思路和方向,否则一时半会也无从下手。我们在STM32应用时可以根据芯片资源灵活处理,看菜吃饭。 分享就到此打住,愿今日一瞥哪天也能帮到你,或灵感或思路或直接挪用。祝君好运~! |
实战经验 | LAT1578 SAU对NSC分区的影响
经验分享 | STM32G474 HRTIM Triggered-half模式实现两相交错电源180°相位同步方案
STM32大神笔记,超详细单片机学习汇总资料
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
实战经验 | 基于STM32G474的三相LLC+SR PWM产出方案
STM32固件库分享,超全系列整理
经验分享 | STM32G4 双BANK Flash模式页擦除话题
经验分享 | STM32G4片内FLASH擦写实验笔记
经验分享 | STM32G4系列是否支持位带操作
STM32系列芯片之间相互移植注意事项
微信公众号
手机版