【WCH蓝牙系列芯片】-基于CH32V208开发板—独立看门狗
-------------------------------------------------------------------------------------------------------------------------------------
在芯片中,看门狗主要是用来监测单片机运行状态和解决程序引起的故障的模块,包括独立看门狗和窗口看门狗。独立看门狗比较简单,当然它的安全性没有比窗口看门狗高。
独立看门狗:
因为当芯片工作时会受到外界的干扰,可能造成程序进入死循环或者程序跑飞,程序的正常运行被打断,使得整个系统进入死机状态。
因此“看门狗”这个东西,用来检测逻辑错误和外部环境干扰引起的软件故障,就可以让芯片在意外状况下(比如软件陷入死循环),重新恢复到系统上电状态,以保证系统出问题的时候重启一次。
窗口看门狗:
用于监测单片机程序运行时效是否精准,主要检测软件异常。
这里,我们主要依托CH32V208芯片针对独立看门狗进行一个简单测试说明。
1、看门狗就是一个12 位自减型计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,让程序重新启动运行。
2、在看门狗使用过程中,有“喂狗”的操作——就是如果当计数没有到0之前,就重新设置计数器值,这样就不会产生复位信号。
看门狗的看门原理:
这样隔一段时间喂一次狗,只要程序正常运行,计数值就不能自减到0,一旦出现死循环之类的故障,没有及时重新设置计数器值,就会导致一直减到0的时候,系统就会产生一个复位信号,即 IWDG_RESET ,芯片收到复位信号,系统复位重新运行。
独立看门狗的时钟都是由32KHz LSI 时钟提供,当主时钟发生故障后,看门狗的时钟依然可以运行。
因此独立看门狗可独立于主程序之外运行,适用于对精度要求低的场合。
在EVT例程中,使用IWDG:独立看门狗例程,进行运行程序。
先对独立看门狗进行初始化配置,
//独立看门狗初始化函数 void IWDG_Feed_Init(u16 prer, u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //设置允许写入IWDG寄存器的访问(写入使能) IWDG_SetPrescaler(prer); //设置独立看门狗预分频器的值 ,预分频器决定了独立看门狗计数器的时钟频率 IWDG_SetReload(rlr); //设置独立看门狗的重装载值,设置独立看门狗计数器的初始值 IWDG_ReloadCounter(); //重新加载独立看门狗计数器,避免计数器超时。 IWDG_Enable(); //使能独立看门狗 }
#define IWDG_WriteAccess_Enable ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable ((uint16_t)0x0000)
1、先对IWDG_CTLR 寄存器写 0x5555,设置允许写入看门狗寄存器的访问;
2、IWDG_SetPrescaler(prer); //设置独立看门狗预分频器的值,预分频器决定了独立看门狗计数器的时钟频率
3、IWDG_SetReload(rlr); //设置独立看门狗的重装载值,设置独立看门狗计数器的初始值,用于更新独立看门狗中计数器当前值,并且计数器由重装载值进行递减。
4、IWDG_ReloadCounter(); //重新加载独立看门狗计数器,避免计数器超时。
5、IWDG_Enable(); //使能独立看门狗
int main(void) { USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); Delay_Init(); KEY_Init(); printf("IWDG test...\r\n"); Delay_Ms(1000); //函数初始化独立看门狗,设置预分频器为32,重装载值为4000,表示独立看门狗的超时时间为 4 秒。 IWDG_Feed_Init( IWDG_Prescaler_32, 4000 ); // 4s IWDG reset while(1) { if( KEY_PRESS() == 0 ) //PA0 //按键按下 { printf("Feed dog\r\n"); IWDG_ReloadCounter(); //Feed dog 喂狗,重新加载独立看门狗的计数器,防止独立看门狗超时导致系统复位。 Delay_Ms(10); } } }
在主函数中,初始化独立看门狗,设置其预分频器为IWDG_Prescaler_32和重装载值为4000。
这样独立看门狗的溢出时间为4S。
溢出时间计算:
这里T =(32/32K)*4000 = 4S
在while(1)循环中,利用按键判断,如果按键按下,就会喂狗,这样就不会防止看门狗超时溢出,并且打印Feed dog;
如果没有按下,就相当于进入while(1)死循环,通过串口打印可以看出,此时独立看门狗就每超过4秒后,自动重新复位整个系统。
注:
1、在使用独立看门狗时,是要将BOOT接地为低电平,如果BOOT不接低电平会导致在看门狗复位的时候进入下载模式,出现死机现象,只能重启解决这个问题。
2、因为看门狗初始化完需要等LSI ready才能运行 。