text: /**************************************************************************//**
   * @file     main.c
   * @version  V3.00
   * $Revision: 4 $
   * $Date: 15/05/22 2:52p $
   * @brief    Show how to wake up system from Power-down mode by GPIO interrupt.
   *
   * @note
   * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
   ******************************************************************************/
  #include <stdio.h>
  #include "M051Series.h"
  
  
  #define PLL_CLOCK           50000000
  
  
  /*---------------------------------------------------------------------------------------------------------*/
  /*  Function for System Entry to Power Down Mode                                                           */
  /*---------------------------------------------------------------------------------------------------------*/
  void PowerDownFunction(void)
  {
      /* To check if all the debug messages are finished */
      UART_WAIT_TX_EMPTY(UART0);
  
      SCB->SCR = 4;
  
      CLK->PWRCON = (CLK->PWRCON & ~(CLK_PWRCON_PWR_DOWN_EN_Msk | CLK_PWRCON_PD_WAIT_CPU_Msk)) |
                    CLK_PWRCON_PD_WAIT_CPU_Msk | CLK_PWRCON_PD_WU_INT_EN_Msk;
      CLK->PWRCON |= CLK_PWRCON_PWR_DOWN_EN_Msk;
  
      __WFI();
  }
  
  /**
   * @brief       Port0/Port1 IRQ
   *
   * @param       None
   *
   * @return      None
   *
   * @details     The Port0/Port1 default IRQ, declared in startup_M051Series.s.
   */
  void GPIOP0P1_IRQHandler(void)
  {
      /* To check if P1.3 interrupt occurred */
      if(GPIO_GET_INT_FLAG(P1, BIT3))
      {
          GPIO_CLR_INT_FLAG(P1, BIT3);
          printf("P1.3 INT occurred.\n");
      }
      else
      {
          /* Un-expected interrupt. Just clear all PORT0, PORT1 interrupts */
          P0->ISRC = P0->ISRC;
          P1->ISRC = P1->ISRC;
          printf("Un-expected interrupts.\n");
      }
  }
  
  void SYS_Init(void)
  {
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init System Clock                                                                                       */
      /*---------------------------------------------------------------------------------------------------------*/
      /* Enable Internal RC 22.1184MHz clock */
      CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
  
      /* Waiting for Internal RC clock ready */
      CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
  
      /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
      CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
  
      /* Enable external XTAL 12MHz clock */
      CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
  
      /* Waiting for external XTAL clock ready */
      CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);
  
      /* Set core clock as PLL_CLOCK from PLL */
      CLK_SetCoreClock(PLL_CLOCK);
  
      /* Enable UART module clock */
      CLK_EnableModuleClock(UART0_MODULE);
  
      /* Select UART module clock source */
      CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));
  
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init I/O Multi-function                                                                                 */
      /*---------------------------------------------------------------------------------------------------------*/
  
      /* Set P3 multi-function pins for UART0 RXD and TXD */
      SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
      SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
  
  }
  
  void UART0_Init(void)
  {
      /*---------------------------------------------------------------------------------------------------------*/
      /* Init UART                                                                                               */
      /*---------------------------------------------------------------------------------------------------------*/
      /* Reset UART0 */
      SYS_ResetModule(UART0_RST);
  
      /* Configure UART0 and set UART0 Baudrate */
      UART_Open(UART0, 115200);
  }
  
  /*---------------------------------------------------------------------------------------------------------*/
  /* MAIN function                                                                                           */
  /*---------------------------------------------------------------------------------------------------------*/
  int main(void)
  {
      /* Unlock protected registers */
      SYS_UnlockReg();
  
      /* Init System, peripheral clock and multi-function I/O */
      SYS_Init();
  
      /* Init UART0 for printf */
      UART0_Init();
  
      printf("\n\nCPU @ %d Hz\n", SystemCoreClock);
      printf("+-------------------------------------------------------+\n");
      printf("|    GPIO Power-Down and Wake-up by P1.3 Sample Code    |\n");
      printf("+-------------------------------------------------------+\n\n");
  
      /* Configure P1.3 as Input mode and enable interrupt by rising edge trigger */
      GPIO_SetMode(P1, BIT3, GPIO_PMD_INPUT);
      GPIO_EnableInt(P1, 3, GPIO_INT_RISING);
      NVIC_EnableIRQ(GPIO_P0P1_IRQn);
  
      /* Waiting for P1.3 rising-edge interrupt event */
      while(1)
      {
          printf("Enter to Power-Down ......\n");
          PowerDownFunction();
          UART_WAIT_TX_EMPTY(UART0);
          printf("System waken-up done.\n\n");
      }
  
  }
  
  /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
  