STM32H7 BDMA应用示例

本文介绍了如何在STM32H743芯片上使用BDMA从GPIO读取数据到内存,并通过LPTIM触发DMA传输。关键点包括理解STM32H7的时钟和总线架构,确保BDMA能够访问正确的内存区域,配置DMAMUX以连接LPTIM2事件和DMA请求,以及正确设置GPIO和LPTIM2参数。通过STM32CubeIDE和STM32Cube库,实现了简单有效的BDMA传输解决方案。
摘要由CSDN通过智能技术生成

5d5a1f08ede6aaf6245a8ad4245bbba7.jpeg

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

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

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

STM32H7系列微控制器支持DMA(Direct Memory Access)功能,用于快速地在内存和外设之间传输数据。配置BDMA(Base DMA Controller)传输完成中断的过程主要包括以下几个步骤: 1. **包含头文件**: 首先,在C代码中包含相关的头文件,如`stm32h7xx_hal_dma.h` 和 `stm32h7xx_hal_rcc.h`。 ```c #include "stm32h7xx_hal_dma.h" #include "stm32h7xx_hal_rcc.h" ``` 2. **初始化DMA**: 使用HAL库函数对DMA控制器进行初始化,并配置好需要使用DMA实例(比如DMA1通道1)。 ```c DMA_HandleTypeDef hdma_periph_to_memory; RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DMA1, ENABLE); hdma_periph_to_memory.Instance = DMA1_Channel1; ``` 3. **创建传输描述符**: 创建一个DMA descriptor结构体,定义源地址、目的地地址以及传输模式等信息。 ```c DMA_HandleTypeDef_DMATxDescTypeDef dma_desc; dma_desc.Address = (uint32_t)your_peripheral_buffer; // 源或目的地地址 dma_desc.PeriphInc = DMA_PINC_DISABLE; // 内存地址不变 dma_desc.MemInc = DMA_MINC_ENABLE; // 外设地址递增 dma_desc-dirbit.DstDataSize = DMA_DATA_SIZE_Byte; dma_desc-dirbit.MemDataSize = DMA_DATA_SIZE_Byte; ``` 4. **配置链表和环形链表**: 如果有多个传输任务,可以设置多个传输描述符并链接在一起形成一个链表。例如,设置下一个描述符地址: ```c dma_desc.Next = &hdma_periph_to_memory.DMA descriptors[1]; ``` 确保最后一个描述符指回第一个描述符,形成环形链表。 5. **设置传输完成标志**: 将中断处理程序的标志位连接到正确的中断请求上,比如使用`DMA_IT_TC`(Transfer Complete)标志,表示传输完成后引发中断。 ```c dma_desc_IRQn = DMA1_Channel1_TxCplt_IRQn; hdma_periph_to_memory.Init.Request = DMA_REQUEST_1; // 这里替换为实际的中断请求号 ``` 6. **配置中断**: 对DMA控制器本身进行初始化,包括开启中断。 ```c hdma_periph_to_memory.Instance->CCR |= DMA_CCR_EN | DMA_CCR_INTEN; ``` 7. **注册中断处理函数**: 在系统中断管理中注册你的中断处理函数。 ```c HAL_NVIC_Register ISR_handler(DMA1_Channel1_TxCplt_IRQn, Your_DMA_IRQHandler, 0); ``` 8. **启用DMA**: 最后,启用DMA,开始数据传输。 ```c HAL_DMA_Start(&hdma_periph_to_memory, (uint32_t)&your_peripheral_register, (uint32_t)&your_memory_address, 1); // 传输块大小 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值