1、看门狗介绍
看门狗计数器有两个,一种是计数时钟源为专用内部 RC( SWDTLRC:10KHz)的专用
看门狗计数器( SWDT), 另一种是计数时钟源为 PCLK3 的通用看门狗计数器( WDT)。
专用看门狗和通用看门狗是 16 位递减计数器,用来监测由于外部干扰或不可预见的逻
辑条件造成的应用程序背离正常的运行而产生的软件故障。
2、启动看门狗
这里只介绍SWDT看门狗的启动方式,该看门狗由内部时钟控制,比较适合检测由于软件导致的系统跑飞,并进行复位重启。
1、ddl_config.h 头文件中开启相应的宏
#define DDL_ICG_ENABLE (DDL_ON)
#define DDL_SWDT_ENABLE (DDL_ON)
2、hc32f4a0_icg.h 头文件中配置相应的宏
SWDT是硬件启动,所以只需要配置这几个宏即可。
#define ICG0_RB_SWDT_AUTS (ICG_SWDT_RESET_AUTOSTART)
#define ICG0_RB_SWDT_ITS (ICG_SWDT_TRIG_RESET) /* 触发复位*/
#define ICG0_RB_SWDT_PERI (ICG_SWDT_COUNTER_CYCLE_256) /* 时钟周期数 */
#define ICG0_RB_SWDT_CKS (ICG_SWDT_CLOCK_DIV32) /* 时钟分频 */
#define ICG0_RB_SWDT_WDPT (ICG_SWDT_RANGE_0TO100PCT) /* 刷新允许区域 0-100%*/
#define ICG0_RB_SWDT_SLTPOFF (ICG_SWDT_LPM_COUNT_CONTINUE) /*休眠状态下仍然计数 */
看门狗复位时间计算 = 分频 * 计数值 / 10K
上述看门狗复位时间计算: T = 256 * 32 / (10000) = 0.8192S
所以程序中需要在0.8秒以内不断的进行喂狗操作SWDT_Feed();,否则会复位重启。
3、注意事项
1、若存在boot代码,SWDT看门狗需要在boot代码中配置,若是在app代码中配置,不起作用。
2、摘抄HC32F4A0数据手册中的一段话:
上述配置的宏会写入到内部Flash的0x400地址处,如下代码所示:
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
const uint32_t u32ICG[] __attribute__((section(".ARM.__at_0x400"))) =
#elif defined (__GNUC__) && !defined (__CC_ARM)
const uint32_t u32ICG[] __attribute__((section(".icg_sec"))) =
#elif defined (__CC_ARM)
const uint32_t u32ICG[] __attribute__((at(0x400))) = /* 该句起作用 */
#elif defined (__ICCARM__)
#pragma location = 0x400
__root static const uint32_t u32ICG[] =
#else
#error "unsupported compiler!!"
#endif
{
/* ICG 0~3 */
ICG_REG_CFG0_CONSTANT,
ICG_REG_CFG1_CONSTANT,
ICG_REG_CFG2_CONSTANT,
ICG_REG_CFG3_CONSTANT,
/* Reserved 0~3 */
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
/* Reserved 4~7 */
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
/* Reserved 8~11 */
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
/* Reserved 12~15 */
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
/* Reserved 16~19 */
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
ICG_RESERVED_CONSTANT,
};