[应用相关] DMA的配置流程你清楚吗?

[复制链接]
 楼主| 598330983 发表于 2023-4-26 22:08 | 显示全部楼层 |阅读模式
下面是使用HAL库配置DMA的基本流程:
  • 配置DMA传输通道
首先,需要使用HAL库提供的HAL_DMA_Init函数初始化DMA传输通道,然后配置传输通道的参数,例如传输方向、数据宽度、传输模式、传输速率等。这些参数可以通过DMA_HandleTypeDef结构体进行设置。
  1. DMA_HandleTypeDef hdma;
  2. /* Initialize DMA */
  3. hdma.Instance = DMA1_Stream7;
  4. hdma.Init.Channel = DMA_CHANNEL_1;
  5. hdma.Init.Direction = DMA_MEMORY_TO_PERIPH;
  6. hdma.Init.PeriphInc = DMA_PINC_DISABLE;
  7. hdma.Init.MemInc = DMA_MINC_ENABLE;
  8. hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  9. hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  10. hdma.Init.Mode = DMA_NORMAL;
  11. hdma.Init.Priority = DMA_PRIORITY_HIGH;
  12. hdma.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  13. hdma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  14. hdma.Init.MemBurst = DMA_MBURST_SINGLE;
  15. hdma.Init.PeriphBurst = DMA_PBURST_SINGLE;

  16. if (HAL_DMA_Init(&hdma) != HAL_OK) {
  17.   /* Initialization Error */
  18.   Error_Handler();
  19. }
  • 配置DMA中断
如果需要使用DMA传输完成后触发中断,则需要使用HAL库提供的HAL_DMA_RegisterCallback函数注册DMA中断处理函数,例如:
  1. /* Register DMA callback function */
  2. HAL_DMA_RegisterCallback(&hdma, HAL_DMA_XFER_CPLT_CB_ID, DMA_TransferComplete);
其中,DMA_TransferComplete是用户定义的中断处理函数。
  • 关联DMA通道和外设
在DMA传输过程中,需要将DMA通道与外设关联起来,以便DMA传输数据到外设。可以使用HAL库提供的__HAL_LINKDMA宏将DMA通道与外设关联起来,例如:
  1. /* Associate the DMA handle with the I2C1 handle */
  2. __HAL_LINKDMA(&hi2c1, hdmatx, hdma);
其中,hi2c1是外设的句柄,hdmatx是DMA通道的句柄。
  • 启动DMA传输
最后,使用HAL库提供的DMA传输函数启动传输,例如:
  1. if (HAL_I2C_Mem_Write_DMA(&hi2c1, address, reg, 1, data, 1) != HAL_OK) {
  2.   /* Transfer Error */
  3.   Error_Handler();
  4. }
其中,HAL_I2C_Mem_Write_DMA函数会将数据缓存区的数据通过DMA传输到指定地址中。

这是基本的DMA配置流程,需要根据具体的应用场景和硬件平台进行调整和优化。在配置DMA传输时,还需要注意DMA缓存区的设置、DMA传输长度的限制、中断处理函数的编写等问题。

Pulitzer 发表于 2024-6-11 07:06 | 显示全部楼层

通过访问寄存器来控制I2C1工作时钟的开启。
童雨竹 发表于 2024-6-11 09:02 | 显示全部楼层

这种方法可以使散热体积和表面面积增大两倍多
Wordsworth 发表于 2024-6-11 10:05 | 显示全部楼层

I2C1工作时钟源选择;I2C1模块工作时钟的开启使能。
Clyde011 发表于 2024-6-11 11:08 | 显示全部楼层

STM32芯片中有多个工作时钟源的外设很常见
公羊子丹 发表于 2024-6-11 12:01 | 显示全部楼层

功率开关漏极(或集电极)
万图 发表于 2024-6-11 13:04 | 显示全部楼层

CPU借助于APB总线访问相关寄存器达到对I2C1工作模块的控制
Uriah 发表于 2024-6-11 14:07 | 显示全部楼层

ART2固定使用PCLK时钟,只有开启和关闭的问题,不存在其它时钟源选择
帛灿灿 发表于 2024-6-11 16:03 | 显示全部楼层

控制模块的时钟仍然由外设时钟PCLK提供
Bblythe 发表于 2024-6-11 17:06 | 显示全部楼层

USART1可以有多个时钟源
周半梅 发表于 2024-6-11 19:02 | 显示全部楼层

要把纹波电流平均分布
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

5573

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部