STM32學習筆記詳解 輸出比較與輸入捕獲

2021-10-08 15:36:25 字數 3381 閱讀 2051

針對stm32f103rc學習過程中遇到的較為複雜、難以理解的地方,此處對其進行詳細分析,以避免學習筆記中容易出錯、混淆、看不懂的地方

基於正點原子alientekmini版,由於其手冊對於部分模組的講解有些模糊,此處記錄一些個人理解,便於日後重溫

輸出比較是對於已有的訊號,自定義要求,當計數器滿足要求時,便輸出有效,否則輸出無效(可以是電平,也可以是模擬訊號)

pwm是輸出比較的特例,通過定時器產生規律的訊號,例如三角波、鋸齒波、正弦波等,而一般輸出比較僅產生矩形波

輸入捕獲與輸出比較對立,是檢查輸入引腳獲取到的訊號,通過通用/高階定時器timx,對其時間相關的引數進行測定,例如脈寬、頻率、週期、占空比等。

主要依靠對輸入訊號的邊沿(上公升/下降)進行抓取,通過定時器進行計數,來達到其目的。

除此之外,輸入捕獲還有自帶的濾波降噪等簡單的訊號處理。

了解輸入捕獲的應用場景,如何配置相關的暫存器,如何對已有的訊號進行分析,並得到其資訊

接下來以乙個小實驗為例,實驗目標:

1、通過pwm產生乙個規律的三角波訊號(具體電壓值、頻率等無嚴格要求),並通過乙個led展示(由亮到滅,再由滅到亮)

2、通過按鍵產生電平序列,獲得不規則的矩形波

3、對於獲得的矩形波,測量其脈寬,並通過串列埠輸出展示,得到按鍵按下的時間

pwm脈寬調變,將單一的電平訊號,按照其占空比,輸出乙個模擬電量,可用其設計產生一些規律的訊號,例如矩形波、三角波、鋸齒波等

pwm輸出模式只能由高階定時器tim1/tim8產生,配置為pwm模式,我們設定ch1輸出

需要配置的暫存器有:

外設時鐘使能暫存器rcc_apb2enr:將輸出通道的時鐘使能

埠配置暫存器gpiox_crh/crl:輸出通道對應的io口設定為復用輸出

捕獲/比較模式暫存器timx_ccmrn:設定pwm模式、啟用預裝載

捕獲/比較使能暫存器timx_ccer:oc1輸出使能

捕獲比較暫存器timx_ccrn:輸出比較值

剎車和死區暫存器timx_bdtr:主輸出使能

自動重裝載暫存器timx_arr:設定計數值

預分頻器timx_psc:設定預分頻

控制暫存器timx_cr1:自動重裝載預裝載允許

pwm頻率 = tclk1 / ((arr+1)*(prer+1)),輸出頻率應與之接近

占空比γ = tim1_ccrn / arr

輸出電壓u = γ*標準電壓vcc

對於已有訊號,檢測其有效起始點(上公升/下降沿),啟動計時直至有效終止點,獲取訊號的週期、頻率、脈寬、占空比等資訊

輸入捕獲可由通用定時器timx產生,配置為輸入捕獲模式,我們設定ch3輸入

需要配置的暫存器有:

外設時鐘使能暫存器rcc_apb2enr:將輸出通道的時鐘使能、timx時鐘使能

埠配置暫存器gpiox_crh/crl:輸出通道對應的io口設定為電平輸入

捕獲/比較模式暫存器timx_ccmrn:設定濾波器,對映到ti3

捕獲/比較使能暫存器timx_ccer:上公升/下降沿捕獲

dma/中斷使能暫存器timx_dier:允許捕獲中斷、允許更新中斷

捕獲比較暫存器timx_ccrn:輸入捕獲值

自動重裝載暫存器timx_arr:設定計數值

預分頻器timx_psc:設定預分頻

控制暫存器timx_cr1:使能定時器

由於stm32計數器非常快,所以對於按鍵來說,按下的時間很容易因為遠大於超時值,導致計數器溢位,因此需要對以下情況進行處理,並以此編寫輸入捕獲中斷程式

