收藏0 举报
/************************* 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; } }
#ifndef __SMARTM_M4_H__ #define __SMARTM_M4_H__ /* ---------------------------------------------------- 系统 ---------------------------------------------------- */ #include "stdio.h" #include "M451Series.h" #include "Common.h" #include "Typedef.h" /* ---------------------------------------------------- 外设 ---------------------------------------------------- */ #include "wdt.h" /* ---------------------------------------------------- 配置 ---------------------------------------------------- */ #define PLL_CLOCK 72000000UL #endif
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
发帖类勋章
等级类勋章
时间类勋章
214
3375
7
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号