使用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);
}