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