新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32F4——獨立看門狗與窗口看門狗

        STM32F4——獨立看門狗與窗口看門狗

        作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
        一、簡介:

        其用于檢測和解決由軟件錯誤導(dǎo)致的故障,當(dāng)計數(shù)器達到設(shè)定的超時時間值時會產(chǎn)生系統(tǒng)復(fù)位。其特點為:1、其運用的時鐘是由獨立的RC振蕩器產(chǎn)生的,因此可以在待機和停止模式下運行。2、在看門狗激活后,如果遞減計數(shù)器的值達到0X000時會產(chǎn)生系統(tǒng)復(fù)位。

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

        二、功能簡述:

        通過向關(guān)鍵字寄存器(IWDG_KR)寫入0XCCCC啟動獨立看門狗,計數(shù)器會從復(fù)位值0XFFF,遞減計數(shù),當(dāng)計數(shù)器的值達到0X000時,產(chǎn)生復(fù)位信號。在計數(shù)值還未達到0X000時,向IWDG_KR寄存器寫入0XAAAA,IWDG_RLR寄存器的值就會重裝載到計時器,從而可以避免產(chǎn)生復(fù)位(俗稱喂狗)。從而可以看出,當(dāng)軟件運行出問題時,在一定的時間內(nèi)無法做到喂狗的功能時,就會產(chǎn)生系統(tǒng)復(fù)位,實現(xiàn)其對軟件故障的檢測和解決。

        三、相關(guān)寄存器:

        1、關(guān)鍵字寄存器:

        關(guān)鍵字寄存器的有效位為位0到位15,位16到位31保留,前邊已經(jīng)介紹過通過向該寄存器中寫入0XAAAA,可以使IWDG_RLR寄存器中的值重裝載到計數(shù)器,避免系統(tǒng)復(fù)位。由于IWDG_PR(預(yù)分頻器寄存器)和IWDG_RLR(重載寄存器)是具有寫保護的寄存器,在該寄存器中寫入鍵值0X5555可使能對IWDG_PR和IWDG_RLR的訪問。

        2、預(yù)分頻器寄存器:

        該寄存器的有效位為位0到位2,其他位保留,通過設(shè)置PR[2:0]的值,設(shè)定相應(yīng)的分頻系數(shù)。

        3、重載寄存器:

        上面已經(jīng)提到該寄存器中的值會重裝載到計數(shù)器中,計數(shù)器將會從該值遞減計數(shù),由此可見:該寄存器中的值和預(yù)分頻器寄存器中的值共同決定超時周期。

        4、狀態(tài)寄存器:

        該寄存器只有位0和位1為有效位,位0(RVU)為預(yù)分頻器寄存器的值更新標(biāo)志位,位1(PVU)為計數(shù)器重載值更新標(biāo)志。

        四、相關(guān)代碼分析:

        通過相關(guān)庫函數(shù)對獨立看門狗的配置還是相對簡單的,其中初始化的過程如下:

        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能對IWDG->PR IWDG->RLR的寫IWDG_SetPrescaler(prer); //設(shè)置IWDG分頻系數(shù)IWDG_SetReload(rlr);   //設(shè)置IWDG裝載值IWDG_ReloadCounter(); //reload(喂狗)IWDG_Enable();       //使能看門狗

        窗口看門狗

        一、簡介:

        對比獨立看門狗來看,所謂的窗口看門狗就是設(shè)定了一個窗口值(上限和下限值)。當(dāng)遞減計數(shù)器值小于0X40(窗口下限值)時產(chǎn)生復(fù)位。在設(shè)置的窗口外重載遞減計數(shù)器也會執(zhí)行復(fù)位。窗口看門狗可以設(shè)置提前喚醒中斷,當(dāng)遞減計數(shù)器等于0X40時會觸發(fā)該中斷,可以在該中斷中做喂狗等相關(guān)操作。

        二、框圖

        窗口看門狗的框圖如下:對比的框圖來看下邊的相關(guān)介紹!


        三、工作過程:

        通過設(shè)置WWDG_CR寄存器的WDGA位可以使能看門狗,遞減計數(shù)器為控制寄存器的低7位,其中當(dāng)?shù)?位(即T6)由1變?yōu)?(即由0X40遞減為0X3F)時就會復(fù)位,在配置寄存器低7位存放看門狗上限值,計數(shù)器中的值與上限值比較,如果在上限值之上喂狗也會執(zhí)行復(fù)位,這也是窗口看門狗與獨立看門狗的不同之處。由此可見,喂狗的時間只能在上限和下限值之間,否則就會執(zhí)行復(fù)位操作。

        四、相關(guān)寄存器:

        1、控制寄存器(WWDG_CR):

        前面已經(jīng)介紹過了,其中有效位為位0到位7,位7(WDGA)為看門狗激活位,位0到位6做計數(shù)器。

        2、配置寄存器(WWDG_CFR):

        該寄存器的有效位為位0到位9,位0到位6前面已經(jīng)介紹過存放的是計數(shù)器的上限值,位7和位8用來設(shè)置定時器時基,從而選定相應(yīng)的時鐘分頻器。其中位9就是上邊介紹到的提前喚醒中斷(EWI)。

        3、狀態(tài)寄存器(WWDG_SR):

        該寄存器中的有效位只有位0,用來做提前喚醒中斷的標(biāo)志位(EWIF)。

        五、相關(guān)代碼分析:

        說明:由于窗口看門狗運用的時鐘為PCLK1,因此要先使能相關(guān)時鐘。在代碼中是以開啟了提前喚醒中斷為例的,試著將相關(guān)的庫函數(shù)操作和其操作的寄存器對應(yīng)上。

        NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看門狗時鐘WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT. WWDG_SetPrescaler(fprer); //設(shè)置分頻值WWDG_SetWindowValue(wr); //設(shè)置窗口值WWDG_Enable(WWDG_CNT);  //開啟看門狗NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;  //窗口看門狗中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;  //搶占優(yōu)先級為2NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;	    //子優(yōu)先級為3NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能窗口看門狗NVIC_Init(&NVIC_InitStructure);WWDG_ClearFlag();//清除提前喚醒中斷標(biāo)志位WWDG_EnableIT();//開啟提前喚醒中斷

        有關(guān)獨立看門狗和窗口看門狗的介紹就到這里,它們還是相對簡單的,應(yīng)用起來也十分的方便和簡單,希望對大家有所啟發(fā)和幫助吧!!



        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 荣成市| 绥化市| 邓州市| 建水县| 潼南县| 沿河| 威海市| 久治县| 潞城市| 海盐县| 冕宁县| 左贡县| 云龙县| 彰化市| 洛南县| 五寨县| 兰西县| 乡宁县| 康马县| 阳东县| 盐城市| 北川| 筠连县| 汝南县| 怀柔区| 孝感市| 平山县| 商河县| 屏边| 含山县| 丰都县| 宜兴市| 天等县| 邯郸市| 长岭县| 建德市| 炎陵县| 中方县| 湖北省| 鹤峰县| 青阳县|