新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32之獨立看門狗

        STM32之獨立看門狗

        作者: 時間:2016-11-28 來源:網絡 收藏
        實驗現象:

        開始LED1亮,LED2熄滅,若不隔時間按KEY1則發現LED2因獨立看門狗的作用使系統復位而不斷閃爍,若間斷的按KEY1則發現LED2不會閃爍,表明沒有復位。

        本文引用地址:http://www.104case.com/article/201611/322764.htm

        實驗平臺:

        基于STM32F103C8T6的彩屏開發板

        操作步驟:

        1)向IWDG_KR 寫入0X5555。
        通過這步,我們取消IWDG_PR 和IWDG_RLR 的寫保護,使后面可以操作這兩個寄存器。
        設置 IWDG_PR 和IWDG_RLR 的值。
        這兩步設置看門狗的分頻系數,和重裝載的值。由此,就可以知道看門狗的喂狗時間(也
        就是看門狗溢出時間),該時間的計算方式為:
        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,所以在喂狗的時候,最好不要太晚了,否則,有可能發生看門狗復位。

        2)向IWDG_KR 寫入0XAAAA。
        通過這句,將使STM32 重新加載IWDG_RLR 的值到看門狗計數器里面。也可以用該命令
        來喂狗。
        3)向IWDG_KR 寫入0XCCCC。
        通過這句,來啟動 STM32 的看門狗。注意IWDG 在一旦啟用,就不能再被關閉!想要關
        閉,只能重啟,并且重啟之后不能打開IWDG,否則問題依舊,所以在這里提醒大家,如果不
        用IWDG 的話,就不要去打開它,免得麻煩。
        通過上面 3 個步驟,我們就可以啟動STM32 的看門狗了,使能了看門狗,在程序里面就
        必須間隔一定時間喂狗,否則將導致程序復位。利用這一點,我們通過一個LED 燈來指
        示程序是否重啟,來驗證STM32 的獨立看門狗

        程序部分代碼:

        watchdong.h

        #ifndef WATCHDOG_H
        #define WATCHDOG_H
        void WatchDog_Init(u8, u16);//申明看門狗的初始化函數
        void WatchDog_Feed(void);//申明喂狗的函數
        #endif

        watchdong.c

        #include"common.h"
        #include"watchdog.h"
        //看門狗初始化,參數:prer-分頻,reld-計數器重裝載值
        void WatchDog_Init(u8 prer, u16 reld)
        {
        IWDG->KR=0x5555; //允許訪問PR和RLR寄存器
        IWDG->PR=prer;//設置分頻
        IWDG->RLR=reld; //設定計數器初值
        IWDG->KR=0xaaaa;//初次裝初值
        IWDG->KR=0xcccc;//啟動看門狗定時器
        }

        //喂狗
        void WatchDog_Feed(void)
        {
        IWDG->KR=0xaaaa;
        }
        該代碼就2 個函數,void IWDG_Init(u8 prer,u16 rlr)是獨立看門狗初始化函數,就是按照
        上面介紹的步驟來初始化獨立看門狗的。該函數有2 個參數,分別用來設置與預分頻數與重裝
        寄存器的值的。通過這兩個參數,就可以大概知道看門狗復位的時間周期為多少了。其計算方
        式上面有詳細的介紹,這里不再多說了。
        void IWDG_Feed(void)函數,該函數用來喂狗,因為STM32 的喂狗只需要向鍵值寄存器寫
        入0XAAAA 即可,

        主函數
        #include
        #include"common.h"
        #include"led.h"
        #include"key.h"
        #include"watchdog.h"
        int main(void)
        {
        u8 temp2;
        Stm32_Clock_Init(9);//系統時鐘設置
        delay_init(72);//延時初始化
        LED_Init();//LED初始化
        KEY_Init();
        WatchDog_Init(4,625);//看門狗初始化
        LED1=1;
        LED2=0;
        while(1)
        {
        temp2=KEY_Scan(); //讀取按鍵值
        if(temp2==1)
        WatchDog_Feed();//喂狗

        }
        }



        關鍵詞: STM32獨立看門

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 突泉县| 正安县| 巴南区| 大兴区| 张北县| 洪雅县| 当阳市| 故城县| 钦州市| 贡觉县| 克什克腾旗| 玉溪市| 丁青县| 鄂托克前旗| 宝清县| 弥渡县| 康保县| 长顺县| 嵩明县| 浦北县| 厦门市| 绍兴市| 米泉市| 马边| 德保县| 崇明县| 尚志市| 武隆县| 永康市| 望奎县| 镇沅| 巫溪县| 新平| 寿光市| 和田市| 永春县| 水城县| 巴林右旗| 三门县| 阳信县| 信宜市|