我初始化看门狗、以便在计数器溢出时执行复位:
void watchdog_init_dog()
{
EALLOW;
SysCtrlRegs.SCSR |= 0x0001;//禁用 WD intr、启用 WD 复位
SysCtrlRegs.WDCR = 0x00AF;// 10 10 1 111
//清除、启用复位、PGM reg、将 WD 频率设置为90m/512/64 = 2747Hz。
EDIS;
返回;
}
并在以下函数中检查复位:
void watchdog_check_bitten ()
{
///查看我们为何重新启动
WD_bitten_BY_HW_DOG_FLAG = SysCtrlRegs.WDCR 和0x0080;
}
我还使用时钟对在 app.cfg 中设置的看门狗计数器进行复位。
var clock5Params = new Clock.Params ();
clock5Params.instance.name ="看门狗_CTR_reset_hndl";
clock5Params.period = 82;//将0.082周期设置为默认值。 WDCTR 每秒约耗尽12次。 1000/12=83.33。 通过使周期变小、使其速度加快一点。
clock5Params.startFlag = true;
program.global.watchdog_reset_hndl = Clock.create ("&watchdog_CTR_reset"、82、clock5Params);
上述函数都在 main()中调用:
int main()
{
WATCHDOG_CHECK_BITTEN ();
公司名称: (其他初始化函数)
watchdog_init_dog ();//必须在 BIOS 启动前立即运行
ServiceDog ();
BIOS_start();/*不返回*/
返回(0);
}
为了测试看门狗是否正常工作、我在其中一个 ISR 例程中触发无限循环。 处理器确实会复位、但 WDCR WDFLAG 始终为0。 它不应该在 WD 复位后为1吗?