作者:卢老师,华清远见嵌入式学院讲师。
WDT看门狗基本原理
看门狗,又叫Watchdog Timer,是一个定时器电路,一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端。MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给WDT清零,如果超过规定的时间不喂狗(一般在程序跑飞时),WDT定时超过预先设定值,就会给出一个复位信号到MCU,使MCU重新开始工作。看门狗的作用就是防止程序发生死循环,或者叫程序跑飞。
在SAM3S系统中,用于看门狗的递减计数器是12位,可以计数的最大周期为16s(慢速时钟,32.768Khz),其加载的值为慢速时钟的128分频。
图7-56给出WDT时钟模块寄存器控制逻辑:
图7-56 WDT时钟模块寄存器
SAM3S4B复位后,WDV的值为0xfff,允许外部复位,默认情况下,看门狗是处于运行状态,如果用户没有使能看门狗,就需要禁止看门狗,否则需要定时“喂狗”。
看门狗模式寄存器WDT_MR只能写一次,之后,复位后重新加载定时器。
在正常情况下,用户定期向WDT_CR的WDRSTT位置1,重载看门狗定时器。WDRSTT置位后,计数器从WDT_MR重新加载,并重新启动。慢速时钟128分频器也被复位及重新启动。WDT_CR是写保护寄存器,若预设值不正确,对WDT_CR的操作无效,如果发生计数器益处,且WDR_MR的WDRSTEN为1,产生“wdt_fault”,WDT_SR的WDUNF置位。
为防止软件死锁,在0和WDD之间重新加载看门狗,WDD在看门狗模式下WDT_MR中定义。
如果试图在WDV和WDD之间重启看门狗定时器,将会导致看门狗错误,即使看门狗被禁止。这将导致WDT_SR中的WDERR位被修改,wdt_fault生效。若WDD不小于WDV的值时,上述功能是无效的,看门狗定时器允许在0和WDV之间重新启动,不产生错误,芯片缺省的复位状态时WDV=WDD。
如果WDFIFN=1,WDRSTEN=0,则WDUNF(看门狗溢出)和WDERR(看门狗错误)置位,触发中断;如果WDFIFN=1,WDRSTEN=1,则触发wdt_fault,复位,WDERR,WDUNF被清零。
如果复位已经产生,读WDT_SR寄存器,状态复位,中断被清楚,此时wdt_fault无效,执行WDT_MR写操作,将重新加载计数器,是CPU复位。
在调试和空闲状