独立看门狗IWDG
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 isn't refreshed and IWDG reset will occur. */
? ? if (Refresh != 0)
? ? {
? ? ? /* Reload IWDG counter */
? ? ? IWDG_ReloadCounter();
? ? }
? ? /* Toggle LED4 */
? ? GPIO_ToggleBits(LED4_PORT,LED4_PIN);
? ? Delay(0x6FFF);
? }
}
例程展示如何重載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 isn't refreshed and IWDG reset will occur. */
? ? if (Refresh != 0)
? ? {
? ? ? /* Reload IWDG counter */
? ? ? IWDG_ReloadCounter();
? ? }
? ? /* Toggle LED4 */
? ? GPIO_ToggleBits(LED4_PORT,LED4_PIN);
? ? Delay(0x6FFF);
? }
}
總結
- 上一篇: STM32时钟源时钟系统配置
- 下一篇: STM8L之定时器