[DemoCode下载] M051深度睡眠

[复制链接]
550|6
 楼主| zhuomuniao110 发表于 2019-5-26 22:43 | 显示全部楼层 |阅读模式
TE, se, ck, TI
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include "M051Series.h"
  8. #include "LCD_Driver.h"

  9. #define PLLCON_SETTING      CLK_PLLCON_50MHz_HXT
  10. #define PLL_CLOCK           50000000


  11. volatile int8_t gi8Key = 1;
  12. char g_strBuf[32] = {0};


  13. void EINT0_IRQHandler(void)
  14. {
  15.     /* Clear P3.2 interrupt flag */
  16.     GPIO_CLR_INT_FLAG(P3, BIT2);

  17.     if(P32)
  18.     {
  19.         /* P3.2 is from low to high */
  20.         gi8Key = 1;
  21.     }
  22.     else
  23.     {
  24.         /* P3.2 is from high to low */
  25.         gi8Key = 0;
  26.     }
  27. }

  28. void SYS_Init(void)
  29. {

  30.     /*---------------------------------------------------------------------------------------------------------*/
  31.     /* Init System Clock                                                                                       */
  32.     /*---------------------------------------------------------------------------------------------------------*/
  33.     /* Enable Internal RC 22.1184MHz clock */
  34.     CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

  35.     /* Waiting for Internal RC clock ready */
  36.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  37.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  38.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

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

  41.     /* Enable external 12MHz XTAL, 10kHz */
  42.     CLK->PWRCON |= (CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk);

  43.     /* Enable PLL and Set PLL frequency */
  44.     CLK->PLLCON = PLLCON_SETTING;

  45.     /* Waiting for clock ready */
  46.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC10K_STB_Msk);

  47.     /* Use PLL as system clock source */
  48.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(1));

  49.     /* Enable clock of UART0 and SPI0 */
  50.     CLK_EnableModuleClock(UART0_MODULE);
  51.     CLK_EnableModuleClock(SPI0_MODULE);

  52.     /* Select clock of UART0 and SPI0 */
  53.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL,  CLK_CLKDIV_UART(1));
  54.     CLK_SetModuleClock(SPI0_MODULE,  CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);

  55.     /*---------------------------------------------------------------------------------------------------------*/
  56.     /* Init I/O Multi-function                                                                                 */
  57.     /*---------------------------------------------------------------------------------------------------------*/

  58.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  59.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  60.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

  61.     /* Set P1.4, P1.5, P1.6, P1.7 for SPI0 to driver LCD */
  62.     SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
  63.     SYS->P1_MFP |= (SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0);

  64. }

  65. void UART0_Init(void)
  66. {
  67.     /*---------------------------------------------------------------------------------------------------------*/
  68.     /* Init UART                                                                                               */
  69.     /*---------------------------------------------------------------------------------------------------------*/
  70.     UART_Open(UART0, 115200);
  71. }

  72. void GPIO_Init(void)
  73. {
  74.     /* Enable debounce function of P3.2 (EINT0) */
  75.     GPIO_ENABLE_DEBOUNCE(P3, BIT2);

  76.     /* Set debounce time. it is about 6.4 ms */
  77.     GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_LIRC, GPIO_DBCLKSEL_64);

  78.     /* Enable P3.2 to be EINT0 */
  79.     GPIO_EnableEINT0(P3, 2, GPIO_INT_BOTH_EDGE);
  80.     NVIC_EnableIRQ(EINT0_IRQn);
  81. }

  82. /*---------------------------------------------------------------------------------------------------------*/
  83. /* MAIN function                                                                                           */
  84. /*---------------------------------------------------------------------------------------------------------*/
  85. int main(void)
  86. {
  87.     uint32_t u32Cnt;

  88.     /* Unlock protected registers */
  89.     SYS_UnlockReg();

  90.     /* Init system, peripherial clock and multi-function I/O */
  91.     SYS_Init();

  92.     /* Lock protected registers */
  93.     SYS_LockReg();

  94.     /* Init UART0 for printf */
  95.     UART0_Init();

  96.     /* Init SPI0 and LCD */
  97.     LCD_Init();
  98.     LCD_EnableBackLight();
  99.     LCD_ClearScreen();

  100.     printf("CPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);

  101.     LCD_Print(0, "Smpl_DeepSleep");

  102.     /*Initialize external interrupt*/
  103.     GPIO_Init();

  104.     /*  P3.2 is used as EINT0 for deep sleep (power down) control.
  105.         Press P3.2 will toggle power down/wakeup state to show how to enter power down.
  106.     */
  107.     LCD_Print(1, "Press INT ");

  108.     while(1)
  109.     {
  110.         char strClearVal[15] = "Count:         ";
  111.         /* Enter power when key change from low to high */
  112.         u32Cnt = 0;
  113.         while(gi8Key == 1)
  114.         {
  115.             sprintf(g_strBuf, "Count:%d", u32Cnt++);
  116.             LCD_Print(3, strClearVal);
  117.             LCD_Print(3, g_strBuf);
  118.         }
  119.         while(gi8Key == 0)
  120.         {
  121.             sprintf(g_strBuf, "Count:%d", u32Cnt++);
  122.             LCD_Print(3, strClearVal);
  123.             LCD_Print(3, g_strBuf);
  124.         }

  125.         LCD_Print(2, "Deep Sleeping...");

  126.         /* We need to disable debounce function before power down, otherwise, there would be twice interrupt when wakeup */
  127.         GPIO_DISABLE_DEBOUNCE(P3, BIT2);

  128.         /* Unlock protected registers */
  129.         SYS_UnlockReg();

  130.         /* Prepare to enter power down */
  131.         /* Use WFI instruction to idle the CPU.
  132.            NOTE: If ICE is attached, system will wakeup immediately because ICE is a wakeup event.
  133.         */
  134.         CLK_PowerDown();

  135.         /* Lock protected registers */
  136.         SYS_LockReg();

  137.         /* Re-enable debounce function if necessary */
  138.         GPIO_ENABLE_DEBOUNCE(P3, BIT2);

  139.         LCD_Print(2, "Working...      ");

  140.         /* Make sure the key is return to high before next key action */
  141.         while(gi8Key == 0);

  142.         gi8Key = 0;
  143.     }
  144. }



 楼主| zhuomuniao110 发表于 2019-5-26 22:43 | 显示全部楼层
用于实现关机,开机的效果。
 楼主| zhuomuniao110 发表于 2019-5-26 22:43 | 显示全部楼层
这也是省电的法门。
21mengnan 发表于 2019-5-27 19:18 | 显示全部楼层
扑挡模式,是睡眠还是掉电?
643757107 发表于 2019-5-27 23:43 | 显示全部楼层
这个模式是不是电流消耗最小
externally 发表于 2019-5-29 20:33 | 显示全部楼层
深度睡眠确实是一个很好的降低功耗的方法
稳稳の幸福 发表于 2019-5-29 22:20 | 显示全部楼层
除了IO中断唤醒,还有其他的唤醒方式没
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

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