Hi
有个项目使用CY8C4147AZI-S445芯片,需求为进入DeepSleep模式120秒后唤醒。
使用PSoCCreator新建工程后CyLFClk.c中CySysWdtSetCascade函数为灰色不知该修改何处定义是能该部分函数功能。
尝试了如下函数进行测试可以进入DeepSleep模式并唤醒,但唤醒周期明显与预想值不同且不受控制,求教改如何正确设置。
int main(void)
{
LowPower_Init();
CyGlobalIntEnable; /* Enable global interrupts. */
for(;;)
{
LED_Write(AUXON);
delay(1000000);
LED_Write(AUXOFF);
CySysPmDeepSleep();
}
}
CY_ISR(wdt_Callback)
{
/* Clear WDT interrupt */
CySysWdtClearInterrupt();
CyIntClearPending(1);
CySysTimerSetMatch(0, CySysTimerGetMatch(0)+32768);
CySysTimerSetMatch(1, CySysTimerGetMatch(1)+10);
}
void LowPower_Init(void)
{
CySysWdtDisable();
CySysWdtMaskInterrupt(); // Disable WDT interrupt
CySysTimerDisable(CY_SYS_TIMER0_MASK);
CySysTimerDisable(CY_SYS_TIMER1_MASK);
// CY_SYS_TIMER_RESET CY_SYS_TIMER_MODE_NONE CY_SYS_TIMER_MODE_INT
CySysTimerSetMode(CY_SYS_WDT_COUNTER0, CY_SYS_TIMER_MODE_NONE);
CySysTimerSetMatch(CY_SYS_WDT_COUNTER0, 65535);
/* Counter 0 is cleared when there is match */
CySysTimerSetClearOnMatch(CY_SYS_WDT_COUNTER0, 1u);
CySysTimerDisable(CY_SYS_TIMER0_MASK);
CySysTimerDisable(CY_SYS_TIMER1_MASK);
/* Enable WDT conters 0 and 1 cascade */
CySysTimerSetCascade(CY_SYS_TIMER_CASCADE_01);
/* Set the second WDT counter to generate reset on match */
CySysTimerSetMode(1, CY_SYS_TIMER_MODE_INT);
CySysTimerSetMatch(1, 10);
/* Counter 1 is cleared when there is match */
CySysTimerSetClearOnMatch(1, 1);
CySysTimerEnable(CY_SYS_TIMER0_MASK);
CySysTimerEnable(CY_SYS_TIMER1_MASK);
// CySysTimerEnableIsr(1);
CySysWdtUnmaskInterrupt(); // Enable WDT interrupt
isr_1_StartEx(wdt_Callback);
CyIntSetVector(1, wdt_Callback);
CyIntEnable(1);
}
已解决! 转到解答。
1: 我在PSoC Creator 下建的CY8C4147AZI-S445的工程,API :CySysTimerSetCascade(CY_SYS_TIMER_CASCADE_01); 可以调用。
2: 你代码里面主要的问题是把WDT timer 和additional timer(WDT0,WDT1,WDT2)混淆了。
3:我写了一个测试代码放放在附件了,请参考。
1: 我在PSoC Creator 下建的CY8C4147AZI-S445的工程,API :CySysTimerSetCascade(CY_SYS_TIMER_CASCADE_01); 可以调用。
2: 你代码里面主要的问题是把WDT timer 和additional timer(WDT0,WDT1,WDT2)混淆了。
3:我写了一个测试代码放放在附件了,请参考。