STM32-快速上手DMA

本文详细介绍了STM32的DMA配置步骤,包括概述、配置过程、具体配置实例,涉及DMA通道设置、时钟使能、参数初始化、外设DMA使能、传输启动等关键环节,提供代码示例供参考。
摘要由CSDN通过智能技术生成

关于STM32的DMA的详细介绍见前文,另外可以参考这篇通俗易懂的文章

1.概述

DMA传输是内核授权总线给DMA控制器,把数据传输的工作交给DMA控制器来进行管理的一种数据传输方式。关键的参数是需要指定数据源地址、目标地址、传输的数据个数。

2. 配置步骤

2.1 抽象的配置过程

DMA通道x的配置步骤如下:

1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将
是数据传输的源或目标。
2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数
据将从这个地址读出或写入这个地址。
3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。
5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外
设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。

2.2 具体的配置过程

以串口DMA发送为例,串口1的发送在ADC1的通道4上。

  • (1)使能DMA时钟
    • DMA1和DMA2的时钟源均为AHB
    • void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
  • (2)复位DMA通道寄存器
    • void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
  • (3)初始化所用到的DMA通道参数
    • void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);

这个函数主要配置前文《STM32-一文搞懂DMA》提到的DMA通道x配置寄存器(DMA_CCRx)(x = 1…7),其中参数结构体如下

typedef struct
{
  uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */

  uint32_t DMA_MemoryBaseAddr;     /*!< Specifies the memory base address for DMAy Channelx. */

  uint32_t DMA_DIR;                /*!< Specifies if the peripheral is the source or destination.
                                        This parameter can be a value of @ref DMA_data_transfer_direction */

  uint32_t DMA_BufferSize;         /*!< Specifies the buffer size, in data unit, of the specified Channel. 
                                        The data unit is equal to the configuration set in DMA_PeripheralDataSize
                                        or DMA_MemoryDataSize members depending in the transfer direction. */

  uint32_t DMA_PeripheralInc;      /*!< Specifies whether the Peripheral address register is incremented or not.
                                        Th
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值