新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8L探索套件學習筆記-窗口看門狗WWDG(十七)

        STM8L探索套件學習筆記-窗口看門狗WWDG(十七)

        作者: 時間:2016-11-24 來源:網絡 收藏
        窗口看門狗WWDG)通常被用來監測由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。除非遞減計數器的值在T6位變成0前被刷新,看門狗電路在達到預置的時間周期時,會產生一個MCU復位。在遞減計數器達到窗口寄存器數值之前,如果7位的遞減計數器數值(在控制寄存器中)被刷新,那么也將產生一個MCU復位。這表明遞減計數器需要在一個有限的時間窗口中被刷新。上面提到的T6即是窗口看門狗的自減計數器的第六位(最高位)。在該計數器的T6位變為0后(小于0X40),就會引起一復位。這是窗口的下限。而當計數器的值在大雨窗口配置寄存器的窗口值之前就被修改的話,也會引起一次復位,這里窗口值是上限。窗口值是由用戶自己設定的,根據實際要求來設計窗口值,但是一定要確保窗口值大于0X40,否則窗口就不存在了
        void main(void)
        {
        uint8_t Index;
        GPIO_Init(LED3_PORT,LED3_PIN,GPIO_Mode_Out_PP_Low_Fast);
        //輸出低電平-高速10M
        GPIO_Init(LED4_PORT,LED4_PIN,GPIO_Mode_Out_PP_Low_Fast);
        //輸出低電平-高速10M
        GPIO_Init(KEY_PORT,KEY_PIN,GPIO_Mode_In_FL_IT);
        //輸入浮空-中斷
        /* Set PC1 sensitivity to falling edge and low level 下降沿低電平觸發*/
        EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low);
        /* Check if the MCU has resumed from WWDG reset */
        if (RST_GetFlagStatus(RST_FLAG_WWDGF) != RESET)
        {
        /* IWDGF flag set */
        /* Toggle LED3 */
        for (Index = 7; Index != 0; Index--)
        {
        GPIO_ToggleBits(LED3_PORT,LED3_PIN);
        Delay(0x7FFF);
        }
        /* Clear WWDGF Flag */
        RST_ClearFlag(RST_FLAG_WWDGF);
        }
        /* WWDG configuration: WWDG is clocked by SYSCLK = 2MHz */
        /* WWDG timeout is equal to 251,9 ms */
        /* Watchdog Window = (COUNTER_INIT - 63) * 1 step
        = 41 * (12288 / 2Mhz)
        = 251,9 ms
        */
        /* Non Allowed Window = (COUNTER_INIT - WINDOW_VALUE) * 1 step
        = (104 - 97) * 1 step
        = 7 * 1 step
        = 7 * (12288 / 2Mhz)
        = 43.008 ms
        */
        /* So the non allowed window starts from 0.0 ms to 43.008 ms
        and the alowed window starts from 43.008 ms to 251,9 ms
        If refresh is done during non allowed window, a reset will occur.
        If refresh is done during allowed window, no reset will occur.
        If the WWDG down counter reaches 63, a reset will occur. */
        WWDG_Init(COUNTER_INIT, WINDOW_VALUE);
        /* enable interrupts by switching to level 0 */
        enableInterrupts();
        while (1)
        {
        /* Check if WWDG counter refresh is allowed in Allowed window */
        if (AllowedRefresh != 0)
        {
        /* get WWDG counter value */
        /* wait until WWDG counter becomes lower than window value */
        while ((WWDG_GetCounter() & 0x7F) > WINDOW_VALUE);
        /* Refresh WWDG counter during allowed window so no MCU reset will occur */
        WWDG_SetCounter(COUNTER_INIT);
        }
        /* Check if WWDG counter refresh is allowed in non Allowed window */
        if (NonAlowedRefresh != 0)
        {
        /* wait until WWDG counter becomes higher than window value */
        while ((WWDG_GetCounter() & 0x7F) < WINDOW_VALUE);
        /* Refresh WWDG counter during non allowed window so MCU reset will occur */
        WWDG_SetCounter(COUNTER_INIT);
        }
        /* Toggle LED4 */
        GPIO_ToggleBits(LED4_PORT,LED4_PIN);
        Delay(0x6FFF);
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 麻城市| 礼泉县| 兴文县| 巴彦淖尔市| 洪江市| 壶关县| 大邑县| 西城区| 建湖县| 宁陵县| 湖州市| 东方市| 长丰县| 北宁市| 大兴区| 淳化县| 长武县| 丰顺县| 婺源县| 涡阳县| 和田县| 博白县| 新乡市| 海林市| 河津市| 昭觉县| 漳州市| 芒康县| 崇义县| 赫章县| 应用必备| 阳山县| 裕民县| 宿州市| 临高县| 华坪县| 金昌市| 铜川市| 边坝县| 盐津县| 永川市|