來(lái)源:DigiKey 作者:Alan Yang 直接存儲器訪(fǎng)問(wèn)(DMA)控制器,可以在內存和/或外設之間傳輸數據,而不需要CPU參與每次傳輸。合理利用DMA控制器,可以減輕CPU的負擔。本文通過(guò)介紹DMA結構與工作原理,以及兩種模式(兵乓模式與多數據包緩沖傳輸模式),來(lái)看看使用DMA如何提高MCU效率。 DMA結構與工作原理 先進(jìn)的DMA控制器,如STMicroelectronics的STM32F4系列中包含的控制器,可以通過(guò)靈活的數據流分配和傳輸管理功能進(jìn)一步減輕CPU的負擔。 如圖左側所示,來(lái)自8個(gè)不同的通道DMA請求,并到仲裁器上,從而建立優(yōu)先級(編號較低的輸入通道,具有較高的優(yōu)先級)。然后激活最高優(yōu)先級的傳輸,傳輸到圖中右側的兩個(gè)AHB 主設備(存儲器端口和外設接口),提高了外設到存儲器傳輸的效率。這可能是DMA在基于CPU的設計中最常見(jiàn)的情況。 ![]() 圖 1 STM32F4系列DMA控制器(圖片來(lái)源于STMicroelectronics) 為每個(gè)路徑分配單獨的FIFO,如圖1中間所示,允許針對每個(gè)外設接口的特性調整FIFO特性。例如,FIFO的閾值級別(請求傳輸的深度)可以單獨設置為FIFO大小的¼,½或¾。這允許低速通道等待,直到FIFO幾乎滿(mǎn)了才進(jìn)行傳輸,以最小化開(kāi)銷(xiāo)。更快的通道會(huì )更早地啟動(dòng)傳輸,可能只有一半大小,以避免FIFO溢出。 我們來(lái)通過(guò)一個(gè)實(shí)例,來(lái)看看DMA怎么工作的。 實(shí)例:“使用 STM32 來(lái)控制 NeoPixels LED” 硬件部分采用STM32 開(kāi)發(fā)板,與 NeoPixel LED、燈帶、矩陣等相連接。 ![]() RGB NeoPixels實(shí)際上是WS2812智能控制LED。下面是WS2812 LED的3字節數據協(xié)議的結構,分別代表綠紅藍三個(gè)信息。 ![]() 圖 2 WS2812 LED的3字節數據協(xié)議的結構 使用計時(shí)器來(lái)PWM控制波形,然后配置DMA使CPU高效并且易于實(shí)施。 ![]() 圖 3 WS2812 LED的0和1位的計時(shí)圖 在軟件中,配置DMA, 選擇了“TIM2_CH3/UP”, 將方向改為“內存到外設”, 同時(shí),將優(yōu)先級改為“非常高”,最后保存.ioc 文件,以生成項目代碼。 ![]() 圖 4 配置DMA流,以便有效更新PWM信號的占空比 更多內容請看下面文章:使用 STM32 來(lái)控制 NeoPixels DMA的兩種模式 合理使用兩種DMA模式(兵乓模式與多數據包緩沖傳輸模式),可以幫助提高M(jìn)CU效率。 USB外設是一個(gè)很好的外設示例,早期的USB實(shí)現的最大吞吐量只有1.5 Mb/秒。隨著(zhù)更高性能的標準版本的出現。比如要接近12 Mbit/s全速USB標準的理論最大值。我們來(lái)看看,數據傳輸方面DMA如何幫助提高M(jìn)CU效率! 我們以Microchip的ATXMEGA16D4-MH舉例。 兵乓模式: 之前通常使用單個(gè)存儲器緩沖區進(jìn)行外設數據傳輸。如果數據緩沖區已滿(mǎn),MCU將響應NAK(否定確認)消息。接收到NAK后,主機將等待并稍后重試傳輸。它將繼續重試,直到MCU能夠成功接收數據。 ATXMEGA16D4-MH使用乒乓模式來(lái)消除這個(gè)問(wèn)題。乒乓模式使用兩個(gè)存儲單元(memory banks)進(jìn)行數據傳輸。當一個(gè)存儲單元滿(mǎn)時(shí),主機可以將數據傳輸到另一個(gè)存儲單元。在兩個(gè)存儲單元之間交替傳輸可以避免復審,并提高整體數據帶寬。 ![]() 圖 5 乒乓模式提高了效率(圖片來(lái)源于Microchip) 此外,如上圖所示,以乒乓模式還使MCU有更多時(shí)間來(lái)處理數據。如圖所示,沒(méi)有乒乓,CPU只能處理傳輸之間的數據。使用乒乓模式,CPU可以在傳輸周期的一部分時(shí)間內處理數據,并降低NAK被要求“趕上”數據處理要求的可能性。 多數據包緩沖傳輸模式 另一個(gè)很有用的模式,可以讓MCU的數據傳輸更高效。這個(gè)特性叫做“多數據包緩沖傳輸模式”。如果你要通過(guò)USB端口傳送的數據包,超過(guò)了全速USB的BULK傳輸模式所允許的最大值(64字節),那么就可以用上這個(gè)模式。以前,你需要在主機上把數據包分成小塊,然后在接收端把它們合并,這會(huì )增加中央處理器(CPU)的負擔。不過(guò)現在,多數據包緩沖功能加入了USB設備,它會(huì )在數據包超過(guò)USB標準大小時(shí)自動(dòng)幫你分割和合并數據。重要的是,這個(gè)模式還能減少中斷的次數,因為只有在整個(gè)傳輸結束后才需要中斷CPU。這意味著(zhù),CPU可以處理其他任務(wù),或者進(jìn)入休眠模式,直到整個(gè)傳輸完成并且準備好處理。 總結: 合理利用DMA控制器,可以減輕減輕CPU的負擔,事半功倍。結合“乒乓緩沖”和“多傳輸模式”,你可以把傳輸的帶寬從基準BULK傳輸模式的5.6 Mb/s提升到8.7 Mbits/s,這是一個(gè)不小的提升。更重要的是,在使用這兩個(gè)功能的情況下,CPU的負擔從基準的46%降低到只有9%。這兩個(gè)功能的結合,不僅在性能上有所改進(jìn),而且還能節省能源。 |