DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU。
然后了解的是三个方面的部分:
1.从哪里来到哪里去:从存储器到存储器(需要特别的配置),从存储器到外设,从外设到存储器。
2.数据量以及数据的单位:数据量的配置:DMA_CNDTR 单位的配置:DMA_CCRx(8/16/32位的配置)
正确设置两边数据指针的增量模式:外设的地址指针由 DMA_CCRx 的 PINC 配置,存储,存储器的地址指针由DMA_CCRx的MINC配置
3.什么时候传输结束:查询标志位或者通过中断的方式来鉴别,各个标志位参数的描述请看DMA_ISR,然后传输的模式分一次传输以及循环传输
DMA初始化结构体的描述
typedef struct
{
uint32_t DMA_PeripheralBaseAddr; //外设地址
uint32_t DMA_MemoryBaseAddr; //存储器地址
uint32_t DMA_DIR; //传输方向
uint32_t DMA_BufferSize; //传输数目
uint32_t DMA_PeripheralInc; //外设增量模式
uint32_t DMA_MemoryInc; //存储器增量模式
uint32_t DMA_PeripheralDataSize;//外设数据宽度
uint32_t DMA_MemoryDataSize; //存储器数据宽度
uint32_t DMA_Mode; //模式选择(一次循环/无限循环)
uint32_t DMA_Priority; //DMA优先模式
uint32_t DMA_M2M; //设置存储器到存储器的传输方向
}DMA_InitTypeDef;
一般的步骤:
使能DMA时钟
配置DMA数据参数
使能DMA进行传输
一般用到的函数在官方库里的头文件有讲解与使用,在参数配置里面不理解的可以看官方的头文件
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
void DMA_ClearFlag(uint32_t DMAy_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
以上是官方头文件里的函数
DMA_DeInit与DMA_Init里是对DMA的初始化方面的。在Init里面第一个参数是通道,比如说DMA1_Channel6,DMA_Cmd是对DMA的操控,后面的参数NewState一般是Enable之类的
正如函数名的定义那样,这些函数通俗易懂,值得需要了解的是DMA_IT这个定义,是有关中断设置的,能被以下几个固定的值赋值,定义也如英文解释的那个样子,DMA_IT_TC,传输结束后进行中断,DMA_IT_HT,半传输中断.DMA_IT_TE:传输错误中断。void DMA_ClearFlag(uint32_t DMAy_FLAG);这个是清除标志位,在传输结束后会自动标志,所以当我们想重新使用的时候必须要自己清零。
* @param DMA_IT: specifies the DMA interrupts sources to be enabled
* or disabled.
* This parameter can be any combination of the following values:
* @arg DMA_IT_TC: Transfer complete interrupt mask
* @arg DMA_IT_HT: Half transfer interrupt mask
* @arg DMA_IT_TE: Transfer error interrupt mask
* @param NewState: new state of the specified DMA interrupts.
* This parameter can be: ENABLE or DISABLE.
今天晚上看的下一章是常用存储器介绍
存储器一般是RAM与ROM,然后还有FLASH,RAM分DRAM与SRAM,DRAM是动态的,断电后数据会消失,而SRAM是静态,以锁存器存储数据,SRAM一般用于高速缓存。
然后就是ROM与FLASH(NOR与NAND,NOR地址线与数据线分开,由地址得到数据不需要复杂的转化,然而NAND地址线与数据线是共用的,而且NOR可以字节读取,而NAND只能块读取,而且NAND的寿命不比NOR长)
原文地址:https://www.cnblogs.com/wxb1314520/p/12297404.html