[DemoCode下载] IDLE操作

[复制链接]
597|5
 楼主| zhuomuniao110 发表于 2019-5-26 22:48 | 显示全部楼层 |阅读模式
IDL, ck, TE, se
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 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_HIRC
  10. #define PLL_CLOCK           50191800



  11. void WDT_IRQHandler(void)
  12. {
  13.     /* Clear WDT time-out interrupt flag */
  14.     WDT_CLEAR_TIMEOUT_INT_FLAG();
  15. }


  16. void SYS_Init(void)
  17. {
  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Init System Clock                                                                                       */
  20.     /*---------------------------------------------------------------------------------------------------------*/

  21.     /* Enable Internal RC 22.1184MHz clock */
  22.     CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

  23.     /* Waiting for Internal RC clock ready */
  24.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

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

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

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

  31.     /* Enable PLL and Set PLL frequency */
  32.     CLK->PLLCON = PLLCON_SETTING;

  33.     /* Waiting for clock ready */
  34.     CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC10K_STB_Msk);

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

  37.     /* Enable clock of WDT, PWM01 and SPI0 */
  38.     CLK_EnableModuleClock(WDT_MODULE);
  39.     CLK_EnableModuleClock(PWM01_MODULE);
  40.     CLK_EnableModuleClock(SPI0_MODULE);

  41.     /* Select peripheral clock of WDT and PWM01 and SPI0 */
  42.     CLK_SetModuleClock(WDT_MODULE,   CLK_CLKSEL1_WDT_S_LIRC,   MODULE_NoMsk);
  43.     CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HCLK, MODULE_NoMsk);
  44.     CLK_SetModuleClock(SPI0_MODULE,  CLK_CLKSEL1_SPI0_S_HCLK,  MODULE_NoMsk);

  45.     /* Update System Core Clock */
  46.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  47.     //SystemCoreClockUpdate();
  48.     PllClock        = PLL_CLOCK;            // PLL
  49.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  50.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  51.     /*---------------------------------------------------------------------------------------------------------*/
  52.     /* Init I/O Multi-function                                                                                 */
  53.     /*---------------------------------------------------------------------------------------------------------*/

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

  57.     /* Set P4.0 for PWM0 */
  58.     SYS->P4_MFP = SYS->P4_MFP & (~SYS_MFP_P40_Msk) | SYS_MFP_P40_PWM0;
  59. }

  60. void WDT_Init(void)
  61. {
  62.     /* Unlock protected registers */
  63.     SYS_UnlockReg();

  64.     /* Start WDT. Timeout = (2^14 + 1024) * (1 / 10kHz)*/
  65.     WDT_Open(WDT_TIMEOUT_2POW14, FALSE, FALSE, FALSE);

  66.     /* Enable WDT interrupt function */
  67.     WDT_EnableInt();

  68.     /* Lock protected registers */
  69.     SYS_LockReg();

  70.     /* Enable WDT IRQ */
  71.     NVIC_EnableIRQ(WDT_IRQn);
  72. }

  73. void PWMA_Init(void)
  74. {
  75.     /* Enable PWM Timer 0 and set to auto-reload mode */
  76.     PWMA->PCR = PWM_PCR_CH0EN_Msk | PWM_PCR_CH0MOD_Msk;

  77.     /* Set pre-scale for PWM01 */
  78.     PWM_SET_PRESCALER(PWMA, 0, 1);

  79.     /* Select the divider of PWM01 clock */
  80.     PWM_SET_DIVIDER(PWMA, 0, PWM_CLK_DIV_1);

  81.     /* PWM0 output is HCLK / 2 / 2 */
  82.     PWM_SET_CMR(PWMA, 0, 0);
  83.     PWM_SET_CNR(PWMA, 0, 1);

  84.     /* PWM output enable */
  85.     PWM_EnableOutput(PWMA, 0x1);
  86. }

  87. /*---------------------------------------------------------------------------------------------------------*/
  88. /*  Main Function                                                                                          */
  89. /*---------------------------------------------------------------------------------------------------------*/
  90. int32_t main(void)
  91. {
  92.     /* Unlock protected registers */
  93.     SYS_UnlockReg();

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

  96.     /* Lock protected registers */
  97.     SYS_LockReg();

  98.     /* Init SPI0 and LCD */
  99.     LCD_Init();
  100.     LCD_EnableBackLight();
  101.     LCD_ClearScreen();
  102.     LCD_Print(0, "Idle Sample Code");

  103.     /*----------------------- Enable WDT to wakeup CPU from idle ------------------*/
  104.     WDT_Init();

  105.     /*----------------------- Enable PWM to toggle output -------------------------*/
  106.     PWMA_Init();

  107.     /*
  108.         The Idle sample uses __WFI() instruction to disable CPU clock to enter idle mode.
  109.         In the sample code, CPU will enter idle mode to wait WDT timeout. User may check
  110.         LCD display to know if it is wakeup.
  111.     */

  112.     /* Unlock protected registers */
  113.     SYS_UnlockReg();

  114.     while(1)
  115.     {
  116.         /* Select system clock source as OSC10K(LIRC),
  117.            set HCLK divider as 1 and update current system core clock
  118.         */
  119.         CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_LIRC, CLK_CLKDIV_HCLK(1));

  120.         /* Disable 22.1184MHz IRC */
  121.         CLK_DisableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  122.         LCD_Print(1, "Idle  ");
  123.         /* Idle to WDT timeout. HCLK should be 10KHz here. PWM0 = 2.5KHz*/
  124.         CLK_Idle();
  125.         LCD_Print(1, "Wakeup");

  126.         /* Enable 22.1184MHz IRC */
  127.         CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  128.         /* Waiting for clock ready */
  129.         CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  130.         /* Select system clock source as OSC22M(HIRC),
  131.            set HCLK divider as 1 and update current system core clock
  132.         */
  133.         CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  134.         LCD_Print(1, "Idle  ");
  135.         /* Idle to WDT timeout. HCLK should be 22.1184MHz here. PWM0 = 5.5MHz*/
  136.         CLK_Idle();
  137.         LCD_Print(1, "Wakeup");
  138.     }
  139. }






dongnanxibei 发表于 2019-5-27 00:04 | 显示全部楼层
Idle 空闲
捉虫天师 发表于 2019-5-27 16:00 | 显示全部楼层
这个大概什么时候用的?
equivalent 发表于 2019-5-29 20:40 | 显示全部楼层
感谢楼主分享!
稳稳の幸福 发表于 2019-5-29 22:48 | 显示全部楼层
这个概念看到过很多次,没学会。
玛尼玛尼哄 发表于 2019-5-30 18:35 | 显示全部楼层
空闲模式一般都用在哪儿?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

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