通道装备进程
1、在DMA_CPARx寄存器总设置外设寄存器的地址。产生外设数据传输恳求时,这个地址将是传输的源或方针
2、在DMA_CMARx寄存器中设置数据存取器的地址,产生外设数据传输恳求时,传输的数据将从这个地址读出或写入这个地址
3、在DMA_CMARx寄存器中设置要传输的数据量,在每个数据传输后,这个数值递减。
4、在DMA_CCRx寄存器的PL位中设置通道的优先级
5、在DMA_CCRx寄存器中设置数据传输方向、循环形式、外设和寄存器的增量形式、外设和存储器的数据宽度、传输一半产生中止或传输完结产生中止
6、设置DMA_CCRx寄存器的ENABLE位,发动该通道
一旦发动了DMA通道,它即可呼应连到该通道上的外设的DMA恳求
当传输一般的数据后,半传输标志(HTIF)将被置1,当设置了半传输中止位时,
将产生一个中止恳求,在数据传输完毕后,传输完结标志被置1,当设置了答应传输完结中止位后,将产生一个中止恳求。
循环形式
循环形式用于处理循环缓冲区和接连的数据传输(如ADC的扫描形式),在DMA_CCRx寄存器中的CIRC位用于敞开这一功用,当发动了循环形式,数据传输的数目变为0时,将会主动地被康复成装备通道时设置的初值,DMA操作将会继续进行。
存储器到存储器形式
DMA通道的操作能够在没有外设恳求的情况下进行,这种操作便是存储器到存储器形式。当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位发动DMA通道时,DMA传输将立刻开端,当DMA_CNDTRx寄存器变为0时,DMA传输完毕,存储器到存储器形式不能与循环形式一起运用
DMA首要,初始化,要了解触发源,也可经过软件编程设置详细的时刻,详细条件来触发DMA数据传输,DMA的触发源是事情(1)、首要敞开时钟
RCC_APBPeriphClockCmd(RCC_APBPeriph_DMA1,ENABLE);//敞开DMA时钟
结构体(DMA_InitTypeDef)阐明:
PeripheralBaseAddr:外设地址 CPAR
MemoryBaseAddr: 存储器地址 CMAR
DIR: 传输方向(从外设读/从存储器读)
BufferSize: 传输数量
PeripheralInc: 外设地址增量形式(传完一个数后地址是否+1)
MemoryInc: 存储器地址增量形式
PeripheralDataSize: 外设数据宽度(Byte / Half Word / Word)
MemoryDataSize: 存储器数据宽度
Mode: 循环/正常
Priority: 优先级
M2M: 存储器到存储器形式
DMA_DeInit(DMA_Channel1);
默许初始化装备
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_PeripheralBaseAddr是给DMA一个开始地址,在程序中假如这个是内存形式,这给的是一个界说的一个数组的指针,如buffer;其间USART1_DR_Base是自己界说的一个地址,这个地址的界说便是USART1_DR这个寄存器的地址。
需求留意的是,这个地址的界说,是由两部分组成的,基准地址+偏移地址,在此进程中,基准地址=0x4001 3800而偏移地址=0x04,所以终究地址为:0x4001 3804
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)Send_Buffer;
这个相同也是一个地址变量,这个地址的寄存要发送的数据的
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
设置DMA的传输方向,这个能够是双向传输,也能够是单向传输,在库文件中有这样的界说;指定该外设是DMA的源仍是目的地
DMA_DIR_PeripheralDST:该外设是DMA的目的地(要承受的设备地址)
DMA_DIR_PeripheralSRC:该外设是DMA的源(及要传输的数据)
DMA_InitStructure.DMA_BufferSize = Send_BufferSize;
这句话时设置DMA在传输时缓冲区的长度,一般需求给此缓冲区界说一个存储区,这个参数的单位有三种类型:Byte、HalfWord、Word,其间有:
Byte:8位
HalfWord:16位
Word:32位
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
设置DMA的外设递加形式,假如是设置成SPI形式,则读取数据的时分会向下一个地址移位在这儿由于咱们的外设是USART,则这个外设的地址始终是USART1_DR_Base,不需求进行自加即递加形式。
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
这句是设置DMA的内存递加形式,当需求拜访多个内存参数时,需求运用这个
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
设置DMA在拜访外设时操作的数据长度为Byte
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
设置DMA在拜访内存时操作的数据长度为Byte
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
设置DMA形式,这儿是一般形式,即传输完结后就封闭了DMA,还有循环形式,后边阐明。
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
设置DMA的优先等级:能够分为4级:VeryHigh,High,Medium,Low.
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
设置DMA的2个内存中的变量彼此拜访的
DMA_Init(DMA_Channel1,&DMA_InitStructure);
前面那些都是对DMA结构体成员的设置,在次再共同对DMA整个模块做一次初始化,使得DMA各成员与上面的参数共同。
DMA_Cmd(DMA_Channel1,ENABLE);
使能DMA传输。
SMT32系列微操控器低端类型中仅包含DMA1,支撑7个通道;高端类型还包含DMA2,支撑5个通道。它的每个通道可任意指定作业形式,如内存到内存、内存到外设或外设到内存等。当涉及到外设时,一般是由外设来触发DMA的一次传输,如串口收到数据的标志位可触发DMA.
DMA的每次传输都分为4个阶段:恳求裁定、地址核算、总线存取和应对。除总线存取阶段,其他3个阶段都只需求一个体系周期,而且不占用总线,可在DMA操控器内部并发地履行。总线存取阶段,每个字(4字节)的传输需求3个体系周期。DMA和CPU作业在替换方法下,不会彼此堵塞。DMA各个通道可独立设置优先级,当拜访同一资源时高优先级通道先取得资源。
选用时钟的4个比较/捕获通道加DMA能够产生出4路不同频率和占空比的方波。这儿为简化篇幅,只列出了产生一路方波的代码。基本原理是:将时钟的4个通道设置为回转形式(即计数器与比较捕获寄存器持平时,其对应的CPU引脚电平产生回转),设置计数器为向上计数到0xFFFF的形式;然后预先核算好需求引脚回转的时刻,并使能对应通道的DMA恳求。这样,当计数器与比较/捕获寄存器的值持平时,由DMA将下一个需求引脚电平回转的时刻送入到比较/捕获寄存器。
这儿将DMA设置为从内存到外设的半字(2个字节)环形传输。敞开DMA全满和半满中止,在中止处理函数中不断填充新的时刻值,即可确保产生的波形不间断。假定寄存时刻值的缓冲长度为N,则每N/2个点才中止一次,这样CPU就不需求频频进入中止,履行功率比较高。由此也能够看出,缓冲越大,对中止呼应的实时性要求也越低,当然这时中止的处理时刻也越长。以下为示例代码:
需求留意的是,比较/捕获寄存器的预加载功用有必要制止掉。咱们需求的是写入比较/捕获寄存器的值当即与计数器相比较输出,而无需等候一个更新事情。
选用DMA+TIMx的方法来捕获上升沿和下降沿时刻,有利于进步体系的实时性和履行功率。经过TIMx的捕获功用将方波的电平跳变时刻记载在比较/捕获寄存器中,然后DMA将该值主动传输到内存,只有当DMA触发半满或全满事情时CPU才需求进入中止处理数据。经过记载方波的上升沿和下降沿时刻,然后将两个时刻相减,从而就能得到一切低沿和高沿的宽度,最终进行后续的剖析处理。这种方法下中止频率仅为方波频率的4/N(N为缓冲区巨细)。
测验中STM32系列微操控器作业在36 MHz,可产生出1路最高1.5 MHz的方波,可捕获1 MHz的方波,而此刻CPU的履行几乎不受影响。这儿选用DMA来完成方波的产生和捕获,极大地进步了体系的实时性和履行功率,减少了中止次数,节省了名贵的资源。这种计划也能够用来完成高效的模仿串口。别的,若有多个DMA一起作业,应考虑最坏情况下DMA的呼应时刻,以防止过错产生。
1、DMA一般形式和循环形式的差异
循环形式:用于处理一个环形的缓冲区,每轮传输完毕时数据传输的装备会主动地更新为初始状况,DMA传输会接连不断地进行。
一般形式:在DMA传输完毕时,DMA通道被主动封闭,进一步的DMA恳求将不被满意。
2、DMA传输需求指定的条件:
传输源:DMA操控器从传输源读出数据;
传输方针:DMA操控器将数据传输的方针;
触发信号:用于触发一次数据传输的动作,履行一个单位的传输源至传输方针的数据传输。能够用来操控传输的发动条件。