本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发
目录
DMA简介
- DMA(Direct Memory Access)直接存储器存取 ,可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预。这使CPU可以去做其他复杂的事情。
- 12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
- 每个通道都支持软件触发和特定的硬件触发
STM32F103C8T6 DMA资源:DMA1(7个通道),具体DMA资源可以查看参考手册
DMA框图
DMA时钟使能
已知DMA在AHB总线(如图)
由RCC时钟树知,应使能外部时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA初始化
外设和存储器只是个名字,我们要确定数据从哪里来到哪里去,配置数据来源和去向的地址即可
实现外设存储器,存储器到存储器,存储器到外设的转运
转运起始和终止的地址
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标
//地址均为32位
//外设存储器的基地址
DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;
//外设存储器的指针自增使能(转运后将地址指向下一个数据) Enable-自增 Dissable-不自增
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
//存储器的基地址
DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;
//存储器的指针自增使能(转运后将地址指向下一个),与外设存储器一样来理解
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
一次转运次数结束后,自增的指针也会回到最初的位置,以便下一次转运。
转运并不会把原有数据拿走,是复制了一份
在传输过程中,当开启通道(DMA_CCRx的EN=1)时,不能写更改地址。需关闭通道后再更改地址。
转运方向
DMA_DIR_PeripheralDST |
peripheral: source |
存储器到外设 |
DMA_DIR_PeripheralSRC |
peripheral : destination |
外设到存储器 |
外设和存储器只是个名字而已,重要的是你填的地址
//转运方向:外设到存储器还是存储器到外设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;