版主,你好!我用NUC120的定时器0每隔1秒使LED闪烁显示,表征系统在普通模式下正常工作。定时器时钟源选用外部12M晶振。系统上电进入掉电模式,LED不闪烁显示,等待GPIO中断唤醒之。唤醒后,系统又开始正常工作,LED闪烁显示。GPIO采用按键取反,标志位POWER_ON_OFF为1表示开机(系统打开),标志位为0表示关机(进入掉电模式)。我的程序代码能够正常进行开/关机1次,第二次想让他再次开机(重新唤醒掉电)就不行了,很奇怪啊。。。程序代码在下面,忘得以指点!!!
#include "NUC1xx.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvTIMER.h"
/**定时器0中断回调函数**/
void TMR0_ISR_Callback(uint32_t num)
{
static volatile uint8_t temp = 0;
if(num == 0)
{
temp ++;
if(temp == 2)temp = 0;
if(temp == 0)
{
DrvGPIO_ClrBit(E_GPA,12);
}
else
{
DrvGPIO_SetBit(E_GPA,12);
}
}
}
/**定时器0初始化**/
void Timer_Initinization(void)
{
DrvTIMER_Init();
DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC, 0x00);
DrvSYS_SetIPClock(E_SYS_TMR0_CLK, 1); /* Enable TIMER0 engine clock */
DrvTIMER_Open(E_TMR0, 1, E_PERIODIC_MODE); /* Using TIMER0 at PERIODIC_MODE, 1 ticks/sec */
DrvTIMER_SetTimerEvent(E_TMR0, 1, (TIMER_CALLBACK)TMR0_ISR_Callback, 0);
DrvTIMER_EnableInt(E_TMR0); /* Enable Timer-0 interrupt function */
DrvTIMER_Start(E_TMR0); /* Start to count the Timer-0 */
}
volatile uint8_t POWER_ON_OFF = 0;
void EINT0Callback(void)
{
uint32_t key_value;
key_value = DrvGPIO_GetBit(E_GPB, 14);
if(!key_value)
{
DrvSYS_Delay(5000);
key_value = DrvGPIO_GetBit(E_GPB, 14);
if(!key_value)
{
do
{
key_value = DrvGPIO_GetBit(E_GPB, 14);
}
while(!key_value);
POWER_ON_OFF ++; //开/关机标志切换
if(POWER_ON_OFF == 2)POWER_ON_OFF = 0; //POWER_ON_OFF = 1 表示开机;POWER_ON_OFF = 0表示关机
}
}
}
void MCU_System_Initial(void)
{
UNLOCKREG(); //解锁被保护的寄存器
DrvSYS_SetOscCtrl(E_SYS_XTL12M, TRUE); //使能外部晶振时钟
DrvSYS_Delay(5000); //延时,等待外部晶振时钟稳定
SYSCLK -> PWRCON.OSC10K_EN = 1;
SYSCLK -> PLLCON.PLL_SRC = 0;
DrvSYS_Open(50000000); // 打开50MHz
LOCKREG(); //重新锁上被保护的寄存器
DrvGPIO_Open(E_GPB, 14, E_IO_INPUT); //PB14(INT0)设置为输入模式
DrvGPIO_EnableDebounce(E_GPB, 14); //使能输入引脚去抖动功能
DrvGPIO_SetDebounceTime(4, E_DBCLKSRC_10K);//设定去抖动采样时间
DrvGPIO_InitFunction(E_FUNC_EXTINT0); //使能外部0中断功能
DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback); //设定外部0中断触发类型以及安装中断回调函数
DrvGPIO_Open(E_GPC, 6, E_IO_OUTPUT); //控制GPS模块电源输出的LDO引脚
DrvGPIO_Open(E_GPC, 7, E_IO_OUTPUT); //控制LCD模块电源输出的LDO引脚
DrvGPIO_Open(E_GPA, 12, E_IO_OUTPUT);
DrvGPIO_SetBit(E_GPA, 12); //关闭LED输出显示
}
void MCU_Enter_Mode(void)
{
UNLOCKREG();
SYSCLK->;PWRCON.PWR_DOWN_EN = 1;
SYSCLK->;PWRCON.PD_WAIT_CPU = 0; //进入掉电模式
LOCKREG();
}
int main(void)
{
MCU_System_Initial(); //系统时钟及GPIO初始化
Timer_Initinization(); //定时器0初始化
MCU_Enter_Mode(); //CPU进入掉电模式,等待GPIO中断唤醒
while(1)
{
if(!POWER_ON_OFF) //判断开/关机键是否按下
{
MCU_Enter_Mode(); //如果是关机,则进入掉电模式
}
}
} |