DMA学习笔记

本文介绍了DMA(直接存储器访问)的工作原理及其主要特性,包括数据传输的优先级设置、传输宽度、方向和计数。同时,详细阐述了如何通过编程配置DMA的寄存器,如CCR、CNDTR、CPAR和CMAR,以实现外设到存储器的数据传输。示例代码展示了如何初始化DMA1 Channel 1并启动数据传输。在使用DMA时,别忘了开启外设的DMA请求功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA简介:

        DMA是用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。简单的来说它就是一个“搬运工”。

DMA的主要特性:

        1、在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:最高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)

        2、独立数据源和目标数据区的传输宽度(字节(8个字节)、半字(16字节)、全字(32字节)),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

        3、DMA的传输方向分为三种:

                (1)外设到存储器

                (2)存储器到外设

                (3)存储器到存储器

        4、可编程的数据传输数目(传输的次数):最大为65535

 

 

 DMA的主要寄存器:

        DMA的时钟位于AHB中,在开启时钟后需要延时一会,以完成启动DMA时钟的动作。我们在配置DMA时主要配置它的配置寄存器(CCR)、传输数量寄存器(CNDTR)、外设地址寄存器(CPAR)、存储器地址寄存器(CMAR)。

配置代码:

#include "dma.h"
#include "delay.h"
//外设到存储器
void DMA1_P2M_Init(u32 cpar, u32 cmar)
{
    //1, 外设时钟使能
    RCC->AHBENR |= 1<<0; //DMA1外设时钟使能
    Delay_Ms(5);
    
    //2, DMA1核心寄存器配置
    DMA1_Channel1->CCR &= 0x00000000; //清空CCR寄存器
    DMA1_Channel1->CCR |= 0<<14;      //非存储器到存储器模式
    DMA1_Channel1->CCR |= 3<<12;      //通道优先级:最高
    DMA1_Channel1->CCR |= 1<<10;      //存储器数据宽度:16位
    DMA1_Channel1->CCR |= 1<<8;       //外设数据宽度:16位
    DMA1_Channel1->CCR |= 1<<7;       //开启存储器增量模式
    DMA1_Channel1->CCR |= 0<<6;       //关闭外设增量模式
    DMA1_Channel1->CCR |= 0<<5;       //不执行循环操作
    DMA1_Channel1->CCR |= 0<<4;       //从外设读

    //设置地址
    DMA1_Channel1->CPAR = cpar;       //外设地址
    DMA1_Channel1->CMAR = cmar;       //存储器地址
}

void DMA1_StartUp(u16 cndtr)
{
    DMA1_Channel1->CCR &= ~(1<<0);    //关闭通道
    DMA1_Channel1->CNDTR = cndtr;     //设置数据传输数量
    DMA1_Channel1->CCR |= 1<<0;       //开启通道
}

若要使用DMA记得也要去允许打开外设(如ADC,串口等)的DMA请求。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值