deepsleep设置唤醒周期如何使用Cascade函数连接2个计数器协同工作

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
YiCh_4772066
Level 1
Level 1
Distributor - Zenitron(GC)
First question asked First reply posted

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);

}

0 点赞
1 解答
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: 我在PSoC Creator 下建的CY8C4147AZI-S445的工程,API :CySysTimerSetCascade(CY_SYS_TIMER_CASCADE_01); 可以调用。

2: 你代码里面主要的问题是把WDT timer 和additional timer(WDT0,WDT1,WDT2)混淆了。

3:我写了一个测试代码放放在附件了,请参考。

在原帖中查看解决方案

0 点赞
1 回复
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

1: 我在PSoC Creator 下建的CY8C4147AZI-S445的工程,API :CySysTimerSetCascade(CY_SYS_TIMER_CASCADE_01); 可以调用。

2: 你代码里面主要的问题是把WDT timer 和additional timer(WDT0,WDT1,WDT2)混淆了。

3:我写了一个测试代码放放在附件了,请参考。

0 点赞