最近几天在研究飞思卡尔watchdog的问题,发现网上没有很详细的资料,就想把自己知道的东西记录一下,防止自己忘记,也供别人参考。
- 什么是watchdog?
watchdog就是一个计数器,这个计数器有一个限值,开启watchdog功能后,当计数器从0自增到该限值或从该限值自减到0,就认为此计数器超时了(称为计时器溢出),这时就产生一个复位信号,重启系统。
从watchdog的含义来看,其应该包含两个条件:1)一个自增或自减的计数器;2)为防止计数器溢出,将计数器重置的操作(称为喂狗)。 - 飞思卡尔MC9S12G的watchdog
和MC9S12G watchdog相关的寄存器主要包括CPMUCLKS、CPMUCOP和CPMUARMCOP这三个。
1)CPMUCLKS寄存器涉及到时钟的选择;这和watchdog的超时时间相关;
2)CPMUCOP寄存器当然是watchdog相关的寄存器了;
3)CPMUARMCOP寄存器主要和喂狗操作相关。
图1 watchDog的时钟源
如图1所示,不同寄存器取值对应不同的时钟源,不同时钟源的主频不一样,计算watchdog超时时间就不一样,要计算watchdog超时时间,首先根据这个表格确定其时钟源。这些参数取值都在寄存器CPMUCLKS中;
图2 CPMUCOP寄存器
1)WCOP决定了watchdog的工作模式,0是正常工作模式,1是窗口工作模式;这两种模式的区别是正常工作模式内,在计时器超时之前重置计时器就可以;但在窗口工作模式,必须要某个特定时间段内重置计时器,否则就会导致立即reset。
2)RSBCK决定了watchdog在调试环境下是否还有效,0表示有效,在调试时仍然运行(这就会导致调试出错,因为watchdog在不停的重启系统),1表示无效,在调试时watchdog不工作;
3)CR[2:0]记录的是看门狗的时钟分频,其值和所选的时钟频率相关,具体取值见下图:
图3 COP的时钟分频
CPMUARMCOP寄存器主要是和喂狗操作相关,通过先将该寄存器值赋为0x55,再赋值为0xAA,便实现了计数器的重置操作。 - 飞思卡尔MC9S12G watchdog超时时间的计算方法
超时时间的计算公式如下:
fwdt = fwdtclc/CR[2:0]
举例:
实际clcok配置如下:
例一:
PCE=0,COPOSCSEL0 = 1,对应图1,满足条件的两项对应的Clock Source都是OSCCLK,即为晶振时钟,对应clock frequence为16.0MHz;CR[2:0]取值为100,对应值为2^20,则fwdt = 16Mhz/1024/1024 = 16*1000000/1024/1024=15.2587hz;对应的超时时间为T=1/fwdt = 1000ms/15.2587 = 65.536ms;
例二:
PCE=0,COPOSCSEL1 = 1,对应图1,得到其时钟为ACLK,其频率固定为10KHz,CR[2:0]为010,对应分频值为2^9=512,那么fwdt=10Khz/512=10000hz/512=19.53hz,对应的超时时间为T = 1/fwdt=1000ms/19.53=51.2ms