STM32H7 BDMA应用示例

STM32H7 BDMA应用示例_第1张图片

有人利用STM32H743系列芯片做开发,他想使用片内BDMAGPIO的数据读到内存,并通过LPTIM触发DMA传输时却遇到点麻烦,发现总是实现不了。这里我简单介绍下实现过程,并做些提醒。

STM32H7系列的时钟系统以及内部总线、功能框架相比其它M3/M4内核的STM32芯片要负责不少。整个芯片根据运行时钟高低及总线架构大致分为3个区域,其中BDMA位于区域3D3域。

STM32H7系列参考手册中有下面的一副系统功能框图:

STM32H7 BDMA应用示例_第2张图片

我们在上图的右下角可以看到BDMA,而且BDMA只能访问AHB4\APB4总线上的外设和SRAM4及备份SRAM. 另外,我们还可以从手册上进一步了解到,GPIO外设都是挂在AHB4总线上的。

STM32H7 BDMA应用示例_第3张图片

结合上面介绍可知,现在既然使用BDMA,内存RAM就不能选择SRAM4和备份RAM以外的区域,否则BDMA鞭长莫及而访问不到他们。这是要注意的地方。

另外,这里需要用到LPTIM2的输出事件来触发DMA请求,要使用DMAMUX并完成相关配置。

STM32H7 BDMA应用示例_第4张图片

配置LPTIM2让它可以产生周期性输出事件即可,实际参数视具体应用而拟定。

STM32H7 BDMA应用示例_第5张图片

现在对BDMA做些配置,如下图示。LPTIM2的每次输出事件申请一个DMA请求。

STM32H7 BDMA应用示例_第6张图片

另外,我还配置了GPIOC的几个管脚,以便做测试。这里就不贴配置截图了。

把时钟系统配置完后就可以基于STM32CubeIDESTM32Cube库的工程。

再添加几行用户代码就可以着手测试。添加的函数代码分别是关于开启DMAmux、启动DMA传输和启动LPTIM2的操作

LPTIM_HandleTypeDef    hlptim2;

DMA_HandleTypeDef    hdma_bdma_generator0;

STM32H7 BDMA应用示例_第7张图片

这里我把GPIO_INData[]数组地址指定到了BDMA可以访问到的SRAM4.,它对应STM32CubeIDE链接文件里的RAM_D3。

STM32H7 BDMA应用示例_第8张图片

STM32H7 BDMA应用示例_第9张图片

最后验证结果,我们可以看到BDMA从GPIOC端口读到的数据。

STM32H7 BDMA应用示例_第10张图片

整体来讲,实现起来比较简单,重点注意BDMA可以访问哪些地方弄清楚,在指定内存地址这个地方不同IDE环境操作上略有差异。再就是要用到LPTIM周期性事件申请DMA请求来实现传输。

好,今天的话题就聊到这里,供有需要的人参考。

*************************

往期话题阅读链接:

1、让CDC类USB设备批量接收64字节以上数据

2、STM32CubeMx的配置顺序与DMA传输异常

3、远程修改STM32 TIMER占空比的方案续1

4、一使能定时器中断就立即进中断?

5、STM32H7芯片SDRAM地址问题

STM32H7 BDMA应用示例_第11张图片

你可能感兴趣的:(java,嵌入式,stm32,python,spring)