- /*---------------------------------------------------------------------------------------------------------*/
- /* */
- /* Copyright(c) 2010 Nuvoton Technology Corp. All rights reserved. */
- /* */
- /*---------------------------------------------------------------------------------------------------------*/
- #include <stdio.h>
- #include "M051Series.h"
- #include "LCD_Driver.h"
- #define PLLCON_SETTING CLK_PLLCON_50MHz_HXT
- #define PLL_CLOCK 50000000
- volatile int8_t gi8Key = 1;
- char g_strBuf[32] = {0};
- void EINT0_IRQHandler(void)
- {
- /* Clear P3.2 interrupt flag */
- GPIO_CLR_INT_FLAG(P3, BIT2);
- if(P32)
- {
- /* P3.2 is from low to high */
- gi8Key = 1;
- }
- else
- {
- /* P3.2 is from high to low */
- gi8Key = 0;
- }
- }
- void SYS_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init System Clock */
- /*---------------------------------------------------------------------------------------------------------*/
- /* Enable Internal RC 22.1184MHz clock */
- CLK->PWRCON |= 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));
- /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
- CLK->PLLCON |= CLK_PLLCON_PD_Msk;
- /* Enable external 12MHz XTAL, 10kHz */
- CLK->PWRCON |= (CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk);
- /* Enable PLL and Set PLL frequency */
- CLK->PLLCON = PLLCON_SETTING;
- /* Waiting for clock ready */
- CLK_WaitClockReady(CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_OSC10K_STB_Msk);
- /* Use PLL as system clock source */
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_PLL, CLK_CLKDIV_HCLK(1));
- /* Enable clock of UART0 and SPI0 */
- CLK_EnableModuleClock(UART0_MODULE);
- CLK_EnableModuleClock(SPI0_MODULE);
- /* Select clock of UART0 and SPI0 */
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));
- CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);
- /*---------------------------------------------------------------------------------------------------------*/
- /* 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);
- /* Set P1.4, P1.5, P1.6, P1.7 for SPI0 to driver LCD */
- SYS->P1_MFP &= ~(SYS_MFP_P14_Msk | SYS_MFP_P15_Msk | SYS_MFP_P16_Msk | SYS_MFP_P17_Msk);
- SYS->P1_MFP |= (SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0);
- }
- void UART0_Init(void)
- {
- /*---------------------------------------------------------------------------------------------------------*/
- /* Init UART */
- /*---------------------------------------------------------------------------------------------------------*/
- UART_Open(UART0, 115200);
- }
- void GPIO_Init(void)
- {
- /* Enable debounce function of P3.2 (EINT0) */
- GPIO_ENABLE_DEBOUNCE(P3, BIT2);
- /* Set debounce time. it is about 6.4 ms */
- GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_LIRC, GPIO_DBCLKSEL_64);
- /* Enable P3.2 to be EINT0 */
- GPIO_EnableEINT0(P3, 2, GPIO_INT_BOTH_EDGE);
- NVIC_EnableIRQ(EINT0_IRQn);
- }
- /*---------------------------------------------------------------------------------------------------------*/
- /* MAIN function */
- /*---------------------------------------------------------------------------------------------------------*/
- int main(void)
- {
- uint32_t u32Cnt;
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Init system, peripherial clock and multi-function I/O */
- SYS_Init();
- /* Lock protected registers */
- SYS_LockReg();
- /* Init UART0 for printf */
- UART0_Init();
- /* Init SPI0 and LCD */
- LCD_Init();
- LCD_EnableBackLight();
- LCD_ClearScreen();
- printf("CPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
- LCD_Print(0, "Smpl_DeepSleep");
- /*Initialize external interrupt*/
- GPIO_Init();
- /* P3.2 is used as EINT0 for deep sleep (power down) control.
- Press P3.2 will toggle power down/wakeup state to show how to enter power down.
- */
- LCD_Print(1, "Press INT ");
- while(1)
- {
- char strClearVal[15] = "Count: ";
- /* Enter power when key change from low to high */
- u32Cnt = 0;
- while(gi8Key == 1)
- {
- sprintf(g_strBuf, "Count:%d", u32Cnt++);
- LCD_Print(3, strClearVal);
- LCD_Print(3, g_strBuf);
- }
- while(gi8Key == 0)
- {
- sprintf(g_strBuf, "Count:%d", u32Cnt++);
- LCD_Print(3, strClearVal);
- LCD_Print(3, g_strBuf);
- }
- LCD_Print(2, "Deep Sleeping...");
- /* We need to disable debounce function before power down, otherwise, there would be twice interrupt when wakeup */
- GPIO_DISABLE_DEBOUNCE(P3, BIT2);
- /* Unlock protected registers */
- SYS_UnlockReg();
- /* Prepare to enter power down */
- /* Use WFI instruction to idle the CPU.
- NOTE: If ICE is attached, system will wakeup immediately because ICE is a wakeup event.
- */
- CLK_PowerDown();
- /* Lock protected registers */
- SYS_LockReg();
- /* Re-enable debounce function if necessary */
- GPIO_ENABLE_DEBOUNCE(P3, BIT2);
- LCD_Print(2, "Working... ");
- /* Make sure the key is return to high before next key action */
- while(gi8Key == 0);
- gi8Key = 0;
- }
- }
|