新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32筆記之十三:惡搞,兩只看門狗

        STM32筆記之十三:惡搞,兩只看門狗

        作者: 時間:2016-11-26 來源:網(wǎng)絡 收藏
        a)目的:

        了解兩種看門狗(我叫它:系統(tǒng)運行故障探測器和獨立系統(tǒng)故障探測器,新手往往被這個并不形象的象形名稱搞糊涂)之間的區(qū)別和基本用法。

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

        b)相同:

        都是用來探測系統(tǒng)故障,通過編寫代碼定時發(fā)送故障清零信號(高手們都管這個代碼叫做“喂狗”),告訴它系統(tǒng)運行正常。一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無法執(zhí)行,其計數(shù)器就會計數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開始叫喚),控制CPU重啟整個系統(tǒng)(不行啦,開始咬人了,快跑……)。

        c)區(qū)別:

        獨立看門狗Iwdg——我的理解是獨立于系統(tǒng)之外,因為有獨立時鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測器。(這條狗是借來的,見誰偷懶它都咬!)主要用于監(jiān)視硬件錯誤。

        窗口看門狗wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測器,時鐘與系統(tǒng)相同。如果系統(tǒng)時鐘不走了,這個狗也就失去作用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管!)主要用于監(jiān)視軟件錯誤。

        d)初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過程也差不多初始化函數(shù)栓一起了,用的時候根據(jù)情況刪減。

        void WDG_Configuration(void);

        e)初始化函數(shù)調(diào)用:

        WDG_Configuration();

        f)初始化函數(shù)

        void WDG_Configuration()//看門狗初始化

        {

        //軟件看門狗初始化

        WWDG_SetPrescaler(WWDG_Prescaler_8); //時鐘8分頻4ms

        // (PCLK1/4096)/8= 244 Hz (~4 ms)

        WWDG_SetWindowValue(65);//計數(shù)器數(shù)值

        WWDG_Enable(127);//啟動計數(shù)器,設置喂狗時間

        // WWDG timeout = ~4 ms * 64 = 262 ms

        WWDG_ClearFlag();//清除標志位

        WWDG_EnableIT();//啟動中斷

        //獨立看門狗初始化

        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//啟動寄存器讀寫

        IWDG_SetPrescaler(IWDG_Prescaler_32);//40K時鐘32分頻

        IWDG_SetReload(349);//計數(shù)器數(shù)值

        IWDG_ReloadCounter();//重啟計數(shù)器

        IWDG_Enable();//啟動看門狗

        }

        g)RCC初始化:只有軟件看門狗需要時鐘初始化,獨立看門狗有自己的時鐘不需要但是需要systic工作相關設置。

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

        h)獨立看門狗使用systic的中斷來喂狗,所以添加systic的中斷打開代碼就行了。軟件看門狗需要在NVIC打開中斷添加如下代碼:

        NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; //通道

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先中斷等級

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//響應中斷優(yōu)先級

        NVIC_Init(&NVIC_InitStructure);//打開中斷

        i)中斷程序,軟件看門狗在自己的中斷中喂狗,獨立看門狗需要使用systic的定時中斷來喂狗。以下兩個程序都在stm32f10x_it.c文件中。

        void WWDG_IRQHandler(void)

        {

        WWDG_SetCounter(0x7F);//更新計數(shù)值

        WWDG_ClearFlag();//清除標志位

        }

        void SysTickHandler(void)

        {IWDG_ReloadCounter();//重啟計數(shù)器(喂狗)

        }

        j)注意事項:

        i.有狗平常沒事情可以不理,但是千萬別忘了喂它,否則死都不知道怎么死的!

        ii.初始化程序的調(diào)用一定要在systic的初始化之后。

        iii.獨立看門狗需要systic中斷來喂,但是systic做別的用處不能只做這件事,所以我寫了如下幾句代碼,可以不影響systic的其他應用,其他systic周期代碼也可參考:

        第一步:在stm32f10x_it.c中定義變量

        int Tic_IWDG;//喂狗循環(huán)程序的頻率判斷變量

        第二步:將SysTickHandler中喂狗代碼改為下面:

        Tic_IWDG++;//變量遞增

        if(Tic_IWDG>=100)//每100個systic周期喂狗

        {IWDG_ReloadCounter();//重啟計數(shù)器(喂狗)

        Tic_IWDG=0;//變量清零

        }


        關鍵詞: STM32看門

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 时尚| 阿拉尔市| 吴川市| 霸州市| 武隆县| 珠海市| 龙山县| 永安市| 祁东县| 绥中县| 葵青区| 永州市| 郸城县| 广宁县| 阳山县| 沙湾县| 兴文县| 驻马店市| 崇义县| 莱芜市| 崇明县| 乌拉特后旗| 象州县| 泗洪县| 曲麻莱县| 潞西市| 永福县| 河北省| 仪陇县| 大丰市| 通州区| 兰溪市| 拉萨市| 怀仁县| 洛阳市| 内江市| 德江县| 仁布县| 雷山县| 改则县| 盐源县|