//ALIENTEK Mini STM32開發板V1.9范例代碼5
//獨立看門狗實驗
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
STM32F103RBT6屬於中容量版本的mcu
看門狗的原理:單片機系統在外界的干擾下會出現程序跑飛的現象導致出現死循環,看門狗電路就是為了避免這種情況的發生。看門狗的作用就是在一定時間內(通過定時計數器實現)沒有接收喂狗信號(表示 MCU 已經掛了),便實現處理器的自動復位重啟(發送復位信號) 。
以下摘自《不完全手冊——庫函數》文檔
STM32 的獨立看門狗由內部專門的 40Khz 低速時鍾驅動,即使主時鍾發生故障,它也仍然有效。這里需要注意獨立看門狗的時鍾是一個內部 RC 時鍾,所以並不是准確的 40Khz,而是在 30~60Khz 之間的一個可變化的時鍾,只是我們在估算的時候,以 40Khz 的頻率來計算,看門狗對時間的要求不是很精確,所以,時鍾有些偏差,都是可以接受的。
在鍵寄存器(IWDG_KR)中寫入 0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。 無論何時,只要鍵寄存器 IWDG_KR 中被寫入 0xAAAA, IWDG_RLR 中的值就會被重新加載到計數器中從而避免產生看門狗復位 。
IWDG_PR 和 IWDG_RLR 寄存器具有寫保護功能。要修改這兩個寄存器的值,必須先向IWDG_KR 寄存器中寫入 0x5555。將其他值寫入這個寄存器將會打亂操作順序,寄存器將重新被保護。重裝載操作(即寫入 0xAAAA)也會啟動寫保護功能。
接下來,我們介紹預分頻寄存器(IWDG_PR),該寄存器用來設置看門狗時鍾的分頻系數,最低為 4,最高位 256,該寄存器是一個 32 位的寄存器,但是我們只用了最低 3 位,其他都是保留位。
比如我們設定 prer 值為 4,rlr 值為3* 625,那么就可以得到 Tout=3*64×625/40=3000ms,這樣,看門狗的溢出時間就是 3s,只要你在一秒鍾之內,有一次寫入 0XAAAA 到 IWDG_KR,就不會導致看門狗復位(當然寫入多次也是可以的)。這里需要提醒大家的是,看門狗的時鍾不是准確的 40Khz,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。
int main(void) { SystemInit(); delay_init(72); //延時初始化 NVIC_Configuration(); uart_init(9600); LED_Init(); KEY_Init(); //按鍵初始化 printf("\r\n程序啟動:\r\n"); delay_ms(300); //讓人看得到滅 IWDG_Init(IWDG_Prescaler_64,1875); LED0=0; //點亮LED0 while(1) { if(KEY_Scan() == 3) IWDG_Feed();//如果WK_UP按下,則喂狗 delay_ms(10); }; }
在main函數中,我添加了一個
printf("\r\n程序啟動:\r\n");語句,用於查看mcu是否有重新啟動。
實驗結果:
如果沒有任何干預,系統將在大約3秒中時間后就自動復位重啟,如果wakeup按鍵在3秒中內按下,就不會復位重啟。