STM32 DMA 应用之(一)SRAM 与flash 间数据传输
一、为什么要用DMA? DMA?全称:Direct MemoryAccess 就是可以直接内存存取; 正是它可以直接操作内存所以具备以下优点: 而无需经过CPU去操作内存的存取,这样可以解放CPU出来干其他的事情; 因为他可以进行存储器时间的数据传输,而不需经过cpu,所以大大加快了数据传输速度—是一种高速的数据传输;
二.DMA有几种传输数据方式: (1)内存到 内存之间的;即:SRAM?à SRAM (2)内存到 外设之间的; (例如:串口收到的数据 从数据寄存器 à 内存) (3) 外设到内存之间的; 三.传输的数据宽度是怎样的,数据是什么样的形式传输?DMA 能传输多大的数据量? A. 数据源地址到数据目的地址 传输宽度或者说传输数据的形式,有几种:1)字节;2)半字;3)全字 [1字节=8bit 1半字=2字节=16位 1全字=2半字=4字节=32位] B.传输的最大数据量是65536 我们来看一下stm32f103ve的数据手册第九章DMA 大概的了解一下DMA的特性: 四、怎样配置软件来使用DMA? /****************************************************************/ 函数名称: Dma_Init *功能描述: 利用DMA 把内存的数据 传输到flash 达到高速传输的目的? * *输入参数:无 *返回值 :无 *其他说明:无 *当前版本:v1.0? *作者 :尹宣 *完成时间:2013年12月1日??*? *----------------------------------------------------------------- * ******************************************************************/? void Dma_Init(void)? {? DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); /* DMA channel6 configuration */? DMA_DeInit(DMA1_Channel1);? DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_Const_Buffer; //外设地址? DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer; //内存地址? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为DMA的源端? DMA_DIR_PeripheralDST; //外设作为目的地址? DMA_InitStructure.DMA_BufferSize = BufferSize; //传输大小? DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; //外设地址增加? DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增使能? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //内存存储方式:字节? DMA_MemoryDataSize_Word;//字(32位)? DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;? DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA_Mode_Normal 正常模式,只传送一次;?DMA_Mode_Circular:循环模式,不停的传送; ? ? ? DMA_InitStructure.DMA_Priority = DMA_Priority_High;? DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;? DMA_Init(DMA1_Channel1,&DMA_InitStructure); /* Enable DMA Channel1 Transfer Complete interrupt */? DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); /* Get Current Data Counter value before transfer begins */? CurrDataCounter= DMA_GetCurrDataCounter(DMA1_Channel1); /* Enable DMA Channel6 transfer */ DMA_Cmd(DMA1_Channel1,ENABLE); ?}? 2.设置DMA优先级
3.在stm3210x_it.c 文件中添加 DMA中断处理函数
|