[DemoCode下载] 看门狗唤醒系统

[复制链接]
940|14
 楼主| huangcunxiake 发表于 2020-1-14 19:48 | 显示全部楼层 |阅读模式
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 3 $
  5. * $Date: 15/05/22 2:35p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Use WDT time-out interrupt event to wake-up system.
  7. * @note
  8. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  9. ******************************************************************************/
  10. #include <stdio.h>
  11. #include "M051Series.h"

  12. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  13. #define PLL_CLOCK           50000000


  14. /*---------------------------------------------------------------------------------------------------------*/
  15. /* Global Interface Variables Declarations                                                                 */
  16. /*---------------------------------------------------------------------------------------------------------*/
  17. extern int IsDebugFifoEmpty(void);
  18. volatile uint8_t g_u8IsWDTWakeupINT = 0;


  19. /*---------------------------------------------------------------------------------------------------------*/
  20. /*  Function for System Entry to Power-down Mode                                                           */
  21. /*---------------------------------------------------------------------------------------------------------*/
  22. void PowerDownFunction(void)
  23. {
  24.     printf("System enter to power-down mode.\n\n");

  25.     /* To check if all the debug messages are finished */
  26.     while(IsDebugFifoEmpty() == 0);

  27.     SCB->SCR = 4;

  28.     /* To program PWRCON register, it needs to disable register protection first. */
  29.     CLK->PWRCON = (CLK->PWRCON & ~(CLK_PWRCON_PWR_DOWN_EN_Msk | CLK_PWRCON_PD_WAIT_CPU_Msk)) |
  30.                   CLK_PWRCON_PD_WAIT_CPU_Msk | CLK_PWRCON_PD_WU_INT_EN_Msk;
  31.     CLK->PWRCON |= CLK_PWRCON_PWR_DOWN_EN_Msk;

  32.     __WFI();
  33. }

  34. /**
  35. * @brief       IRQ Handler for WDT and WWDT Interrupt
  36. *
  37. * @param       None
  38. *
  39. * [url=home.php?mod=space&uid=266161]@return[/url]      None
  40. *
  41. * [url=home.php?mod=space&uid=1543424]@Details[/url]     The WDT_IRQHandler is default IRQ of WDT and WWDT, declared in startup_M051Series.s.
  42. */
  43. void WDT_IRQHandler(void)
  44. {
  45.     if((WDT_GET_TIMEOUT_INT_FLAG() == 1) && (WDT_GET_TIMEOUT_WAKEUP_FLAG() == 1))
  46.     {
  47.         /* Clear WDT time-out interrupt and wake-up flag */
  48.         WDT_CLEAR_TIMEOUT_INT_FLAG();
  49.         WDT_CLEAR_TIMEOUT_WAKEUP_FLAG();

  50.         g_u8IsWDTWakeupINT = 1;

  51.         printf("WDT time-out wake-up interrupt occurred.\n");
  52.     }
  53. }

  54. void SYS_Init(void)
  55. {
  56.     /*---------------------------------------------------------------------------------------------------------*/
  57.     /* Init System Clock                                                                                       */
  58.     /*---------------------------------------------------------------------------------------------------------*/
  59.     /* Enable IRC22M clock */
  60.     CLK->PWRCON |= CLK_PWRCON_IRC22M_EN_Msk;

  61.     /* Waiting for IRC22M clock ready */
  62.     CLK_WaitClockReady(CLK_CLKSTATUS_IRC22M_STB_Msk);

  63.     /* Switch HCLK clock source to HIRC */
  64.     CLK->CLKSEL0 = CLK_CLKSEL0_HCLK_S_HIRC;

  65.     /* Set PLL to Power-down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  66.     CLK->PLLCON |= CLK_PLLCON_PD_Msk;

  67.     /* Enable external 12 MHz XTAL, IRC10K */
  68.     CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk;

  69.     /* Enable PLL and Set PLL frequency */
  70.     CLK->PLLCON = PLLCON_SETTING;

  71.     /* Waiting for clock ready */
  72.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_IRC10K_STB_Msk);

  73.     /* Switch HCLK clock source to PLL, STCLK to HCLK/2 */
  74.     CLK->CLKSEL0 = CLK_CLKSEL0_STCLK_S_HCLK_DIV2 | CLK_CLKSEL0_HCLK_S_PLL;

  75.     /* Enable peripheral clock */
  76.     CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk | CLK_APBCLK_WDT_EN_Msk;

  77.     /* Peripheral clock source */
  78.     CLK->CLKSEL1 = CLK_CLKSEL1_UART_S_PLL | CLK_CLKSEL1_WDT_S_LIRC;

  79.     /* Update System Core Clock */
  80.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  81.     SystemCoreClockUpdate();

  82.     /*---------------------------------------------------------------------------------------------------------*/
  83.     /* Init I/O Multi-function                                                                                 */
  84.     /*---------------------------------------------------------------------------------------------------------*/
  85.     /* Set P3 multi-function pins for UART0 RXD, TXD */
  86.     SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;
  87. }

  88. void UART0_Init(void)
  89. {
  90.     /*---------------------------------------------------------------------------------------------------------*/
  91.     /* Init UART                                                                                               */
  92.     /*---------------------------------------------------------------------------------------------------------*/
  93.     /* Reset IP */
  94.     SYS_ResetModule(UART0_RST);

  95.     /* Configure UART0 and set UART0 Baudrate */
  96.     UART_Open(UART0, 115200);
  97. }

  98. /*---------------------------------------------------------------------------------------------------------*/
  99. /*  MAIN function                                                                                          */
  100. /*---------------------------------------------------------------------------------------------------------*/
  101. int main(void)
  102. {
  103.     /* Unlock protected registers */
  104.     SYS_UnlockReg();

  105.     /* Init System, peripheral clock and multi-function I/O */
  106.     SYS_Init();

  107.     /* Lock protected registers */
  108.     SYS_LockReg();

  109.     /* Init UART0 for printf */
  110.     UART0_Init();

  111.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  112.     printf("+----------------------------------------------+\n");
  113.     printf("|    WDT Power-down and Wake-up Sample Code    |\n");
  114.     printf("+----------------------------------------------+\n\n");

  115.     printf("# WDT Settings:\n");
  116.     printf("  Clock source is 10 kHz; Enable interrupt; Enable Wake-up; Time-out interval is 2^16 * WDT clock.\n");
  117.     printf("# When WDT statr counting, system will generate a WDT time-out interrupt after 6.5536 ~ 6.656 s.\n");
  118.     printf("  Measure P0.0 low period to check time-out interval and system can be waken-up by WDT time-out event.\n\n");

  119.     /* Use P0.0 to check time-out period time */
  120.     GPIO_SetMode(P0, 0, GPIO_PMD_OUTPUT);
  121.     P00 = 1;
  122.     P00 = 0;

  123.     /* Because of all bits can be written in WDT Control Register are write-protected;
  124.        To program it needs to disable register protection first. */
  125.     SYS_UnlockReg();

  126.     /* Enable WDT wake-up function and select time-out interval to 2^16 * WDT clock then start WDT counting */
  127.     g_u8IsWDTWakeupINT = 0;
  128.     WDT_Open(WDT_TIMEOUT_2POW16, WDT_RESET_DELAY_1026CLK, FALSE, TRUE);

  129.     /* Enable WDT interrupt function */
  130.     WDT_EnableInt();

  131.     /* Enable WDT NVIC */
  132.     NVIC_EnableIRQ(WDT_IRQn);

  133.     /* System entry into Power-down Mode */
  134.     PowerDownFunction();

  135.     /* Check if WDT time-out interrupt and wake-up interrupt flag occurred */
  136.     while(1)
  137.     {
  138.         if(((CLK->PWRCON & CLK_PWRCON_PD_WU_STS_Msk) == CLK_PWRCON_PD_WU_STS_Msk) && (g_u8IsWDTWakeupINT == 1))
  139.             break;
  140.     }

  141.     P00 = 1;

  142.     /* Clear Power-down wake-up interrupt flag */
  143.     CLK->PWRCON |= CLK_PWRCON_PD_WU_STS_Msk;

  144.     /* Disable WDT counting */
  145.     WDT_Close();

  146.     while(1);
  147. }

  148. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/


 楼主| huangcunxiake 发表于 2020-1-14 19:57 | 显示全部楼层
