本帖最后由 heisexingqisi 于 2016-7-30 20:06 编辑
- #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;
- }
- }
|