/**************************************************************************//** * [url=home.php?mod=space&uid=288409]@file[/url] main.c * [url=home.php?mod=space&uid=895143]@version[/url] V3.00 * @brief * Show how to wake up system form Power-down mode by brown-out detector interrupt. * * * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2019 Nuvoton Technology Corp. All rights reserved. * ******************************************************************************/ #include <stdio.h> #include "NuMicro.h" /*---------------------------------------------------------------------------------------------------------*/ /* Function for System Entry to Power Down Mode */ /*---------------------------------------------------------------------------------------------------------*/ void PowerDownFunction(void) { /* Check if all the debug messages are finished */ UART_WAIT_TX_EMPTY(DEBUG_PORT); /* Enable Power-down mode wake-up interrupt */ CLK->PWRCTL |= CLK_PWRCTL_PDWKIEN_Msk; /* Enter to Power-down mode */ CLK_PowerDown(); } /*---------------------------------------------------------------------------------------------------------*/ /* Brown Out Detector IRQ Handler */ /*---------------------------------------------------------------------------------------------------------*/ void BOD_IRQHandler(void) { /* Clear BOD Interrupt Flag */ SYS_CLEAR_BOD_INT_FLAG(); printf("Brown Out is Detected.\n"); } /*---------------------------------------------------------------------------------------------------------*/ /* Power-down Mode Wake-up IRQ Handler */ /*---------------------------------------------------------------------------------------------------------*/ void PWRWU_IRQHandler(void) { /* Check system power down mode wake-up interrupt status flag */ if(CLK->PWRCTL & CLK_PWRCTL_PDWKIF_Msk) { /* Clear system power down wake-up interrupt flag */ CLK->PWRCTL |= CLK_PWRCTL_PDWKIF_Msk; printf("System wake-up from Power-down mode.\n"); } } void SYS_Init(void) { /* Set PF multi-function pins for XT1_OUT(PF.2) and XT1_IN(PF.3) */ SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF2MFP_Msk)) | SYS_GPF_MFPL_PF2MFP_XT1_OUT; SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF3MFP_Msk)) | SYS_GPF_MFPL_PF3MFP_XT1_IN; /*---------------------------------------------------------------------------------------------------------*/ /* Init System Clock */ /*---------------------------------------------------------------------------------------------------------*/ /* Enable HIRC clock */ CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk); /* Wait for HIRC clock ready */ CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk); /* Select HCLK clock source as HIRC and HCLK source divider as 1 */ CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1)); /* Enable HXT clock */ CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); /* Wait for HXT clock ready */ CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); /* Enable PLL */ CLK->PLLCTL = CLK_PLLCTL_128MHz_HIRC; /* Waiting for PLL stable */ CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk); /* Select HCLK clock source as PLL and HCLK source divider as 2 */ CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(2)); /* Update System Core Clock */ /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */ SystemCoreClockUpdate(); /* Enable UART module clock */ CLK_EnableModuleClock(UART0_MODULE); /* Select UART module clock source as HXT and UART module clock divider as 1 */ CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1)); /*---------------------------------------------------------------------------------------------------------*/ /* Init I/O Multi-function */ /*---------------------------------------------------------------------------------------------------------*/ /* Set multi-function pins for UART0 RXD and TXD */ SYS->GPB_MFPH = (SYS->GPB_MFPH & (~(UART0_RXD_PB12_Msk | UART0_TXD_PB13_Msk))) | UART0_RXD_PB12 | UART0_TXD_PB13; } void UART0_Init(void) { /*---------------------------------------------------------------------------------------------------------*/ /* Init UART */ /*---------------------------------------------------------------------------------------------------------*/ /* Reset UART0 */ SYS_ResetModule(UART0_RST); /* Configure UART0 and set UART0 baud rate */ UART_Open(UART0, 115200); } /*---------------------------------------------------------------------------------------------------------*/ /* Main Function */ /*---------------------------------------------------------------------------------------------------------*/ int32_t main(void) { /* Unlock protected registers */ SYS_UnlockReg(); /* Init System, peripheral clock and multi-function I/O */ SYS_Init(); /* Lock protected registers */ SYS_LockReg(); /* Init UART0 for printf */ UART0_Init(); printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock); printf("+------------------------------------------------+\n"); printf("| Power-down and Wake-up Sample Code |\n"); printf("+------------------------------------------------+\n"); /* Unlock protected registers before setting Brown-out detector function and Power-down mode */ SYS_UnlockReg(); /* Enable Brown-out detector function */ SYS_ENABLE_BOD(); /* Set Brown-out detector voltage level as 3.0V */ SYS_SET_BOD_LEVEL(SYS_BODCTL_BODVL_3_0V); /* Enable Brown-out detector interrupt function */ SYS_DISABLE_BOD_RST(); /* Enable Brown-out detector and Power-down wake-up interrupt */ NVIC_EnableIRQ(BOD_IRQn); NVIC_EnableIRQ(PWRWU_IRQn); printf("System enter to Power-down mode.\n"); printf("System wake-up if VDD voltage is lower than 3.0V.\n\n"); /* Enter to Power-down mode */ PowerDownFunction(); /* Wait for Power-down mode wake-up interrupt happen */ while(1); } /*** (C) COPYRIGHT 2019 Nuvoton Technology Corp. ***/
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
232
3223
12
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号