打印

psoc学习总结(二)WDT

[复制链接]
3294|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gll123|  楼主 | 2015-8-19 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近小小学习了一下psoc的watchdog~有一点经验,记录一下~
1: Psoc1:
watdog在psoc1里面的使用相对来说比较简单一点,就是在designer的界面上面,在global resource下面选sleep timer。也可以在对话框里面选择watchdog enable,也可以使用调用代码M8C_EnableWatchDog
但是要在程序里面清狗,就是M8C_ClearWDT.
如何计算这个reset的时间?
如果你在sleeptimer里面选的64HZ,那么时间就是1/64=15.625ms.但是因为ILO可能有100%的偏差,最小的时间就是7.8ms,三次不响应就自动reset,所以最小在3*7.8=23.4ms 的时间之内必须要clear watdog.
2: pSoC4:
watdog在PSoC4里面可以被配置成三种模式,1:计数时间到产生中断 2:3次计数时间到复位 3:时间到产生中断/复位

#include <project.h>

/* WDT counter configuration */
#define WDT_COUNT0_MATCH    (0x4FFFu)
#define WDT_COUNT1_MATCH    (0x0008u)

/* Prototype of WDT ISR */
CY_ISR_PROTO(WdtIsrHandler);


/*******************************************************************************
* Function Name: main
********************************************************************************
*
* Summary:
*  Determines the reset cause and blinks associated LED. Configures the WDT
*  counters 0 and 1 to generate interrupts and reset the device respectively.
*
* Parameters:
*  None
*
* Return:
*  None
*
*******************************************************************************/
int main()
{   
    /* Determine reset cause. */
    if (0u == CySysGetResetReason(CY_SYS_RESET_WDT))
    {
        /* Toggle LED_Reset at startup after PowerUp/XRES event. */
        LED_Reset_Write(0u);
        CyDelay(500u);
        LED_Reset_Write(1u);
    }
    else
    {
        /* Toggle LED_WdtReset at startup after WDT reset event. */
        LED_WdtReset_Write(0u);
        CyDelay(500u);
        LED_WdtReset_Write(1u);
    }

        /* Setup ISR for interrupts at WDT counter 0 events. */
    WdtIsr_StartEx(WdtIsrHandler);

    /* Enable global interrupts. */
    CyGlobalIntEnable;
       
        /* Set WDT counter 0 to generate interrupt on match */
        CySysWdtWriteMode(CY_SYS_WDT_COUNTER0, CY_SYS_WDT_MODE_INT);
        CySysWdtWriteMatch(CY_SYS_WDT_COUNTER0, WDT_COUNT0_MATCH);
        CySysWdtWriteClearOnMatch(CY_SYS_WDT_COUNTER0, 1u);
       
        /* Enable WDT counters 0 and 1 cascade */
        CySysWdtWriteCascade(CY_SYS_WDT_CASCADE_01);
   
        /* Set WDT counter 1 to generate reset on match */
        CySysWdtWriteMatch(CY_SYS_WDT_COUNTER1, WDT_COUNT1_MATCH);
        CySysWdtWriteMode(CY_SYS_WDT_COUNTER1, CY_SYS_WDT_MODE_RESET);
    CySysWdtWriteClearOnMatch(CY_SYS_WDT_COUNTER1, 1u);
       
        /* Enable WDT counters 0 and 1 */
        CySysWdtEnable(CY_SYS_WDT_COUNTER0_MASK | CY_SYS_WDT_COUNTER1_MASK);
       
        /* Lock WDT registers and try to disable WDT counters 0 and 1 */
        CySysWdtLock();
        CySysWdtDisable(CY_SYS_WDT_COUNTER1_MASK);
        CySysWdtUnlock();
       
        for(;;)
    {

    }
}


/*******************************************************************************
* Function Name: WdtIsrHandler
********************************************************************************
* Summary:
*  Interrupt handler for WDT counter 0 interrupts. Toggles the LED_WdtInt pin.
*
* Parameters:
*  None
*
* Return:
*  None
*
*******************************************************************************/
CY_ISR(WdtIsrHandler)
{
        /* Toggle pin state */
        LED_WdtInt_Write(~(LED_WdtInt_Read()));

    /* Clear interrupts state */
        CySysWdtClearInterrupt(CY_SYS_WDT_COUNTER0_INT);
    WdtIsr_ClearPending();
}


/* [] END OF FILE */

看门狗和定时器的区别,我的理解是,如果配置成定时器就是定时时间到就产生中断,如果配成看门狗,就是三次定时时间到,没有清狗就软件复位。watchdog中断可以唤醒深睡眠的片子,实现低功耗。
关于低功耗的学习心得将在下面分享。
沙发
飞翔的控制器| | 2015-8-19 16:55 | 只看该作者
不错,PSoC1我不太了解,但是不应该是3次未清才复位吧

使用特权

评论回复
板凳
gll123|  楼主 | 2015-8-24 09:03 | 只看该作者
:handshake 是的

使用特权

评论回复
地板
leijixiaomile| | 2015-8-24 14:04 | 只看该作者
学习了,期待楼主分享关于PSoC 3/4/5的WDT

使用特权

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

本版积分规则

20

主题

186

帖子

3

粉丝