http://blog.csdn.net/zzwdkxx/article/details/9026173
DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU 直接控制傳輸,也沒有中斷處理方式那樣保留現(xiàn)場和恢復(fù)現(xiàn)場的過程,通過硬件為RAM 與I/O設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,能使CPU 的效率大為提高。
STM32中 DMA1有7個(gè)通道,DMA2有5個(gè)通道(DMA2 僅存在大容量產(chǎn)品中)。DMA掛載的時(shí)鐘為AHB總線,其時(shí)鐘為72Mhz,所以可以實(shí)現(xiàn)高速數(shù)據(jù)搬運(yùn)。
STM32F103RBT6 只有1 個(gè)DMA控制器,DMA1 ,下面我們就針對DMA1 進(jìn)行介紹。
從外設(shè)(TIMx、ADC、SPIx 、I2Cx 和USARTx )產(chǎn)生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時(shí)只能有一個(gè)請求有效。外設(shè)的DMA請求,可以通過設(shè)置相應(yīng)的外設(shè)寄存器中的控制位,被獨(dú)立地開啟或關(guān)閉。
這里我們要使用的是串口 1 的 DMA 傳送,也就是要用到通道 4。
DMA1通道4的配置方法如下:
dma.c主要代碼:- u16 DMA1_MEM_LEN;//保存DMA每次數(shù)據(jù)傳送的長度
- //DMA1的各通道配置
- //這里的傳輸形式是固定的,這點(diǎn)要根據(jù)不同的情況來修改
- //從存儲器->外設(shè)模式/8位數(shù)據(jù)寬度/存儲器增量模式
- //DMA_CHx:DMA通道CHx
- //cpar:外設(shè)地址
- //cmar:存儲器地址
- //cndtr:數(shù)據(jù)傳輸量
- void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
- {
- RCC->AHBENR|=1<<0; //開啟DMA1時(shí)鐘
- delay_ms(1); //等待DMA時(shí)鐘穩(wěn)定
- DMA_CHx->CPAR=cpar; //DMA1 外設(shè)地址
- DMA_CHx->CMAR=(u32)cmar;//DMA1,存儲器地址
- DMA1_MEM_LEN=cndtr; //保存DMA傳輸數(shù)據(jù)量
- DMA_CHx->CNDTR=cndtr; //DMA1,傳輸數(shù)據(jù)量
- DMA_CHx->CCR=0X00000000;//復(fù)位
- DMA_CHx->CCR|=1<<4; //從存儲器讀
- DMA_CHx->CCR|=0<<5; //普通模式
- DMA_CHx->CCR|=0<<6; //外設(shè)地址非增量模式
- DMA_CHx->CCR|=1<<7; //存儲器增量模式
- DMA_CHx->CCR|=0<<8; //外設(shè)數(shù)據(jù)寬度為8位
- DMA_CHx->CCR|=0<<10; //存儲器數(shù)據(jù)寬度8位
- DMA_CHx->CCR|=1<<12; //中等優(yōu)先級
- DMA_CHx->CCR|=0<<14; //非存儲器到存儲器模式
- }
- //開啟一次DMA傳輸
- void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
- {
- DMA_CHx->CCR&=~(1<<0); //關(guān)閉DMA傳輸
- DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,傳輸數(shù)據(jù)量
- DMA_CHx->CCR|=1<<0; //開啟DMA傳輸
- }
在主函數(shù)里主要有這幾個(gè)語句完成DMA傳輸:
1.首先配置DMA1通道4相關(guān)參數(shù)
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,5200);//DMA1通道4,外設(shè)為串口1,存儲器為SendBuff,長度5200.
2.然后將待發(fā)送內(nèi)容裝入存儲器
SendBuff[i]=TEXT_TO_SEND[t];
3.然后開啟一次DMA傳輸
MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸!
4.監(jiān)控傳送進(jìn)度。
pro=DMA1_Channel4->CNDTR;//得到當(dāng)前還剩余多少個(gè)數(shù)據(jù)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。