[CortexM3--CC26XX]Watchdog Timer(exp)

简述

Watchdog即看门狗,在发生SW Error或外部设备没有正确respond时,可以产生一个nonmaskable中断–NMI,或一般的中断,或在设定的超时时间到达时进行reset。
另外,Watchdog也可以被配置成,第一次超时到达时向MCU报告一个中断,在第二次超时到达时产生一个reset信号。

WDT特性

  • 32bit可编程递减计数器
  • 可编程控制的NMI或一般中断逻辑
  • Lock寄存器防止SW无意改动WDT的内容(如超时时间被意外改变)
  • reset产生使能/禁止
  • debug中在asserts CPU Halt标志时,使能挂起

WDT功能

[CortexM3--CC26XX]Watchdog Timer(exp)_第1张图片

WDT初始化

  • 首先其外设时钟要使能
  • 从WDT:LOAD寄存器加载计数值
  • 如果要使用其reset信号产生功能(第二次超时中断时产生的),需要使能WDT:CTL.RESEN 寄存器bit
  • 设置WDT:CTL.INTEN寄存器bit使能Watchdog
  • 使用WDT:LOCK寄存器锁住Watchdog模块

WDT相关寄存器

[CortexM3--CC26XX]Watchdog Timer(exp)_第2张图片

WDT的具体使用(结合driver)

void wdtCallback(UArg handle) {
  Watchdog_clear((Watchdog_Handle)handle);
}

void wdtInitFxn() {
  Watchdog_Params wp;
  Watchdog_Handle watchdog;
  Watchdog_Params_init(&wp);
  wp.callbackFxn    = wdtCallback;
  wp.debugStallMode = Watchdog_DEBUG_STALL_ON;
  wp.resetMode      = Watchdog_RESET_ON;

  watchDog = Watchdog_open(CC2650_WATCHDOG0, &wp);
  Watchdog_setReload(watchDog, 1500000); // 1sec (WDT runs always at 48MHz/32)
}

上面的例程,wdtInitFxn是在系统初始化阶段要调用的Watchdog初始化函数,其功能就是配置好Watchdog。每过1s钟,WDT Timer会产生一个中断,此时若CPU正常运行没有被挂起,那么wdtCallback会被执行,将WDT Timer清除掉,以免下一次超时发生导致reset信号产生。假设在WDT Timer中断到来时,CPU被挂起(比如系统发生hardfault异常导致),那么WDT的callback得不到执行的(因为进入了更高优先级的中断中,一般hardfault handler是一个死循环,此时WDT这种优先级别更低的HWI应该是得不到运行的),那么第二次WDT中断就会发生了,此时应该就不管是否有更高优先级了,reset信号被产生,系统强制复位。
因此WDT的作用,就是在系统发生严重错误时,reset系统进行恢复。不过有个疑问,如果是挂起在比WDT HWI优先级更低的异常里,是否也是不能reset系统,而一直处于“卡死”状态呢?是不是正因为这样,所有ISR都不是while(1)的,而hardfault这一类的就是进入一个while(1)了。有待实验求证。

你可能感兴趣的:(watchdog,CC26xx)