我想利用一个端口的上升沿中断让系统进入睡眠模式,然后下降沿中断唤醒,并重置系统。上电后默认端口是高电平,默认上电后进入睡眠。代码如下:
// main.c
uint8 fSleep = 1; // The pin is high level after power on, so the system will go to sleep after initialization when power on.
uint8 fReset = 0;
void main(void)
{
// System initial - ADC, I2C, Counter, Timer, PWM, RTC components and their relate interrupt start, read RTC time and send them to LCD display using I2C.
for(;;){
while((Sta_Lock_Read() == 1) && (fSleep == 1)) // if the rising edge interrupt happened, go to sleep
CySleep();
if((Sta_Lock_Read() == 0) && (fSleep == 0) && (fReset == 0)){ // if the falling edge interrupt happened
fReset = 1; // flag of reset
CY_SET_REG8(CYREG_RESET_CR2,0x01); // Reset system after wakeup from sleep
}
// Normal code ……
}
}
// isr_sta_lock.c
extern uint8 fSleep;
extern uint8 fReset;
extern uint8 sta_lock_Read(void);
CY_ISR(isr_sta_lock_Interrupt)
{
/* Place your Interrupt code here. */ /* `#START isr_sta_lock_Interrupt` */
sta_lock_ClearInterrupt();
if(sta_lock_Read() == 1){
fSleep = 1;
}
else{
fSleep = 0;
fReset = 0;
}
}
程序运行后,每次上升沿后sleep是可以进入,但有时是重置了系统以后再进入睡眠。而下降沿也不能复位(按理说进入sleep mode以后RTC是一直在工作的,而复位后我的系统初始化程序读出来的RTC却不是最新值,又变成0)。而且在sleep mode时,有时候其他端口中断可用,有时候又没用。反正系统并不如我想象的那样正常工作。
我的想法是进入睡眠模式后,所有模块不工作,只有RTC在运行,而在下降沿中断后系统重置复位(包括各种全局变量),然后重新运行一遍初始化程序(包括读取当前RTC值等)。
不知道各位有没有过这种应用啊????
|