atXmega相比atmega系列芯片,增加的一個(gè)比較顯著的功能就是DMA控制器。
DMA控制器可以直接將數(shù)據(jù)從一個(gè)外設(shè)寄存器移到內(nèi)部或外部SRAM,也可在SRAM的不同地址間,甚至不同外設(shè)寄存器之間移動(dòng)數(shù)據(jù)。當(dāng)CPU數(shù)據(jù)總線空閑時(shí),DMA控制器便會(huì)用它來完成內(nèi)存和外設(shè)間的數(shù)據(jù)傳輸,無需使用CPU資源。采用DMA控制器的芯片,性能更好,功耗更低。
DMA控制器有一個(gè)比較重要的概念,就是數(shù)據(jù)傳輸。里面又有Burst transfer【突發(fā)傳輸】和Block transfer【塊傳輸】。Blocktransfer是有多個(gè)Burst transfer構(gòu)成。DMA transaction可以由單個(gè)或者多個(gè)Blocktransfer構(gòu)成。之所以要定義這些概念,是為了確定數(shù)據(jù)發(fā)送地址和數(shù)據(jù)目標(biāo)地址的重載方式。
這里我們用一個(gè)簡單的例子來說明DMA的功能。ADC轉(zhuǎn)換結(jié)果通過一個(gè)DMA通道傳送到SRAM。即ADC轉(zhuǎn)換結(jié)束觸發(fā)DMA transaction,將AD值【CHnRES】傳輸?shù)侥繕?biāo)變量samples_0[0]內(nèi)。
那么數(shù)據(jù)源發(fā)送地址就是CHnRESH和CHnRESL的地址,目標(biāo)地址就是samples_0[0]的地址,即samples_0咯。我們用最簡單的傳輸方式,ADC轉(zhuǎn)換結(jié)束,就采用一次Burst transfer(single slot)傳送兩個(gè)字節(jié)(CHnRESH和CHnRESL)。下面黃色部分是對single-slot傳輸?shù)慕忉尅?/p>
下面貼程序,首先是DMA初始化設(shè)置。
下面是ADC部分,啟動(dòng)ADC采樣。
ADC采樣結(jié)束會(huì)把AD值自動(dòng)傳輸給變量samples_0[0]。傳輸完后,由于single-slot模式DMA傳輸通道使能會(huì)位被清零。如果需要再次使用DMA功能,需要重新將使能位置1(DMA_CH_ENABLE_bm)。
采用DMA功能實(shí)現(xiàn)ADC采樣,相比輪詢和中斷方式,可以極大的減少對CPU資源的占用。
自己也是在上班之余,看了兩個(gè)晚上的DMA功能和相關(guān)程序?qū)懗鰜淼模绦蚴峭ㄟ^電路板驗(yàn)證過的。大家在理解的基礎(chǔ)上,自己組織一下,就可以拿來用。
-
Atmel
+關(guān)注
關(guān)注
17文章
312瀏覽量
107387 -
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
100764
發(fā)布評論請先 登錄
相關(guān)推薦
評論