WDT
WDT(WatchDog Timer)是MCU(微控制单元)中常用的模块。是一个定时器电路,有一个俗称“喂狗”的操作,同时有一个输出连接到MCU的全局复位端。用途是防止程序发生“死”循环或者”跑飞“。
功能特性
- 本质31位计数器,每个周期++。
- 支持可编程寄存器设定计数器阈值,比较值达到阈值会产生复位信号或者中断。
- 无“看门狗”,可作为精确的周期性中断发生器。
- 对密码寄存器写入密码后才能对“看门狗”操作,可以防止错误代码意外写入WDT的寄存器。
寄存器
- 寄存器名称 地址 复位默认值 描述
- WDOGCFG 0x1000_0000 0x0 配置寄存器
- WDOGCOUNT 0x1000_0008 0x0 计数器计数值寄存器
- WDOGS 0x1000_0010 0x0 计数器比较值寄存器
- WDOGFEED 0x1000_0018 0x0 "喂狗"寄存器
- WDOGKEY 0x1000_001C 0x0 密码寄存器
- WDOGCMP 0x1000_0020 0xFFFF 比较器寄存器
WDOGCFG 各比特域描述
比特域:一种由结构体扩展而来的数据结构形式,也成为位域或占位符。
- WDOGCMPIP 28 可读可写 0x0 反映WDT产生的中断等待状态。软件可以改变此域值,写入0清除中断。
- WDOGENCOREAWAKE 13 可读可写 0x0 值为1,计数器仅在主域没有被PMU(电源管理单元)关电时进行计数。
- WDOGENALWAYS 12 可读可写 0x0 值配置为1,计数器一直计数
- WDOGZEROCMP 9 可读可写 0x0 值配置为1,计数器到阈值将会清零,可以利用此特性产生周期性中断;值配置为0,到达阈值不会清零
- WDOGRSTEN 8 可读可写 0x0 阈值配置为1,WDT可以产生全局复位;0,不能
- WDOGSCALE 3:0 可读可写 0x0 用于指定从WDOGCOUNT寄存器取出16位的低起始位置
WDT的计数器计数值寄存器-WDOGCOUNT
WDOGCOUNT是一个31位可读可写寄存器,计数器使能后,每个时钟周期自增1。
- 在蜂鸟E203MCU中,WDT处于常开域的时钟域。
- 由于常开域的低速时钟频率为32.768kHz,因此,在理论上,31位的计数器可以计
时超过18小时(约65536秒)。
使能条件
- 条件1:如果WDOGCFG寄存器的WDOGENALWAYS域的值被配置为1,则计数器永远进行计数。
- 条件2:如果WDOGCFG寄存器的WDOGENCOREAWAKE域的值被配置为1,则计数器仅在主域没有被PMU(电源管理单元)关电时进行计数。
计数器清零情况
- WDT的计数器在系统复位后会被清零。
- 在软件通过写入特殊值至WDOGFEED寄存器进行“喂狗”操作时,WDT的计数器将会被清零。读者可通过2.11.7节了解“喂狗”操作的更多信息。
- 如果WDOGCFG寄存器的WDOGZEROCMP域的值被配置为1,计数器的比较值不
断自增并达到了设定的比较阈值,那么WDT的计数器将会被清零。
解锁寄存器–WDOGKEY
WDT在正常状态下处于被锁定状态。若需要写WDT寄存器需要先解锁。
- WDOGKEY寄存器是一个1位的寄存器,其值为0表示WDT处于上锁状态,值为1表示WDT处于解锁状态。
- WDT在上电复位后处于上锁状态,即WDOGKEY寄存器的值为0。
- 软件将特定值0x51F15E写入WDOGKEY寄存器,则将WDT解锁,即WDOGKEY寄存器的值变为1。
- 除解锁操作外,在软件对任何wDT相关的寄存器进行写操作后,WDT将会重新上锁。
“喂狗寄存器”–WDOGFEED
WDT通过将特定值0xD09F00D写入WDOGFEED寄存器,从而达到“喂狗”的效果,之后,WDT计数器清零。
写入之前必须先解锁。WDOGFEED寄存器专门用于“喂狗”的写操作。如果软件读WDOGFEED寄存器的值,则永远返回0。
WDT的计数器比较值寄存器–WDOGS
寄存器的值来自计数值寄存器取出的16位。配置寄存器WDOGGCFG的WDOGSCALE指定16位的起始位置。WDOGS是一个只读寄存器。
如果WDOGCFG寄存器的WDOGSCALE域的值为0,则意味着直接取出WDOGCOUNT寄存器的低16位作为WDOGS寄存器的值;如果WDOGCFG寄存器的WDOGSCALE域的值为最大值15,则意味着将WDOGCOUNT寄存器的值除以2的15次方的结果作为WDOGS寄存器的值,在这种情况下:
- 在蜂鸟E203MCU中,由于WDT处于常开域的时钟域,而常开域的低速时钟频率为32. 768kHz,因此WDOGS寄存器的值每秒自加1。
- 计算过程: (1/32768)x2^15= 1。
##比较寄存器WDOGCMP
WDOGCMP是一个16位的寄存器,该寄存器的值将作为比较阈值与WDT的计数器的比较值( WDOGS寄存器的值)进行比较。一旦WDOGS寄存器的值大于或等于WDOGCMP寄存器中的值,便会产生全局复位或者中断。
WDT产生全局复位
如果WDOGCFG寄存器的WDOGRSTEN域的值被配置为1,且WDT被使能之后在相当长的时间内没有被“喂狗”,使得其计数器的比较值(WDOGS寄存器的值)大于或等于WDOGCMP寄存器设定的比较阈值,则会产生复位信号,从而造成整个MCU的复位。
WDT产生中断
如果WDOGCFG寄存器的WDOGRSTEN域的值没有被配置为1,一旦WDT的计数器的比较值(WDOGS寄存器的值)大于或等于WDOGCMP寄存器设定的比较阈值,则会产生中断。中断会被反映在WDOGCFG寄存器的WDOGCMPIP域中。
中断产生后,WDOGCMPIP域值一直保持。
- 软件需要通过改写WDOGCMP寄存器或者WDOGCOUNT寄存器的值,使得WDOGS寄存器的值小于WDOGCMP寄存器的值,从而实现清除中断的效果。
- 除此之外,软件还需要通过写WDOGCMPIP域将其清除(或者被系统复位清零)。
如果WDOGCFG寄存器的WDOGRSTEN 域的值被配置为0,且WDOGZEROCMP域的值被配置为1,则WDT模块可以用于产生周期性的中断。
本文链接:https://my.lmcjl.com/post/8809.html
4 评论