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