最近小小学习了一下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中断可以唤醒深睡眠的片子,实现低功耗。
关于低功耗的学习心得将在下面分享。 |