使用STM32F030的WWDG,发现其在STOP下面跟STM8S的休眠模式的情况一样,不会对MCU进行复位. 贴上看门狗代码: /*************************************************************************************** **************************************************************************************** * FILE : wdog_drv.c * Description : * * Copyright (c) 2015 by LAN. All Rights Reserved. * * History: * Version Name Date Description 0.1 蓝曙光 2015/01/28 Initial Version **************************************************************************************** ****************************************************************************************/ #include "wdog_drv.h" #define WWDG_Prescaler_8 ((uint32_t)0x00000180) #define CFR_WDGTB_MASK ((uint32_t)0xFFFFFE7F) #define RCC_APB1ENR_WWDGEN ((uint32_t)0x00000800) /*!< Window Watchdog clock enable */ /*================================================================== * Function : Wdog_Init * Description : 看门狗初始化 * Input Para : * Output Para : * Return Value: ==================================================================*/ void Wdog_Init(void) { Wdog_Start(); WWDG->CFR |= 0x7F; //窗口看门狗的上窗口,窗口值必须在0x3F以上,但必须小于计数值小于0x7F WWDG->CR = 0x7F; //看门狗计数值 Wdog_Feed(0); } /*================================================================== * Function : Wdog_Start * Description : 启动开门狗 * Input Para : * Output Para : * Return Value: ==================================================================*/ void Wdog_Start(void) { RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; //设置分频时钟 WWDG->CFR = (WWDG->CFR & CFR_WDGTB_MASK) | WWDG_Prescaler_8; WWDG->CR |= 0x80; //使能窗口看门狗 } /*================================================================== * Function : Wdog_SetReload * Description : 重新设置频率 * Input Para : * Output Para : * Return Value: ==================================================================*/ void Wdog_SetReload(u8 uTime) { } /*================================================================== * Function : Wdog_Feed * Description : 喂狗 * Input Para : * Output Para : * Return Value: ==================================================================*/ void Wdog_Feed(u8 uTime) { if ((WWDG->CR & 0x7F) < WWDG->CFR)//小于窗口值才能喂狗 { WWDG->CR |= 0x7F; //重新喂狗 } } /*================================================================== * Function : Wdog_ResetChip * Description : 复位芯片 * Input Para : * Output Para : * Return Value: ==================================================================*/ void Wdog_ResetChip(void) { while ((WWDG->CR & 0x7F) >= WWDG->CFR) {//等待进入到喂狗窗口 } WWDG->CR &= 0x40; //喂最小复位 while(1); }
|