新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM8L探索套件學習筆記-獨立看門狗IWDG(十六)

        STM8L探索套件學習筆記-獨立看門狗IWDG(十六)

        作者: 時間:2016-11-24 來源:網絡 收藏
        STM8L獨立看門狗由內部專門的 38Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然有效。這里需要注意獨立看門狗的時鐘并不是準確的 38Khz,只是我們在估算的時候,以 38Khz 的頻率來計算,看門狗對時間的要求不是很精確,所以,時鐘有些偏差,都是可以接受的。根據分頻系統和看門狗計數值可以設置獨立看門狗的復位時間,范圍從0.1ms~1724.63ms
        例程展示如何重載IWDG計數值,IWDG的時間設置為214.7ms。程序采用“Refresh”變量來使能IWDG重載計數值仿真IWDG復位,并且板上LED4翻轉。當按鍵按下,模擬一次軟件錯誤造成程序沒有喂狗,從而發生復位。如果IWDG復位,系統啟動后LED3會翻轉8次,主代碼如下:
        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 IWDG reset */
        if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
        {
        /* IWDGF flag set */
        /* Toggle LED3 */
        for (Index = 7; Index != 0; Index--)
        {
        GPIO_ToggleBits(LED3_PORT,LED3_PIN);
        Delay(0x7FFF);
        }
        /* Clear IWDGF Flag */
        RST_ClearFlag(RST_FLAG_IWDGF);
        }
        /* IWDG configuration: IWDG is clocked by LSI = 38KHz */
        /* IWDG timeout equal to 214.7 ms (the timeout may varies due to LSI frequency dispersion) */
        /* IWDG timeout = (RELOAD_VALUE + 1) * Prescaler / LSI = (254 + 1) * 32 / 38 000 = 214.7 ms */
        /* Enable the IWDG */
        IWDG_Enable();
        /* Enable write access to IWDG_PR and IWDG_RLR registers */
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
        /* Set IWDG timeout */
        IWDG_SetPrescaler(IWDG_Prescaler_32);
        IWDG_SetReload(RELOAD_VALUE);
        /* Refresh IWDG */
        IWDG_ReloadCounter();
        /* enable interrupts by switching to level 0 */
        enableInterrupts();
        while (1)
        {
        /* As Refresh is equal to ENABLE no IWDG reset will occur. When Refresh is
        equal to DISABLE, the IWDG counter isnt refreshed and IWDG reset will occur. */
        if (Refresh != 0)
        {
        /* Reload IWDG counter */
        IWDG_ReloadCounter();
        }
        /* Toggle LED4 */
        GPIO_ToggleBits(LED4_PORT,LED4_PIN);
        Delay(0x6FFF);
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 普格县| 建昌县| 甘肃省| 定兴县| 北辰区| 浦城县| 甘泉县| 新郑市| 八宿县| 东平县| 华宁县| 集安市| 崇礼县| 库伦旗| 保靖县| 仁怀市| 萨迦县| 福海县| 聂荣县| 荔浦县| 英德市| 宝兴县| 远安县| 昭通市| 赤壁市| 孟津县| 靖宇县| 平乐县| 凌源市| 济宁市| 多伦县| 资源县| 庆阳市| 建宁县| 红原县| 察隅县| 班玛县| 彩票| 呼和浩特市| 乌鲁木齐县| 六枝特区|