STM32 DMA 自我學(xué)習(xí) 簡(jiǎn)單總結(jié)
簡(jiǎn)單記錄一下STM32的DMA的配置說(shuō)明--------
根據(jù)野火的串口的DMA程序,自己簡(jiǎn)單理解說(shuō)明-----
----第一部分----DMA配置-----
void USART1_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //時(shí)鐘
DMA_InitStructure.DMA_PeripheralBaseAddr =USART1_DR_Base;//設(shè)置DMA源:串口數(shù)據(jù)寄存器地址----基地址----如果后面打開(kāi)了地址自增---則會(huì)傳輸連續(xù)一組數(shù)據(jù)
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)SendBuff;//內(nèi)存地址(要傳輸?shù)淖兞康闹羔?---也就是DMA傳輸?shù)脑吹刂?br/>DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;//方向:外設(shè)是目的地----如果是--DMA_DIR_PeripheralSRC---則是外設(shè)作為數(shù)據(jù)傳輸?shù)膩?lái)源
DMA_InitStructure.DMA_BufferSize =SENDBUFF_SIZE;//DMA要傳輸?shù)目倲?shù)據(jù)大小
DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable;//外設(shè)地址不增---外設(shè)地址不自增---表示從一個(gè)固定地址傳輸或者接收數(shù)據(jù)----反之則為一個(gè)遞增地址
DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable;//內(nèi)存地址自增---內(nèi)存地址不自增---也表示從一個(gè)固定地址傳輸或者接收數(shù)據(jù)----反之則為一個(gè)遞增地址
DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte;//外設(shè)數(shù)據(jù)單位---分別有8位---字---DMA_PeripheralDataSize_Byte。半字---DMA_PeripheralDataSize_HalfWord。字----DMA_PeripheralDataSize_Word---
DMA_InitStructure.DMA_MemoryDataSize =DMA_MemoryDataSize_Byte;//內(nèi)存數(shù)據(jù)單位 8bit---分別有8位---字---DMA_MemoryDataSize_Byte。半字---DMA_MemoryDataSize_HalfWord。字----DMA_MemoryDataSize_Word---
DMA_InitStructure.DMA_Mode =DMA_Mode_Circular; //DMA模式:不斷循環(huán)----另一種模式--循環(huán)---DMA_Mode_Normal
DMA_InitStructure.DMA_Priority =DMA_Priority_Medium; //優(yōu)先級(jí):中-----分別有----最高優(yōu)先級(jí)---DMA_Priority_VeryHigh。高優(yōu)先級(jí)---DMA_Priority_High。中優(yōu)先級(jí)---DMA_Priority_Medium。低優(yōu)先級(jí)---DMA_Priority_Low。
DMA_InitStructure.DMA_M2M =DMA_M2M_Disable;//禁止內(nèi)存到內(nèi)存的傳輸
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //配置DMA1的4通道---對(duì)應(yīng)USART1_TX。還有很多相應(yīng)已經(jīng)確定好的通道----見(jiàn)下面截圖----截圖01
DMA_Cmd (DMA1_Channel4,ENABLE); //使能DMA
//DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置DMA發(fā)送完成后產(chǎn)生中斷----這個(gè)是根據(jù)需要來(lái)確定是否需要中斷---比如你需要確定DMA什么時(shí)候完成傳輸----傳輸完成后你需要做一些什么的時(shí)候。但是如果配置了使用完成中斷,則需要在后面配置其作為中斷的優(yōu)先級(jí)。
}
---第二部分---如果前面打開(kāi)了DMA中斷,這里需要配置其中斷優(yōu)先級(jí)----
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel =DMA1_Channel4_IRQn; //主要是這里的對(duì)應(yīng)DMA通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
---第三部分---如果前面打開(kāi)了DMA中斷,這里需要設(shè)置其中斷函數(shù)----
void DMA1_Channel4_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)//DMA發(fā)送完成標(biāo)志----其它標(biāo)志位見(jiàn)截圖02---和截圖03--
{
..............
DMA_ClearFlag(DMA1_FLAG_TC4);//清除發(fā)送完成標(biāo)志---以便下次判斷
}
}
----------------------------------------截圖------------------------------
--------------截圖01---------------
----------------------截圖02-------------------------
--------------------------------截圖03-----------------------