目录
一:DMA简介
二:DMA基本结构
三:DMA实现过程
1.框图
2.DMA进行转运的条件
四:函数
一:DMA简介
-
DMA(Direct Memory Access)直接存储器存取
-
DMA可以提供外设存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
-
12个独立可配置通道,DMA1(7个通道),DMA2(5个通道)
-
外设就是寄存器,寄存器就是存储器
-
DMA2仅存在于大容量产品和互联型产品。
1. SPI/I2S3、 UART4、 TIM5、 TIM6、 TIM7和DAC的DMA请求仅存在于大容量产品和互联型产品。
2. ADC3、 SDIO和TIM8的DMA请求仅存在于大容量产品
二:DMA基本结构
传输计数器:递减,减到零后,自增的地址就会返回到起始地址。写入传输计数器的时候
必须先关闭使能DMA再写入--DMA_CNDTRx
自动重装器:是否恢复传输计数器的最初的值,即是否循环转运数据,自减,每传输一个
就自减一,直到减到0,表示传输完成
软件触发:以最快的速度连续不断的转运数据,一般用于存储器到存储器的转运,一般不
与循环模式同时使用
硬件触发:一般是外设,这些转运需要一定的时机,比如ADC转换完成,串口收到数据,
定时时间……
开关控制:DMA_Cmd函数
数据宽度:少传多,高位补零;多传少,舍弃高位
三:DMA实现过程
1.框图
MA是AHB总线的设备,所以要用AHB开启时钟的函数
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
2.DMA进行转运的条件
-
开关控制,DMA_Cmd必须使能
-
传输计数器必须大于0
-
触发源必须有触发信号,触发一次转运一次,传输器自减一次。当传输寄存器等于0且没有自动重装时,这时无论是否触发,DMA都不会再进行转运。此时就需要DMA_Cmd给DISABLE,关闭DMA,再给传输寄存器写入一个大于0的数,再DMA_Cmd给ENABLE开启DMA,DMA才能继续工作。
四:函数
//外部站点DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;//设置站点 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//数据自增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度//存储器站点DMA_InitStructure.DMA_MemoryBaseAddr = AddrB; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设站点作为数据源 DMA_InitStructure.DMA_BufferSize = Size; //传输次数DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //不是自动重装DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_EnableDMA_Init(DMA1_Channel1, &DMA_InitStructure);DMA_Cmd(DMA1_Channel1,ENABLE);