STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然有效。這里需要注意獨立看門狗的時鐘是一個內部 RC 時鐘,所以并不是準確的 40Khz,而是在 30~60Khz 之間的一個可變化的時鐘,只是我們在估算的時候,以 40Khz 的頻率來計算,看門狗對時間的要求不是很精確,所以,時鐘有些偏差,都是可以接受的。
看門狗的原理
單片機系統在外界的干擾下會出現程序跑飛的現象導致出現死循環,看門狗電路就是為了避免這種情況的發生。看門狗的作用就是在一定時間內(通過定時計數器實現)沒有接收喂狗信號(表示MCU已經掛了),便實現處理器的自動復位重啟(發送復位信號)
下面我們在了解幾個與獨立看門狗相關聯的寄存器之后講解怎么通過庫函數來實現配置。
鍵值寄存器 IWDG_KR
在鍵值寄存器(IWDG_KR)中寫入 0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。無論何時,只要鍵寄存器 IWDG_KR 中被寫入 0xAAAA, IWDG_RLR 中的值就會被重新加載到計數器中從而避免產生看門狗復位 。
IWDG_PR 和 IWDG_RLR 寄存器具有寫保護功能。要修改這兩個寄存器的值,必須先向IWDG_KR 寄存器中寫入0x5555。將其他值寫入這個寄存器將會打亂操作順序,寄存器將重新被保護。重裝載操作(即寫入 0xAAAA)也會啟動寫保護功能。
預分頻寄存器IWDG_PR
該寄存器用來設置看門狗時鐘的分頻系數。
重裝載寄存器IWDG_RLR
該寄存器用來保存重裝載到計數器中的值。該寄存器也是一個32位寄存器,但是只有低 12 位是有效的。
只要對以上三個寄存器進行相應的設置,我們就可以啟動 STM32 的獨立看門狗,啟動過程可以按如下步驟實現:
1)取消寄存器寫保護(向 IWDG_KR 寫入 0X5555)
通過這步,我們取消 IWDG_PR 和IWDG_RLR 的寫保護,使后面可以操作這兩個寄存器,設置 IWDG_PR 和 IWDG_RLR 的值。這在庫函數中的實現函數是:
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
1
這個函數非常簡單,顧名思義就是開啟/取消寫保護,也就是使能/失能寫權限。
2)設置獨立看門狗的預分頻系數和重裝載值
設置看門狗的分頻系數的函數是
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //設置 IWDG 預分頻值
1
設置看門狗的重裝載值的函數是:
void IWDG_SetReload(uint16_t Reload); //設置 IWDG 重裝載值
1
設置好看門狗的分頻系數 prer 和重裝載值就可以知道看門狗的喂狗時間(也就是看門狗溢
出時間),該時間的計算方式為:
Tout=((4×2^prer) ×rlr) /40
其中 Tout 為看門狗溢出時間(單位為ms);prer 為看門狗時鐘預分頻值(IWDG_PR 值),范圍為 0~7;rlr 為看門狗的重裝載值(IWDG_RLR 的值);
比如我們設定 prer 值為 4,rlr 值為 625,那么就可以得到 Tout=64×625/40=1000ms,這樣,看門狗的溢出時間就是 1s,只要你在一秒鐘之內,有一次寫入 0XAAAA 到IWDG_KR,就不會導致看門狗復位(當然寫入多次也是可以的)。這里需要提醒大家的是,看門狗的時鐘不是準確的 40Khz,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。
3)重載計數值喂狗(向 IWDG_KR 寫入 0XAAAA)
庫函數里面重載計數值的函數是:
IWDG_ReloadCounter(); //按照 IWDG 重裝載寄存器的值重裝載 IWDG 計數器
1
通過這句,將使 STM32 重新加載IWDG_RLR 的值到看門狗計數器里面。即實現獨立看門狗的喂狗操作。
4) 啟動看門狗(向 IWDG_KR 寫入 0XCCCC)
庫函數里面啟動獨立看門狗的函數是:
IWDG_Enable(); //使能 IWDG
1
通過這句,來啟動 STM32 的看門狗。注意IWDG 在一旦啟用,就不能再被關閉!想要關
閉,只能重啟,并且重啟之后不能打開IWDG,否則問題依舊,所以在這里提醒大家,如果不用 IWDG 的話,就不要去打開它,免得麻煩。
通過上面 4 個步驟,我們就可以啟動 STM32 的看門狗了,使能了看門狗,在程序里面就必須間隔一定時間喂狗,否則將導致程序復位。
完整的程序
//初始化獨立看門狗
//prer:分頻數:0~7(只有低3位有效!)
//分頻因子=4*2^prer.但最大值只能是256!
//rlr:重裝載寄存器值:低11位有效.
//時間計算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對寄存器IWDG_PR和IWDG_RLR的寫操作
IWDG_SetPrescaler(prer); //設置IWDG預分頻值:設置IWDG預分頻值為64
IWDG_SetReload(rlr); //設置IWDG重裝載值
IWDG_ReloadCounter(); //按照IWDG重裝載寄存器的值重裝載IWDG計數器
IWDG_Enable(); //使能IWDG
}
//喂獨立看門狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
上一篇:案例說明stm32官方庫函數使用方法 (庫版本v3.5, Keil MDK 5)
下一篇:STM32官方標準固件庫開發與寄存器開發的區別
推薦閱讀
史海拾趣
國光新業深知技術創新是企業發展的核心動力。截至目前,公司已擁有授權專利78項,其中發明專利30項,實用新型專利48項,還有數十項專利正在實質審查中。這些專利的積累,不僅彰顯了公司在電容器領域的深厚技術底蘊,更為公司產品的持續升級與市場競爭力的提升提供了有力保障。公司還主導起草了兩項該類高分子電容器國家標準,進一步鞏固了其在行業內的領先地位。
在電子行業的早期,Charcroft Electronics Ltd公司以其對新興技術的敏銳洞察力和創新研發能力脫穎而出。公司不斷投入研發資源,開發出一系列具有競爭力的電子元器件產品,這些產品以其優異的性能和穩定性贏得了市場的廣泛認可。同時,公司還積極與高校和研究機構合作,共同探索新的技術應用領域,為公司的長遠發展奠定了堅實的基礎。
經過多年的發展,重慶平洋電子有限公司已經成長為一家中型規模的電子企業,產品廣泛應用于汽車、家電、通信等多個領域。面對未來,公司將繼續堅持技術創新和市場拓展并重的發展戰略,不斷提升產品質量和服務水平,努力成為電子行業的領軍企業。同時,公司還將積極拓展國際市場,參與全球競爭,為實現更加輝煌的未來而努力奮斗。
這五個故事只是重慶平洋電子有限公司發展歷程中的一部分縮影,但它們卻充分展示了公司在電子行業中的崛起之路和未來的發展前景。
在競爭激烈的電子照明市場中,Califia Lighting始終堅持以技術創新為核心競爭力。公司不斷投入研發資源,推動LED照明技術的升級和突破。通過引入先進的生產工藝和設計理念,Califia Lighting成功開發出了一系列具有獨特優勢的產品,如高效節能、長壽命、環保等,贏得了市場的廣泛認可。
隨著Avago的進一步發展和演變,CyOptics作為其子品牌也迎來了新的發展機遇。如今,Avago已經演變為Broadcom公司,而CyOptics則繼續以其在光學領域的專業技術和豐富經驗為Broadcom的產品線增添光彩。展望未來,CyOptics將繼續秉承其技術領先和創新驅動的理念,為全球客戶提供更加優質的光學產品和服務。
E-T-A公司自創立以來,一直由Ellenberger和Poensgen家族掌控。家族成員代代相傳,將公司的傳統和價值觀延續至今。同時,公司也注重培養新一代的管理和技術人才,為公司的持續發展注入新的活力。在家族傳承的基礎上,E-T-A公司不斷追求創新,致力于為客戶提供更加優質的產品和服務。
最近設計了一個LC帶通濾波器,中心頻率400MHz,帶寬120MHz,用ADS和Gensys都能生成比較理想的模型,但把實際的電感、電容的S2P文件帶入仿真, 卻波形面目全非,用的都是ATC的電感和電容,大家在設計時有沒有遇到這樣的問題,來討論一下吧!… 查看全部問答∨ |
|
使用F101C8T6操作PSAM,用的AN2598的例程,遇到這么個問題,使用ULINK仿真全速運行,對PSAM的操作是正常的,但是不 ...… 查看全部問答∨ |
|
我用TPS767D318給2810DSP供電,3.3V和1.8V之間的二極管可以省掉么?如果不能省掉,選用什么樣的二極管? 我的板子上把兩個二極管給拿掉了,3.3V輸出很正常,1.8V的輸出很不穩定,用萬用表測量,在0-1.8V之間變化,用示波器看不 ...… 查看全部問答∨ |