在單片機(jī)的使用中,經(jīng)常會接觸到復(fù)位電路,它是單片機(jī)最小系統(tǒng)重要的一個構(gòu)成部分。同樣它也是非常重要的一部分。
復(fù)位就是讓單片機(jī)從初始化狀態(tài)開始重新運(yùn)行,即程序從頭開始執(zhí)行。復(fù)位電路設(shè)計的好壞,直接影響整個系統(tǒng)是否穩(wěn)定可靠。復(fù)位電路與單片機(jī)的RESET/NRST引腳相連,拿STM32系列單片機(jī)舉例,當(dāng)系統(tǒng)正常工作時,如果RESET引腳電壓低于某一閾值,則單片機(jī)進(jìn)入復(fù)位狀態(tài)。單片機(jī)的復(fù)位可分為低電平復(fù)位和高電平復(fù)位,這是由廠家決定的,區(qū)分的方式可以看數(shù)據(jù)手冊,手冊中的復(fù)位章節(jié)會寫清楚是什么電平復(fù)位。單片機(jī)的復(fù)位可以分為:上電復(fù)位、掉電復(fù)位、軟件復(fù)位、外部手動復(fù)位等。
上電復(fù)位:單片機(jī)每次上電都會給RESET腳一個復(fù)位信號,讓單片機(jī)從一個固定的相同狀態(tài)重新開始工作;
掉電復(fù)位:單片機(jī)復(fù)位引腳電壓低于某一閾值電位時,單片機(jī)會進(jìn)入復(fù)位狀態(tài)。
軟件復(fù)位:程序員執(zhí)行某一特定的復(fù)位指令,來使單片機(jī)進(jìn)行復(fù)位,或者當(dāng)程序在一定時間失去響應(yīng)的情況下通過看門狗電路控制單片機(jī)進(jìn)行復(fù)位。
外部手動復(fù)位可以通過一個復(fù)位按鍵讓死機(jī)或跑飛的程序重新運(yùn)行。
下面我們一起看一下常見的幾種復(fù)位電路。
圖1
圖2
圖1是最常見的低電平上電復(fù)位原理圖,我們來分析這個過程,上電前電容兩端電壓為0。上電后,電流從3.3V流經(jīng)電阻、電容到地,由于電容兩端電壓不能突變,所以上電瞬間RESET腳上電壓也為零,并保持一小段時間低電平,這段時間觸發(fā)單片機(jī)復(fù)位;隨著時間推移,電容兩端電壓太高超過某一閾值電位,復(fù)位完成。這個電阻、電容的取值大小影響到復(fù)位引腳電平的上升時間(電容的充電時間)。
圖2 手動按鍵復(fù)位原理圖,手動按鈕復(fù)位在GND和RESET之間接一個按鈕。當(dāng)人為按下按鈕時, RESET腳就會被GND拉為低電平,使單片機(jī)進(jìn)入復(fù)位狀態(tài),如果手不松掉,那么會一直處于復(fù)位狀態(tài),直至手松掉之后,復(fù)位引腳電平恢復(fù)。
ST單片機(jī)內(nèi)部的復(fù)位波形,上電的時候VDD大于Vpor并持續(xù)一定的時間,單片機(jī)脫離復(fù)位狀態(tài),掉電的時候Vdd電壓低于Vpdr電壓,單片機(jī)進(jìn)行復(fù)位。
軟件復(fù)位也分兩種,我們可以使用復(fù)位指令,直接使單片機(jī)進(jìn)行復(fù)位,另外一種使用單片機(jī)內(nèi)置看門狗,配置啟動看門狗,在主循環(huán)程序中每隔一定地時間刷新看門狗,俗稱喂狗。如果一定的時間沒有喂狗,可以認(rèn)為程序跑飛,則看門狗模塊會復(fù)位單片機(jī),內(nèi)置看門狗又分窗口看門狗和獨(dú)立看門狗,區(qū)別如下:
時鐘不同
1、獨(dú)立看門狗:獨(dú)立看門狗使用的是內(nèi)部專門的 40Khz低速時鐘,不需要使能時鐘操作。
2、窗口看門狗:窗口看門狗使用的是 PCLK1的時鐘,使用前需要先使能時鐘。
中斷不同
1、獨(dú)立看門狗:獨(dú)立看門狗沒有中斷,超時直接復(fù)位。
2、窗口看門狗:窗口看門狗可以在中斷中做復(fù)位前的函數(shù)操作,比如報錯一些數(shù)據(jù)等。
使用場景不同
1、獨(dú)立看門狗:獨(dú)立看門狗一般用于避免程序跑飛或者死循環(huán)。
2、窗口看門狗:窗口看門狗避免程序不安預(yù)定邏輯執(zhí)行,比如先于理想環(huán)境完成,或者后于極限時間超時。
當(dāng)然復(fù)位衍生出來的電路形態(tài)可能不止上述的兩種,但是基本上都是圍繞上述的電路進(jìn)行變換,最后強(qiáng)調(diào)一點,RESET的走線越短越好,復(fù)位電路一定要盡可能靠近MCU, 因為復(fù)位電路到單片機(jī)這一段的走線,可能會引入其他外界因素的干擾,是單片機(jī)處于不穩(wěn)定的狀態(tài)。關(guān)于復(fù)位的內(nèi)容就跟大家分享到這里,大家有沒有遇到過關(guān)于一些復(fù)位引起的問題呢?