針對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定時器 埠復用和重對映 串列埠串列埠試驗函式分析 中斷看門狗 通用定時器 階段性...