如上圖所示,分為五種可能性,因此需要對所有情況進行分析處理

①②為正常的開始和結束,分別需要開始計時直至終止,和停止計時、傳送資料並等待下一次開始

③是處於無效的區段,此時可以任憑計數器計時(反正每次開始都會清空一次計數),但是此時不進行任何資料處理或傳送

④當有效時間較長時,會導致計數器溢位,此時我們可以通過對溢位計次,然後清空計數器接著計數,直到最後有效電平結束後,對時間進行乙個統一折算

⑤當時間非常長時,不僅計數器溢位,而且溢位次數過多,導致儲存溢位次數的暫存器都不夠用時,我們只能通過擴大暫存器容量,或者再新增一級暫存器,用於儲存「溢位次數暫存器」的溢位次數,否則只能進行強制停止,將最大資料發出,並重新等待下一次上公升沿

脈寬pulsewidth = 溢位次數*最大計時+最後一次計時

主要用來對比學習,注意哪些暫存器需要配置,如何配置,以及暫存器的配置順序,僅供參考

/*

定時器tim1_ch1 pwm輸出初始化

psc 預分頻值

arr 計數器值

*/void tim1_pwm_init(u16 arr,u16 psc)

//定時器tim2_ch3 輸入捕獲初始化

void tim2_cap_init(u16 arr,u16 psc)

/*捕獲狀態

為了減少變數和呼叫方便,我們將其假設為乙個暫存器使用

[7]:是否完成捕獲,0表示未完成,1表示完成

[6]:捕獲低電平,0表示未捕獲低電平,1表示捕獲低電平

[5:0]:捕獲高電平後,計數器溢位次數

*/u8 state=0;

//捕獲值

u16 value=0;

//輸入捕獲tim2中斷服務程式

void tim2_irqhandler(void)

else state++;

} if(tim2->sr&0x08) //捕獲到東西了

else if((state&0x40)==0) //未捕獲過低電平(說明此次捕獲為下降沿)

}} tim2->sr=0; //清空中斷標誌位,上述任一情況發生均需要清空標誌位,如果無情況發生則原本就為0

}

extern u8 state;

extern u16 value;

int main()

}}

在結果之前,需要注意以下事宜:

1、埠:pwm對應ch1,輸入捕獲對應ch3

2、對於結果顯示部分,led應與ch1相連,按鍵應與ch3相連,串列埠連線至電腦

3、按鍵、led及串列埠通訊的軟硬體設計此處略過,如果有不懂,參照stm32學習筆記(未更新)

實驗結果:led由亮變暗,再由暗變亮,串列埠工具顯示固定值時間資料

串列埠展示按鍵按下的時間,如下圖所示,圈出部分為最大計時值,按下時間太長則顯示此數值

STM32學習筆記

剛到公司實習,要學習stm32開發,boss給了一塊戰艦開發板,讓我自己寫乙個功能要用在公司的產品上。難啊。以前根本沒接觸過stm32,只能一步一步慢慢來,利用晚上利用週末惡補一下。哎,算是為了大學前兩年還債吧。一 跑馬燈實驗 gpio輸出 實驗環境 keil4 實驗平台 戰艦stm32開發板 gp...

stm32學習筆記

開漏模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將埠 置於高阻狀態 p mos從 被啟用 推挽模式輸出 輸出暫存器上的 0 啟用 n mos,而輸出暫存器上的 1 將啟用 p mos。上拉輸入 輸入高電平,然後接乙個 上拉電阻 保護作用 讀取此時的引腳電平為高電平 下拉輸入...

學習筆記 stm32

簡介cortex核心 cortex m4核心 庫開發與暫存器開發的關係 stm32 韌體庫與 cmsis 標準 內部結構 最小系統 小馬哥四軸原始碼學習 新建工程 點燈!gpio 按鍵暫存器對映 時鐘系統 systick定時器 埠復用和重對映 串列埠串列埠試驗函式分析 中斷看門狗 通用定時器 階段性...