STM32之IWDG-独立看门狗
一、看门狗原理
计数值减少,当减为0的时候说明没有喂狗,就会重启
二、STM32配置看门狗
时钟由独立 RC 振荡器提供(30k~60k),不精确
12位计数器,最大值就是4096
分频系数设置为8,定时器重载值设置为4095,RC振荡器的频率设置为32KHz
32k/8 = 4kHZ
1/4K = 0.25ms
0.25*(4095+1) = 1024ms
这就是看门狗的周期时间1024ms
看门狗分为软件启动和硬件启动
三、FREERTOS下独立看门狗
看门狗检测多任务思路
这里使用事件进行通知监测任务喂狗,事件是可以多对一的
监测任务就是监测所有的任务有没有发出事件,如果监测到所有事件,就可以喂狗了,如果没检测到事件,说明有任务掉线了
说明:
- 监测任务通过独立看门狗监测自身,如果长时间得不到执行,看门狗将复位系统;
- 监测任务通过事件监控其它任务,如果任一任务得不到执行,看门狗将复位系统;
- 监测任务收到全部被监测任务发来的事件标志后,才进行喂狗。
应用注意事项
- 监测任务优先级设置最高,以便及时喂狗
- 监测任务与被监测任务均不可以挂起或删除,否则,无法及时喂狗导致系统复位
- 喂狗时间由被监测任务的最大发送事件标志间隔时间确定,并且留有足够裕量
- 考虑事件标志只有低24位可用,被监测任务最多24个,足够使用
配置看门狗
1、先配置RCC
设置RCC
- 设置高速外部时钟HSE 选择外部时钟源
时钟源设置
- 1选择外部时钟HSE 8MHz
- 2PLL锁相环倍频72倍
- 3系统时钟来源选择为PLL
- 4设置APB1分频器为 /2
HAL库独立看门狗函数库讲解:
看门狗初始化函数
HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
喂狗函数:
HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
举例: HAL_IWDG_Refresh(&hiwdg); //看门狗喂狗
使用该函数定时喂狗即可
2、配置IWDG
超出(溢出)时间计算:
Tout=((4×2^PRER) ×RLR)/LSI时钟频率
对应不同预分频系数的PRER值:
这里的RC时钟频率为40K,64分频,计数值3750,刚好6秒
3、创建几个任务以及监测任务
将监测任务的优先级设置为最高
4、在初始化中创建事件组
5、在freertos.c中定义事件
6、编写监测任务程序
解析:
EventBits t xEvent; 这个就是事件标志位,用于监测哪些事件
portTICK_PERIOD_MS 这个就是Freertos的周期是多少ms
这里就是设置等待时间最大为6秒钟
喂狗的程序其实就是下面这句
HAL_IWDG_Refresh(&hiwdg); //看门狗喂狗
7、任务中设置事件
在任务中设置事件标志,这样就可以传递到监测任务中
8、挂起任务导致无法喂狗,看门狗重启系统
如果我在按键任务里面挂起任务1的话,就会出现无法喂狗,导致系统重启的问题