STM32系列微控制器是ST公司基于Cortex-M3內(nèi)核的高集成度的微控制器,。它在性能,、價格、功耗和實時性方面樹立了一個新的標(biāo)桿,,集成了Cortex-M3內(nèi)核,,以及雙ADC、多用途的通用時鐘TIMx,、RTC,、I2C,、SPI、UART,、CAN,、DMA、USB等豐富的外設(shè),。其功耗在全速72MHz所有模塊都打開時也僅僅為36 mA,,在低功耗模式下其功耗僅為2μA。
2 DMA和TIMx簡介
STM32系列微控制器均含有DMA和通用時鐘TIMx模塊,。其低端型號中僅包含DMA1,,支持7個通道;高端型號還包括DMA2,,支持5個通道,。它的每個通道可任意指定工作模式,如內(nèi)存到內(nèi)存,、內(nèi)存到外設(shè)或外設(shè)到內(nèi)存等,。當(dāng)涉及到外設(shè)時,一般是由外設(shè)來觸發(fā)DMA的一次傳輸,,如串口收到數(shù)據(jù)的標(biāo)志位可觸發(fā)DMA,。
DMA的每次傳輸都分為4個階段:申請仲裁、地址計算,、總線存取和應(yīng)答,。除總線存取階段,其他3個階段都只需要一個系統(tǒng)周期,,并且不占用總線,,可在DMA控制器內(nèi)部并發(fā)地執(zhí)行??偩€存取階段,,每個字(4字節(jié))的傳輸需要3個系統(tǒng)周期。DMA和CPU工作在交替方式下,,不會相互阻塞,。DMA各個通道可獨(dú)立設(shè)置優(yōu)先級,當(dāng)訪問同一資源時高優(yōu)先級通道先獲得資源,。
DMA的使用比較簡單,,每路DMA僅包括4個寄存器,用于指定DMA的工作模式,、源地址、目標(biāo)地址和傳輸次數(shù),。ST公司提供了很好的驅(qū)動庫,,簡化了外設(shè)的使用,,方便閱讀和移植。本文采用庫函數(shù)來展示功能,。
其通用時鐘是很有特色的外圍模塊,,可實現(xiàn)多種復(fù)雜的功能。時鐘模塊內(nèi)部主要包含一個計數(shù)器和4個通道的比較/捕獲寄存器,。時鐘可工作在捕獲或比較模式,。在捕獲模式下,若有對應(yīng)的觸發(fā)信號,,計數(shù)器的值會保存到比較/捕獲寄存器,,并觸發(fā)中斷或DMA;在比較模式下,,若計數(shù)器的值與比較/捕獲寄存器的值相等,,則對外輸出預(yù)選設(shè)定好的信號,如高電平,、低電平或電平反轉(zhuǎn)等,。
3 采用DMA+TIMx實現(xiàn)多路方波的產(chǎn)生
采用時鐘的4個比較/捕獲通道加DMA可以產(chǎn)生出4路不同頻率和占空比的方波。這里為簡化篇幅,,只列出了產(chǎn)生一路方波的代碼,。基本原理是:將時鐘的4個通道設(shè)置為反轉(zhuǎn)模式(即計數(shù)器與比較捕獲寄存器相等時,,其對應(yīng)的CPU引腳電平發(fā)生反轉(zhuǎn)),,設(shè)置計數(shù)器為向上計數(shù)到0xFFFF的模式;然后預(yù)先計算好需要引腳反轉(zhuǎn)的時刻,,并使能對應(yīng)通道的DMA請求,。這樣,當(dāng)計數(shù)器與比較/捕獲寄存器的值相等時,,由DMA將下一個需要引腳電平反轉(zhuǎn)的時刻送入到比較/捕獲寄存器,。
這里將DMA設(shè)置為從內(nèi)存到外設(shè)的半字(2個字節(jié))環(huán)形傳輸。開啟DMA全滿和半滿中斷,,在中斷處理函數(shù)中不斷填充新的時刻值,,即可保證產(chǎn)生的波形不間斷。假設(shè)存放時刻值的緩沖長度為N,,則每N/2個點(diǎn)才中斷一次,,這樣CPU就不需要頻繁進(jìn)入中斷,執(zhí)行效率比較高,。由此也可以看出,,緩沖越大,對中斷響應(yīng)的實時性要求也越低,,當(dāng)然這時中斷的處理時間也越長,。以下為示例代碼:
需要注意的是,,比較/捕獲寄存器的預(yù)加載功能必須禁止掉。我們需要的是寫入比較/捕獲寄存器的值立即與計數(shù)器相比較輸出,,而無需等待一個更新事件,。
4 采用DMA+TIMx實現(xiàn)多路方波的捕獲
假設(shè)有一個方波需要記錄并分析。一種方案是設(shè)置CPU引腳在上升沿和下降沿中斷,,然后在中斷中記錄該時刻,。這種處理方式的實時性和效率會差一些,因為進(jìn)出中斷本身就需要一定的指令周期(Cortex-M3為12+12或6+12個系統(tǒng)周期),,而且需要考慮多個中斷同時發(fā)生的最壞情況,,對可檢測方波的最大頻率有一定的限制。另一種方案是采用輪詢的方式不斷查詢該引腳的狀態(tài)并記錄上升沿和下降沿的時刻,,這種方式下系統(tǒng)幾乎不能處理其他的任務(wù)了,。
采用DMA+TIMx的方式來捕獲上升沿和下降沿時刻,有利于提高系統(tǒng)的實時性和執(zhí)行效率,。通過TIMx的捕獲功能將方波的電平跳變時刻記錄在比較/捕獲寄存器中,,然后DMA將該值自動傳輸?shù)絻?nèi)存,只有當(dāng)DMA觸發(fā)半滿或全滿事件時CPU才需要進(jìn)入中斷處理數(shù)據(jù),。通過記錄方波的上升沿和下降沿時刻,,然后將兩個時刻相減,進(jìn)而就能得到所有低沿和高沿的寬度,,最后進(jìn)行后續(xù)的分析處理,。這種方式下中斷頻率僅為方波頻率的4/N(N為緩沖區(qū)大小),。
圖1為TIMx工作在捕獲模式下一個通道的示意圖,。
其中TI1為CPU引腳的輸入,經(jīng)過濾波(新的電平必須保持一定時間才認(rèn)為有效,,以防止高頻噪聲的干擾)后進(jìn)入后繼的邊沿極性選擇,,最后經(jīng)過分頻作為捕獲信號的輸入。這里TI2F為相鄰?fù)ǖ澜?jīng)過濾波后的信號,,也就是說一個引腳的信號可作為TIMx兩個通道的輸入捕獲信號,,這樣信號只需要接一個CPU引腳就可以觸發(fā)兩個時鐘通道了。
將輸入方波接到CPU一個引腳上,,假設(shè)該引腳對應(yīng)于圖上的TI1,,設(shè)定其在下降沿觸發(fā)通道1的捕獲事件,而其在上升沿觸發(fā)通道2的捕獲事件,,事件發(fā)生后申請DMA將捕獲的比較/捕獲寄存器的值保存起來,。示例代碼如下:
其他部分與第3節(jié)中比較輸出的代碼基本一致。
5 總結(jié)
測試中STM32系列微控制器工作在36MHz,可產(chǎn)生出1路最高1.5MHz的方波,,可捕獲1MHz的方波,,而此時CPU的執(zhí)行幾乎不受影響,。這里采用DMA來實現(xiàn)方波的產(chǎn)生和捕獲,,極大地提高了系統(tǒng)的實時性和執(zhí)行效率,減少了中斷次數(shù),,節(jié)省了寶貴的資源,。這種方案也可以用來實現(xiàn)高效的模擬串口。
DMA的傳輸需要多個系統(tǒng)周期的,,例如采用DMA實現(xiàn)內(nèi)存到內(nèi)存的搬移,,每次傳輸需要5個系統(tǒng)周期,而內(nèi)存到外圍的一次傳輸需要2個APB周期+5個AHB周期,。這樣用上述方法產(chǎn)生的方波最小沿(低沿或高沿)為14個周期(包括比較/捕獲寄存器到內(nèi)部影子寄存器的傳輸?shù)龋?。若有更高的需求,?yīng)考慮其他的實現(xiàn)方案,。另外,,若有多個DMA同時工作,應(yīng)考慮最壞情況下DMA的響應(yīng)時間,,以避免錯誤發(fā)生,。