| 
 
| 版主,你好!我用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();  //如果是关机,则进入掉电模式
 }
 }
 }
 | 
 |