|
基于正點(diǎn)原子Stm32f103DMA詳細(xì)介紹
By 小澤
(1)DMA通俗的講就是可以將一個(gè)區(qū)域的數(shù)據(jù)復(fù)制到另一個(gè)區(qū)域來,可為cpu減負(fù)。
以下是STM32F103DMA的特點(diǎn):
(2)stm32f103大容量芯片中具有兩個(gè)DMA,DMA1具有7個(gè)不同的通道DAM2有5個(gè)通道,當(dāng)選擇好固定的通道時(shí),所選擇的外設(shè)也就固定了。
以下是通道對應(yīng)的具體外設(shè):
(3)DMA的操作大致分為3步,涉及4個(gè)重要的寄存器
第一步:在DMA_cpar寄存器中選擇外設(shè)基地址作為傳輸?shù)脑搭^或目標(biāo)
具體寄存器列表如下:
第二步:在DMA_cmar寄存器中選擇存儲器基地址作為傳輸?shù)哪繕?biāo)或源頭
具體寄存器列表如下:
第三步:在通道配置寄存器(dma_ccrx)中的DIR寄存器中設(shè)置傳輸方向
當(dāng)其設(shè)置為0時(shí)將外設(shè)設(shè)為目標(biāo)源,當(dāng)其設(shè)置為1時(shí)將存儲器設(shè)為目標(biāo)源
具體寄存器操作如下:
PS:每傳送一次數(shù)據(jù)執(zhí)行一次DAM_cndtr(數(shù)據(jù)傳輸量)寄存器遞減操作,所以該寄存器包含尚未完成的操作項(xiàng)目(cndtr只能在dma_ccrx的en=0時(shí)寫入)。
(4)其他的一些重要寄存器:
1.DMA_ccrx中的pl寄存器,該寄存器充當(dāng)仲裁器可為每個(gè)通道配置優(yōu)先等級
2.DMA_ccrx中有msize和psize寄存器分別設(shè)置存儲器和外設(shè)的數(shù)據(jù)寬度
當(dāng)寬度一致時(shí)很好理解,當(dāng)不一致的時(shí)候需要參考該表
3.DMA_ccrx中的minc和pinc寄存器分別用來開啟存儲器和地址的指針增量
4.DMA_ccrx寄存器中的circ寄存器用于設(shè)置循環(huán)模式,當(dāng)一次數(shù)據(jù)傳輸完成
后,還可以無限多次的傳輸數(shù)據(jù)。
5.DMA_ccrx中有MEM2MEM寄存器用來開啟存儲器到存儲器的數(shù)據(jù)傳輸,一
旦開啟這個(gè)模式,將不能再使用循環(huán)模式
(4)中斷:半傳輸標(biāo)志位(HTIF),傳輸完成標(biāo)志位(TCIF),傳輸錯(cuò)誤標(biāo)志(TEIF)
(5)關(guān)于DMA配置問題怎么快速找到外設(shè)使能函數(shù):
在FWLIB下找到相應(yīng)的“xx.c”文件 在里面直接搜索DMA即可
其實(shí)外設(shè)地址也可以設(shè)置為你定義的內(nèi)存基地址
Dst就是將所謂的外設(shè)基地址設(shè)置為目標(biāo)
Src就是將所謂的外設(shè)基地址設(shè)置為源頭
設(shè)置cndtr寄存器,可查看剩余的數(shù)據(jù)
可以設(shè)置外設(shè)或寄存器地址自增與否
是否開啟循環(huán)模式
(7)一定要開啟相應(yīng)外設(shè)的時(shí)鐘
由這段代碼可以清晰看到是要發(fā)送的字節(jié)長度,是要發(fā)送的數(shù)據(jù)量,所以要發(fā)送的數(shù)據(jù)量為(8200*8bit
)這兩者是有區(qū)別的為了進(jìn)一步佐證我的想法我查看的buffsize的具體數(shù)值
0x10000轉(zhuǎn)化為10進(jìn)制為65536 說明我的想法是正確的。
注意事項(xiàng)!!!!一定要注意!!!!!
(1)一旦開始存儲到存儲之間的數(shù)據(jù)傳輸,不能開啟連續(xù)轉(zhuǎn)換模式
(2)cndtr只能在dma_ccrx的en=0時(shí)寫入對應(yīng)的具體代碼
(3)一定要開啟相應(yīng)外設(shè)的時(shí)鐘
(4)就是我在上面說過的關(guān)于buffsize的問題 ,一定要區(qū)分好字節(jié)和數(shù)據(jù)
2017 .8.3
|
|