ARM學(xué)習(xí)《十一》—不用庫(kù)函數(shù)自己動(dòng)手配置STM32中的DMA
DMA英文全稱是Direct Memory Access,意思是直接存儲(chǔ)器訪問(wèn)。他的作用就是不需要經(jīng)過(guò)CUP進(jìn)行數(shù)據(jù)傳輸,也就是替CPU分擔(dān)點(diǎn)事情做,什么事情?數(shù)據(jù)傳輸方面的事情。也就是說(shuō),你只要使能并配置好了DMA,DMA就可以將一批數(shù)據(jù)從源地址搬運(yùn)到目的地址去而不經(jīng)過(guò)CPU的干預(yù),這樣可以為CPU節(jié)省好多精力去干更重要的事情很人性化。就像我們?nèi)艘粯?,我們平常?xí)慣性的動(dòng)作是不用經(jīng)過(guò)大腦思考的,比如說(shuō)眨眼睛,呼吸等。DMA就是負(fù)責(zé)這些工作的,但它沒(méi)人這么智能,需要將它設(shè)置好了它才會(huì)正常工作。
本文引用地址:http://butianyuan.cn/article/201611/318952.htm要進(jìn)行數(shù)據(jù)傳輸就必須有兩個(gè)條件:數(shù)據(jù)從哪傳(源地址),數(shù)據(jù)傳到哪里去(目的地址)。是的DMA的確有這兩項(xiàng)設(shè)置,通過(guò)軟件設(shè)置,設(shè)置好源地址和目的地址。在一個(gè)重要的條件就是觸發(fā)源是什么,就是說(shuō)什么時(shí)候進(jìn)行DMA數(shù)據(jù)傳輸呢?這叫觸發(fā)信號(hào)。也可以通過(guò)軟件編程設(shè)置具體時(shí)間,具體條件來(lái)觸發(fā)DMA數(shù)據(jù)傳輸。
總之,要使用DMA就要將各種參數(shù),條件配置好才可以用。就提的DMA寄存器說(shuō)明見STM32的參考手冊(cè)。下面舉一簡(jiǎn)單的歷程來(lái)說(shuō)明DMA的用法,本歷程將串口數(shù)據(jù)發(fā)送設(shè)置為DMA模式,串口1將持續(xù)從RAM中的一段連續(xù)的地址中取數(shù)據(jù),然后發(fā)送出去。用串口調(diào)試助手可以監(jiān)測(cè)DMA的工作和CPU互不沖突,串口發(fā)送就相當(dāng)于后臺(tái)運(yùn)行的一段程序。具體配置如下:
寄存器定義:
//*************************************************************************
//
// DMA-Register
//
//*************************************************************************
#define DMA_ISR
#define DMA_IFCR
#define DMA_CCR1
#define DMA_CCR2
#define DMA_CCR3
#define DMA_CCR4
#define DMA_CCR5
#define DMA_CCR6
#define DMA_CCR7
#define DMA_CNDTR1
#define DMA_CNDTR2
#define DMA_CNDTR3
#define DMA_CNDTR4
#define DMA_CNDTR5
#define DMA_CNDTR6
#define DMA_CNDTR7
#define DMA_CPAR1
#define DMA_CPAR2
#define DMA_CPAR3
#define DMA_CPAR4
#define DMA_CPAR5
#define DMA_CPAR6
#define DMA_CPAR7
#define DMA_CMAR1
#define DMA_CMAR2
#define DMA_CMAR3
#define DMA_CMAR4
#define DMA_CMAR5
#define DMA_CMAR6
#define DMA_CMAR7
配置DMA,手冊(cè)上表示可以將串口UART1的發(fā)送Tx功能配置為DMA發(fā)送,在DMA通道4:
void DMA_configration(void)
{
}
Main函數(shù):
unsigned char Data_Buffer[10]={0x11,0x22,0x33,0x44,0x55};
//將Data_Buffer設(shè)為全局變量。
int main()
}
打開串口助手就可以看到Data_Buffer[]中的數(shù)據(jù),其實(shí)這只是一個(gè)簡(jiǎn)單的演示實(shí)例,DMA的用處是很大的,先學(xué)會(huì)配置,以后會(huì)有它大顯身手的時(shí)候。
USART1_CR3|=0x00000080; //將USART1模塊發(fā)送數(shù)據(jù)Tx設(shè)置成DMA方式工作
上面這兩句就是觸發(fā)源,你可以把這兩句放到定時(shí)器TIMx中,比如定時(shí)1S觸發(fā)DMA,這些都是可以任意設(shè)置的,不難吧!
評(píng)論