/******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url] main.c
* [url=home.php?mod=space&uid=895143]@version[/url] V1.00
* $Revision: 11 $
* $Date: 15/06/23 1:37p $
* [url=home.php?mod=space&uid=247401]@brief[/url] Sample code which implements a function to test system state before
* entering power-down mode. If a system consumes more power than
* expected in power-down mode, this function can be used to check if
* there is any system setting that may cause power leakage.
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "Nano1X2Series.h"
#include "sys.h"
#ifdef __DEBUG_MSG
#define DEBUG_MSG printf
#else
#define DEBUG_MSG(...)
#endif
/* External functions */
/* Global variables */
__IO int32_t _Wakeup_Flag = 0; /* 1 indicates system wake up from power down mode */
__IO uint32_t _Pin_Setting[11]; /* store Px_H_MFP and Px_L_MFP */
__IO uint32_t _PullUp_Setting[6]; /* store GPIOx_PUEN */
/**
* @brief Store original setting of multi-function pin selection.
* @param None.
* [url=home.php?mod=space&uid=266161]@return[/url] None.
*/
void SavePinSetting()
{
/* Save Pin selection setting */
_Pin_Setting[0] = SYS->PA_L_MFP;
_Pin_Setting[1] = SYS->PA_H_MFP;
_Pin_Setting[2] = SYS->PB_L_MFP;
_Pin_Setting[3] = SYS->PB_H_MFP;
_Pin_Setting[4] = SYS->PC_L_MFP;
_Pin_Setting[5] = SYS->PC_H_MFP;
_Pin_Setting[6] = SYS->PD_L_MFP;
_Pin_Setting[7] = SYS->PD_H_MFP;
_Pin_Setting[8] = SYS->PE_L_MFP;
_Pin_Setting[9] = SYS->PE_H_MFP;
_Pin_Setting[10] = SYS->PF_L_MFP;
/* Save Pull-up setting */
_PullUp_Setting[0] = PA->PUEN;
_PullUp_Setting[1] = PB->PUEN;
_PullUp_Setting[2] = PC->PUEN;
_PullUp_Setting[3] = PD->PUEN;
_PullUp_Setting[4] = PE->PUEN;
_PullUp_Setting[5] = PF->PUEN;
}
/**
* @brief Save multi-function pin setting and then go to power down.
* @param None.
* @return None.
*/
void Enter_PowerDown()
{
/* Back up original setting */
SavePinSetting();
/* Set function pin to GPIO mode */
SYS->PA_L_MFP = 0;
SYS->PA_H_MFP = 0;
SYS->PB_L_MFP = 0;
//SYS->PB_H_MFP = 0;
SYS->PB_H_MFP = (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
SYS->PC_L_MFP = 0;
SYS->PC_H_MFP = 0;
SYS->PD_L_MFP = 0;
SYS->PD_H_MFP = 0;
SYS->PE_L_MFP = 0;
SYS->PE_H_MFP = 0;
//SYS->PF_L_MFP = 0x0000FF00; // exclude GPF3:HXT_OUT, GPF2:HXT_IN
SYS->PF_L_MFP = 0x00FFFF00; // exclude GPF5:ICE_DAT, GPF4:ICE_CLK, GPF3:HXT_OUT, GPF2:HXT_IN
/* Enable GPIO pull up */
PA->PUEN = 0xFFFF;
PB->PUEN = 0xFFFF;
PC->PUEN = 0xFFFF;
PD->PUEN = 0xFFFF;
PE->PUEN = 0xFFFF;
//PF->PUEN = 0x0033; /* exclude GPF3 and GPF2 which are HXT OUT/IN */
PF->PUEN = 0x0003; /* exclude GPF5:ICE_DAT, GPF4:ICE_CLK, GPF3:HXT_OUT, GPF2:HXT_IN */
//CLK->PWRCTL |= CLK_PWRCTL_PD_WK_IE_Msk; /* Enable wake up interrupt source */
//NVIC_EnableIRQ(PDWU_IRQn); /* Enable IRQ request for PDWU interrupt */
SYS_UnlockReg();
SCB->SCR = SCB_SCR_SLEEPDEEP_Msk;
CLK->PWRCTL |= (CLK_PWRCTL_PD_EN_Msk | CLK_PWRCTL_WK_DLY_Msk );
//__WFI(); /* system really enter power down here ! */
}
void PowerDown_Check()
{
uint32_t i,j;
volatile uint32_t Tmp_NVIC_ISER;
uint32_t gpio_error_count = 0;
char *symbo_gpio[6] = {"A", "B", "C", "D", "E", "F"};
GPIO_T *tGPIO;
uint32_t SYS_MFP = 0xffffffff;
printf("\n/***** PowerDown Check *****/");
printf("\n/***** GPIO Check: *****/");
//save NVIC setting
Tmp_NVIC_ISER = NVIC->ISER[0];
//disables a device-specific interrupt in the NVIC interrupt controller
NVIC->ICER[0] = 0xFFFFFFFF;
for(j = 0; j < 11; j++) {
SYS_MFP = *((volatile unsigned int *)(SYS_BASE + 0x30 + (j *4)));
for(i = 0; i < 8; i++) {
if(SYS_MFP & (0x7 << (i*4))) {
gpio_error_count++;
printf("\nGP%s Pin %d not set GPIO !!", symbo_gpio[(j/2)], (i+(8*(j%2))) );
}
}
}
if( (SYS->PF_L_MFP & SYS_PF_L_MFP_PF2_MFP_XT1_IN) != SYS_PF_L_MFP_PF2_MFP_XT1_IN) {
printf("\nGPF Pin 2 not set HXT_OUT !!!");
printf("\nPlease Check GPF Pin 2 not connect crystal !!!");
}
if( (SYS->PF_L_MFP & SYS_PF_L_MFP_PF3_MFP_XT1_OUT) != SYS_PF_L_MFP_PF3_MFP_XT1_OUT) {
printf("\nGPF Pin 3 not set HXT_IN !!!");
printf("\nPlease Check GPF Pin 3 not connect crystal !!!");
}
for(j = 0; j < 6; j++) {
tGPIO =(GPIO_T*)((uint32_t)PA + (j * (0x40)));
for(i = 0; i < 16; i++) {
if((j == 4) & (i > 9)) // GPE
break;
if((j == 5) & (i > 5)) // GPF
break;
if(!(tGPIO->PIN & (1 << i))) {
gpio_error_count++;
printf("\nGP%s Pin %d can not pull high!!", symbo_gpio[j], i);
}
}
}
if(gpio_error_count)
printf("\nGPIO Check fail !!");
else
printf("\nGPIO Check pass");
printf("\n");
printf("\n/***** Clock Check: *****/");
if(CLK->PWRCTL & CLK_PWRCTL_HXT_EN)
printf("\nHXT Enable");
else
printf("\nHXT Disable");
if(CLK->PWRCTL & CLK_PWRCTL_LXT_EN)
printf("\nLXT Enable");
else
printf("\nLXT Disable");
if(CLK->PWRCTL & CLK_PWRCTL_HIRC_EN)
printf("\nHIRC Enable");
else
printf("\nHIRC Disable");
if(CLK->PWRCTL & CLK_PWRCTL_LIRC_EN)
printf("\nLIRC Enable");
else
printf("\nLIRC Disable");
printf("\n");
printf("\n/***** Power Down setting check: *****/");
if(CLK->PWRCTL & CLK_PWRCTL_PWRDOWN_EN)
printf("\nChip Power-down mode Enable ");
else
printf("\nChip Power-down mode Disable !!!");
if(SCB->SCR & 0x04)
printf("\nSCB->SCR set (0x%x) : ok", SCB->SCR);
else
printf("\nSCB->SCR set (0x%x) : error", SCB->SCR);
//Restore NVIC->ISER setting
NVIC->ISER[0] = Tmp_NVIC_ISER;
printf("\n");
printf("\n/***** Wake-up setting check: *****/");
if(CLK->PWRCTL & CLK_PWRCTL_DELY_EN)
printf("\nWake-up Delay Counter Enable");
else
printf("\nWake-up Delay Counter Disable");
if(CLK->PWRCTL & CLK_PWRCTL_WAKEINT_EN)
printf("\nPower-down Mode Wake-up Interrupt Enable");
else
printf("\nPower-down Mode Wake-up Interrupt Disable");
if( NVIC->ISER[0] & (1 << ((uint32_t)(PDWU_IRQn) & 0x1F)) )
printf("\nEnable PDWU_IRQn request for PDWU interrupt");
else
printf("\nDisable PDWU_IRQn request for PDWU interrupt");
printf("\n");
printf("\n/***** ISR check: *****/");
if(NVIC_GetPendingIRQ(PDWU_IRQn))
printf("\nPowerDown WakeUp Interrupt status is pending. (check fail)");
else
printf("\nPowerDown WakeUp Interrupt status is not pending. (check ok)");
if(CLK->WK_INTSTS & 0x1)
printf("\nWake-up Interrupt Status is set. (check fail)");
else
printf("\nWake-up Interrupt Status is not set. (check ok)");
printf("\n");
printf("\n/***** PowerDown Check End *****/");
}
void SYS_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock */
/*---------------------------------------------------------------------------------------------------------*/
/* Unlock protected registers */
SYS_UnlockReg();
/* Enable IP clock */
CLK->APBCLK |= CLK_APBCLK_UART0_EN; // UART0 Clock Enable
/* Select IP clock source */
CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
CLK->CLKSEL1 |= (0x3 << CLK_CLKSEL1_UART_S_Pos);// Clock source from HIRC
/* Update System Core Clock */
/* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
SystemCoreClockUpdate();
/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* Set PB multi-function pins for UART0 RXD and TXD */
SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB0_MFP_Msk|SYS_PB_L_MFP_PB1_MFP_Msk);
SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB0_MFP_UART0_TX|SYS_PB_L_MFP_PB1_MFP_UART0_RX);
/* Lock protected registers */
SYS_LockReg();
}
void UART0_Init()
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init UART */
/*---------------------------------------------------------------------------------------------------------*/
UART_Open(UART0, 115200);
}
/**
* @brief Main routine.
* @param None.
* @return None.
*/
int32_t main(void)
{
SYS_Init();
UART0_Init();
/* Prepare to enter power down mode, to demo the usage of PowerDown_Check(),
this function does not actually put this system to power down mode */
Enter_PowerDown();
/* Check system state before enter power down mode */
PowerDown_Check();
}
/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
|