STM32的 DMA(直接存储器访问) 详解

STM32的DMA(Direct Memory Access,直接存储器存取)是一种在单片机中用于高效实现数据传输的技术。它允许外设设备直接访问RAM,不需要CPU的干预,从而释放CPU资源,提高CPU工作效率,本文基于STM32F429、Hal库详细分析DMA的特性与使用。

1.DMA的特性

(1)STM32F429拥有两个DMA控制器(DMA1和DMA2),DMA1 控制器 AHB 外设端口不连接到总线矩阵,因此,只有 DMA2 数据流能够执行存储器到存储器的传输,外设包括片内外设和片外外设。

片内外设:例如GPIO(通用输入输出端口)、USART(通用同步/异步收发器)、I2C(Inter-Integrated Circuit,一种串行通信总线)、SPI(Serial Peripheral Interface,串行外设接口)等。这些外设通过DMA控制器,可以直接与内存(如SRAM、Flash等)进行数据传输。

片外外设:这是指通过外部接口连接到STM32芯片的设备,例如DHT11温度传感器、MQ2烟雾传感器等。这些设备通过相应的接口(如ADC、SPI等)与STM32连接,然后通过DMA控制器进行数据传输,要确保片外外设支持DMA功能才可以用DMA传输数据。

存储器到存储器的传输意味着DMA控制器可以直接从一个内存区域(如RAM的一个数组或缓冲区)读取数据,并将这些数据写入到另一个内存区域(同样是RAM的另一个数组或缓冲区)。这种传输模式在多种应用中都非常有用,比如:

  1. 数据移动:如果你需要将一段数据从一个位置移动到另一个位置,使用DMA可以节省CPU时间,因为CPU不需要参与数据的传输过程。

  2. 数据处理:在图像处理、音频处理或任何需要处理大量数据的应用中,你可能需要将数据从一个缓冲区读取出来,进行一些处理(如滤波、FFT等),然后将结果写回另一个缓冲区。使用DMA可以并行地进行数据的读取和写入,从而加速整个处理过程。

  3. 数据桥接:在某些应用中,你可能需要从一个硬件接口读取数据,然后将其写入到另一个硬件接口。使用DMA可以确保这两个接口之间的数据传输是高效的,不会受到CPU中断或其他任务的影响。

  4. 循环缓冲区:在处理实时数据流时,循环缓冲区是一种常见的解决方案。使用DMA可以自动地将新数据写入循环缓冲区的末尾,并将旧数据从缓冲区的开头移出,从而实现无缝的数据传输和处理。

(2)每个DMA控制器有8个数据流,每个数据流拥有8个通道,每次传输的数据最大为65535(如果数据单位为字,则一次可以传输256KB),每个通道具体是什么数据接口如下图所示:

DMA1通道

DMA2通道

(3)DMA传输具有FIFO(先进先出)模式和直接模式。FIFO用于在源数据传输到目标地址之前临时存放这些数据,每个数据流都有一个独立的 4 字 FIFO,阈值级别可由软件配置为 1/4、1/2、3/4 或满。而直接模式在每个外设请求都立即启动对存储器传输。

(4)数据流与数据流之间的传输优先级通过软件和硬件两个方面决定。软件上,可以通过DMA_SxCR寄存器配置数据流的优先级,总共有四个等级:非常高、高、中、低。硬件上,若两个请求的软件优先级相同时,仲裁器根据DMA通道的编号来决定响应顺序,序号较小的数据流优先级更高,另外,DMA1拥有比DMA2更高的优先级。

(5)DMA支持源地址和目标地址的数据宽度可以不同,如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据。源传输和目标传输在整个 4 GB 区域(地址在 0x0000 0000 和 0xFFFF FFFF 之间)都可以寻址外设和存储器。

(6)DMA拥有5个中断,分别是:半传输、传输完成、传输错误、FIFO 上溢/下溢、直接模式错误。

2.DMA的使用

下面我们将一些数据通过DMA2的UART1输出出来:

(1)使能DMA时钟

 __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能    

(2) 初始化DMA通道,配置通道,外设和内存地址,传输数据量等

__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //将DMA与USART1联系起来(发送DMA)
    
    //Tx DMA配置
    UART1TxDMA_Handler.Instance=DMA2_Stream7;                            //数据流选择DMA2控制器的数据流7
    UART1TxDMA_Handler.Init.Channel=DMA_CHANNEL_4;                       //通道选择4
    UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外设普通模式
    UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
    
    HAL_DMA_DeInit(&UART1TxDMA_Handler);   
    HAL_DMA_Init(&UART1TxDMA_Handler);

(3)开启DMA通道传输

 MYDMA_USART_Transmit(&UART1_Handler,(u8*)SendBuff,SEND_BUF_SIZE); //启动传输    

(4) 查询DMA通道状态,传输结束后关闭串口DMA

while(1){
    if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7传输完成
    {
         __HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7传输完成标志
         HAL_UART_DMAStop(&UART1_Handler);      //传输完成以后关闭串口DMA
	     break; 
    }
     delayms(10);
}                

STM32 DMA(Direct Memory Access)是一种硬件机制,它可以在不使用 CPU 的情况下完成数据传输。这种机制可以提高数据传输的效率,从而提高系统的整体性能。在STM32 MCU中,DMA通常用于以下几个方面: 1. 外设数据传输到存储器:例如,将ADC转换结果存储到存储器中。 2. 存储器数据传输到外设:例如,将存储器中的数据传输到DAC输出。 3. 存储器数据传输到存储器:例如,将一个缓冲区的数据拷贝到另一个缓冲区。 STM32 DMA的主要特点有以下几个: 1. 高效性:DMA传输过程不需要CPU参与,可以在后台进行数据传输,从而节约了CPU资源。 2. 灵活性:DMA可以支持多种传输模式,例如内存到内存、内存到外设、外设到内存、外设到外设等。 3. 安全性:DMA传输过程可以通过设置传输长度和传输完成中断等方式来保证数据传输的安全性。 下面是STM32 DMA的基本工作原理: 1. 配置DMA通道:首先需要配置DMA通道的相关寄存器,例如源地址、目的地址、传输长度等等。 2. 启动DMA传输:一旦DMA通道被配置好,就可以启动DMA传输。启动DMA传输后,DMA会自动从源地址读取数据,并将数据写入目的地址,在这个过程中不需要CPU的参与。 3. DMA传输完成:当DMA传输完成后,会产生传输完成中断,CPU可以在中断处理函数中进行后续处理。 总之,STM32 DMA是一种非常有用的机制,可以显著提高系统的整体性能。在使用DMA时,需要仔细考虑传输模式、传输长度、目的地址等参数,确保DMA传输的正确性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千千道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值