/************************* Copyright (c) 2014 *****************************
*项目名称:看门狗超时复位
*开发平台:SmartM-M4系列开发板
****************************************************************************************/
#include "SmartM_M4.h"
/*-------------------------------------------------------*/
/* 全局变量 */
/*-------------------------------------------------------*/
EXTERN_C INT32 IsDebugFifoEmpty(VOID);
VOLATILE UINT32 g_unWDTINTCounts;
VOLATILE UINT8 g_bIsWDTWakeupINT;
/*-------------------------------------------------------*/
/* 函数 */
/*-------------------------------------------------------*/
/****************************************
*函数名称:main
*输 入:无
*输 出:无
*功 能:函数主体
******************************************/
INT32 main(VOID)
{
PROTECT_REG
(
/* 系统时钟初始化 */
SYS_Init(PLL_CLOCK);
/* 使能看门狗时钟 */
CLK_EnableModuleClock(WDT_MODULE);
/* 看门狗时钟源为内部低速10KHzRC*/
CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDTSEL_LIRC, 0);
/* 串口0初始化波特率为115200bps */
UART0_Init(115200);
)
printf("+----------------------------------------+\n");
printf("| WDT Time-out Wake-up Sample Code |\n");
printf("+----------------------------------------+\n\n");
/* 检查复位是否看门狗复位导致 */
if(WDT_GET_RESET_FLAG() == 1)
{
WDT_CLEAR_RESET_FLAG();
printf("*** System has been reset by WDT time-out event ***\n\n");
while(1);
}
/* 使能看门狗NVIC中断 */
NVIC_EnableIRQ(WDT_IRQn);
/* 受保护的寄存器都进行解锁 */
SYS_UnlockReg();
g_unWDTINTCounts = g_bIsWDTWakeupINT = 0;
/* 设置看门狗超时时间为2^14次方看门狗时钟周期,看门狗延迟复位为18个看门狗时钟周期,启动看门狗计数 */
WDT_Open(WDT_TIMEOUT_2POW14, WDT_RESET_DELAY_18CLK, TRUE, TRUE);
/* 使能看门狗触发中断 */
WDT_EnableInt();
while(1)
{
/* 系统进入掉电模式前必须对受保护的寄存器进行解锁,因为改写PWRCTL寄存器需要对其解锁 */
SYS_UnlockReg();
printf("\nSystem enter to power-down mode ...\n");
/* 检查是否所有打印信息已经结束 */
while(IsDebugFifoEmpty() == 0);
/* 系统进入掉电模式 */
CLK_PowerDown();
/* 检查当前看门狗是否触发了超时中断和唤醒中断 */
while(g_bIsWDTWakeupINT == 0);
g_bIsWDTWakeupINT = 0;
/* 打印当前看门狗触发中断的次数 */
printf("System has been waken up done. WDT interrupt counts: %d.\n\n", g_unWDTINTCounts);
}
}
/*-------------------------------------------------------*/
/* 中断服务函数 */
/*-------------------------------------------------------*/
VOID WDT_IRQHandler(VOID)
{
if(g_unWDTINTCounts < 3)
{
/* 看门狗复位计数值亦即喂狗 */
WDT_RESET_COUNTER();
}
/* 检查当前看门狗触发的中断是否超时中断 */
if(WDT_GET_TIMEOUT_INT_FLAG() == 1)
{
/* 清除看门狗超时中断标志位 */
WDT_CLEAR_TIMEOUT_INT_FLAG();
g_unWDTINTCounts++;
}
/* 检查当前看门狗触发的中断是否超时唤醒中断 */
if(WDT_GET_TIMEOUT_WAKEUP_FLAG() == 1)
{
/* 清除看门狗超时唤醒中断标志位 */
WDT_CLEAR_TIMEOUT_WAKEUP_FLAG();
g_bIsWDTWakeupINT = 1;
}
}
|