看门狗的中断也可以唤醒系统。
捉虫天师 发表于 2020-1-14 22:18 | 显示全部楼层
好像是大部分中断都可以唤醒
捉虫天师 发表于 2020-1-14 22:18 | 显示全部楼层
我去看看手册。
捉虫天师 发表于 2020-1-14 22:21 | 显示全部楼层
手册上提到了很多中断都可以唤醒。
xinpian101 发表于 2020-1-14 23:11 | 显示全部楼层
IsDebugFifoEmpty
这个是出于什么目的
xinpian101 发表于 2020-1-14 23:12 | 显示全部楼层
意思是还可以在休眠时候调试?
zhuomuniao110 发表于 2020-1-15 22:55 | 显示全部楼层
貌似不需要特别设置,就可以用各种中断唤醒。
21mengnan 发表于 2020-1-16 19:27 | 显示全部楼层
IsDebugFifoEmpty(void)这个是定义在哪儿的
木木guainv 发表于 2020-2-5 16:23 | 显示全部楼层
非常感谢楼主分享
gejigeji521 发表于 2020-2-6 19:56 | 显示全部楼层
这几天在疯狂的复习。
heisexingqisi 发表于 2020-2-9 16:01 | 显示全部楼层
有没有18B20的例子。
jiekou001 发表于 2020-2-12 20:26 | 显示全部楼层
heisexingqisi 发表于 2020-2-9 16:01
有没有18B20的例子。

可以看时序图。
jiekou001 发表于 2020-2-12 20:27 | 显示全部楼层
gejigeji521 发表于 2020-2-6 19:56
这几天在疯狂的复习。

嗯,抓住学习时间。
小明的同学 发表于 2020-2-12 20:51 | 显示全部楼层
分享的不错代码很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3745

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部