|
有人使用STM32H7系列芯片的LPTIM事件触发DMAMUX申请BDMA传输,发现没法产生BDMA传输完成中断。我这里使用STM32H743开发板演示一下实现过程。具体实现是这样的: 使用片内LPTIM5的超时唤醒事件,触发DMAMUX模块,申请BDMA的传输,让BDMA将存于SRAM4的内存数据搬运到GPIO,并通过示波器观察GPIO_G0脚的高低电平翻转输出。大致功能流程如下图所示:
现在使用STM32CubeMx开始配置。下面是片内LPTIM5的基本配置:
下面是BDMA相关的配置,BDMA的请求由DMAMUX的generator产生,而DMAMUX generator又由LPTIM5的唤醒事件触发。BDMA的传输方向是从内存到外设,目的端及源端的访问宽度都是两字节的半字。 为了便于查看演示效果,我将BDMA配置在循环模式。
做好各种配置后,创建基于STM32HAL库的c代码工程。此处测试时所用IDE是ARM keil v6。下面代码定义了一个8元素的内存数组,用于BDMA的内存访问。另外声明并定义了BDMA channel0的传输完成中断的回调函数,同时定义了用于在回调函数里自增的一个32位变量。
在main()里添加的用户代码:
基于上面配置和用户代码,编译调试OK后,可以看到GPIOG_PIN0脚呈现高低电平的方波输出,符合预期。
到此基本功能就实现了,现在看看BDMA的传输完成中断能否发生。 在HAL库的 API函数HAL_DMA_Start_IT()里是开启了BDMA的传输完成中断的。但是我发现在CubeMx创建的工程的stm32h7xx.it.c文件里根本就看不到有关BDMA的中断服务函数,另外在MX_BDMA_Init()初始化函数里也没有看到有关BDMA中断的NVIC配置。这样看来,此时显然没法响应BDMA的传输完成中断,怎么会缺少这些东西呢? 再回头看cubeMx那边有关BDMA的配置:
这个地方没有BDMA相关中断的使能配置,难怪创建工程后没有相应的NVIC配置及中断服务函数。感觉这里是CubeMx的一个小bug。 怎么办呢?自己手动添加BDMA channel0的相关中断代码吧。 为了方便省事,我先在CubeMx那边基于ADC3配置了一个BDMA的通道channel 1,在ADC3配置那里使能BDMA channel 1的相关中断,然后我在代码那边再基于该配置修改成BDMA channel 0的。
在CubeMx这边做了上述配置后,再创建工程。此时我们可以在工程代码的MX_BDMA_Init()初始化函数里看到有关BDMA通道的NVIC配置了,不过此时是针对BDMA channel 1的,我将它改为Channel 0即可。
另外,我们在stm32h7xx.it.c文件里也可以看到有关BDMA channel 1的中断服务函数,我们将其修改为对应Channel 0的即可。
在前面介绍用户代码时提到过,我准备了BDMA传输完成中断的用户回调函数void BDMA_cb_Handle( DMA_HandleTypeDef *hdma)。当我手动完成了上述代码调整后就可以发现BDMA Channel 0的传输中断能得到响应了。
OK,今天的分享交流就到这里,供有心人参考。祝君好运~! 文章出处:茶话MCU |
经验分享 | STM32H7系列ADC DMA传输异常案例分享
经验分享 | STM32H7 MDMA 与通用DMA的联动传输示例
STM32H750 基于 Keil 制作 QSPI 外部 Flash 下载算法 全流程实操指南
STM32H743 BDMA+LPTIM+LPUART应用演示
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
经验分享 | STM32H7 SPI NSS 脉冲模式灵活应用:解决外置 ADC 通信干扰问题
经验分享 | STM32H7 双核调试配置:STM32CubeIDE 下 M7+M4 协同调试实操
经验分享 | STM32H7 TouchGFX 花屏速解:更换 HyperRAM 后 latency 值适配实操
经验分享 | STM32H743 BDMA+LPTIM+LPUART应用演示
经验分享 | STM32H7Sx MCE 加密解密:外部存储安全防护全解析
微信公众号
手机版