stm32獨立看門狗實驗


//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秒中內按下,就不會復位重啟。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM