STM32的普通定時器有四路輸出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用輸出比較的方法產生不同頻率的方波輸出,簡單的方法是: 1)設置計數器為向上計數模式,將自動重裝載寄存器設置為0xFFFF;這樣計數器會循環計數。 2)每個定時器通道設置為輸出比較模式,并設置比較匹配時對應的輸出管腳翻轉輸出。 3)按照輸出波形的半波周期計算出一個數值稱作Half_Cyc。例如:定時器的時鐘頻率是72MHz,需要產生3456Hz的方波,則Half_Cyc = 72M/(3456*2) = 41667;如需要產生200kHz的方波,則Half_Cyc = 72M/(200k*2) = 180。 4)設置每個通道在輸出比較匹配時產生中斷,在中斷中將比較寄存器的數值讀出并加上Half_Cyc的數值,如果計算出的數值超過16位則舍棄超出的部分,再把這個新的數值寫回相應的比較寄存器;這樣下次比較成功將剛好發生在一個半波周期之后,對應的管腳將被翻轉。 上述方法在要求頻率不高時十分有效,但如果頻率較高時會有頻繁的中斷產生,這時可以使用DMA加以改善。 上述方法的基礎是通過不斷改變輸出比較的匹配點進而產生管腳翻轉輸出,我們可以事先計算好這些比較匹配點,并通過DMA在每次匹配時逐次更新比較寄存器的內容: 方法一、使用兩個DMA緩沖區,在DMA控制器操作一個緩沖區時,程序計算好另一個緩沖區的數據,然后在DMA傳輸結束的中斷處理中切換DMA操作的緩沖區。 方法二、使用一個大的DMA緩沖區,先計算好半個緩沖區的內容,啟動DMA為循環模式并設置它在DMA傳送一半和完成時均產生中斷;啟動DMA后繼續計算好另外半個緩沖區的內容,當發生DMA中斷時表示有一半緩沖區變空,這時在中斷處理中計算好這半個緩沖區。 只要DMA緩沖區開的足夠大,方法二可以保證CPU有充足的時間進行數據處理,并且保證不斷地輸出波形。 聲明:以上說明沒有經過實際驗證,只是一個原理說明,也許還有沒考慮周全的地方。 最初發表日期:2008-7-16 |