打印

关于PSOC3的sleep mode及PICU唤醒并复位的问题

[复制链接]
3069|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WalKerOne|  楼主 | 2010-8-1 09:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想利用一个端口的上升沿中断让系统进入睡眠模式,然后下降沿中断唤醒,并重置系统。上电后默认端口是高电平,默认上电后进入睡眠。代码如下:
// 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值等)。
不知道各位有没有过这种应用啊????
沙发
cosmicy| | 2010-8-1 11:42 | 只看该作者
首先要知道产生复位的方式,有没有利用GPIO的下降沿的,有的话,也要保证进入sleep后它能够起作用,并在进入sleep前,将这个下降沿的复位方式设置好。
你用的是同一个引脚实现sleep和复位吗?

使用特权

评论回复
板凳
WalKerOne|  楼主 | 2010-8-1 12:04 | 只看该作者
本帖最后由 WalKerOne 于 2010-8-1 12:07 编辑

GPIO的中断不直接产生复位吧?我的程序是,利用这个下降沿中断改变标志位,然后在主程序中退出sleep mode后马上判断这个标志位,然后进行软件复位。
是用同一引脚实现sleep和复位。

使用特权

评论回复
地板
jxin| | 2010-8-4 11:33 | 只看该作者
而复位后我的系统初始化程序读出来的RTC却不是最新值,又变成0)。
-复位以后RTC寄存器也复位了,应该不会读出最新值。

我的想法是进入睡眠模式后,所有模块不工作,只有RTC在运行,而在下降沿中断后系统重置复位(包括各种全局变量),然后重新运行一遍初始化程序(包括读取当前RTC值等)。
-只能在复位之前读出RTC值,复位后就不存在了
www.cypress.com 有wakeup参考例子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

42

帖子

1

粉丝