MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项

您所在的位置:网站首页 看门狗恐怖吗 MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项

MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项

2024-07-13 12:53| 来源: 网络整理| 查看: 265

MCU/CPU/*PU的 WatchDog/看门狗 使用注意事项

类比于 Heartbeat/心跳 检测多用在软件及服务领域, WatchDog/看门狗 多用在硬件与系统领域(硬件看门狗), 也有用在软件与应用及服务领域的(软件看门狗)。

“喂狗”即“心跳探活”, 系统分三部分:

监控部分: 有规律性的心跳检测, 响应部分: 硬件/系统或进程/服务/应用/任务 的心跳响应, 异常处理部分: 看门狗/心跳 检测异常时触发的机制与行为, 例如触发硬件中断或系统软件中断,硬重启(冷启动)与软重启(热启动)。

回到顶部 前言 最近因为项目产品硬件设计有问题,导致设计的一款产品把硬件电源开关以及硬件系统复位功能去掉了。 更严重的是,这产品已经开始生产了,硬件已经无法修改, 所以软件必须上看门狗,否则设备死机或是异常后就只能拆设备拔电池复位了。

关于看门狗在低功耗场景的应用,几个问题点可以提前思考:

在看门狗初始化之前系统异常了会怎样?软件独立看门狗与硬件独立看门狗它们有什么区别? 如果异常不可避免,有没一个地方可以缓存设备状态,系统异常复位后状态不被清除。

选项字节里开启硬件看门狗与软件代码开启有什么区别? 看门狗是在中断过程喂狗还是在主程序中喂狗比较好? ​看门狗初始化可以放到时钟初始化之前么?如果时钟死掉了,看门狗还能正常工作么? 低功耗深度休眠后还需要喂狗么?如果需要,要怎么设计?使用什么唤醒设备喂狗?

回到顶部 (一)看门狗分类 看门狗的分类,根据实现方式的不同,可以分为软件看门狗和硬件看门狗:

软件看门狗:通过软件实现的一种机制,通常由系统中的软件来设置和管理 硬件看门狗: 嵌入在处理器或芯片中的专用硬件模块

根据使用方式的不同,又可以区分为独立看门狗和窗口看门狗

独立看门狗: 独立看门狗通常用于监控整个系统的运行状态,而不特定于某个任务或进程; 当系统故障,死锁,无响应时,应用程序无法正常喂狗,看门狗超时从而产生复位。 窗口看门狗: 窗口看门狗更专注于监控特定任务或进程的运行状态,并在特定的时间窗口内完成。 比如在某个任务执行时间要求非常高,可以使用窗口看门狗, 它有一个时间窗口,如果太早喂狗和太晚喂狗,都会产生异常, 正因为它喂狗时间有个时间窗口,所以才叫窗口看门狗。

软件独立看门狗与硬件独立看门狗的区别: 软件独立看门狗通过软件初始化,可以通过关闭时钟以关闭。 如果在设备上电到初始化看门狗之前系统异常,看门狗是不生效的,这种情况多出现在软件初始化的时候异常。

硬件独立看门狗通过烧录器烧录的时候配置,或者是通过软件程序修改选项字节里面参数进行修改。 硬件独立看门狗一旦配置好,上电的时候开始生效并且无法关闭,除非重新修改配置项参数。 硬件独立看门狗开启之后,硬件时钟会自动开启并且无法关闭。

休眠唤醒喂狗 超低功耗设备的*PU处理器多是深度睡眠模式以达到省功耗的目的;此模式状态的看门狗还是在正常运行的。 即在深度休眠模式,还是需要有规律的唤醒设备进行喂狗。

我使用的硬件内核带有独立看门狗IWDG和窗口看门狗WDG。 其中,独立看门狗和窗口看门狗,还有软件和硬件的区别,主要差异是在看门狗的启动方式上不同。 下面我们的介绍,主要针对独立看门狗。

(二)启动看门狗 看门狗的启动有多种方式:

通过接口设置启动 直接设置寄存器启动 设置Setting/Config Bits的Flags(选项字节启动)

设置Setting/Config Bits的Flags(选项字节启动) MCU内部有一个小的flash,有个FLASH user option可以设置MCU的一些配置参数包括看门狗参数。 注意这些参数是可以通过烧录器在烧录的时候就把参数配置进去,即硬件级全局配置。 对于已经烧录的设备,可以通过写选项字节的方式把IWDG_SW置位或是重置。

直接设置寄存器启动 直接往Datasheet上公开的*WDG寄存器地址写入对应参数使能IWDG, 例: void init_wtd(void) { volatileu int32_t *IWDG_KR_ADDR = (volatileuint32_t *)0x40003000UL; volatileu int32_t *IWDG_PR_ADDR = (volatileuint32_t *)0x40003004UL; volatileu int32_t *IWDG_RLR_ADDR = (volatileuint32_t *)0x40003008UL; *IWDG_KR_ADDR = 0x5555; *IWDG_PR_ADDR = 0x03; *IWDG_RLR_ADDR = 0xF40; } 实际IWDG是有四个寄存器,还有一个IWDG_PR, 如果不初始化时钟,看门狗不会启动的,即使设置完看门狗也是不会启动。 如果要使能时钟,可以添加时钟设置语句:SET_BIT(RCC->CSR, RCC_CSR_LSION); 直接设置寄存器有一个好处,就是在boot中, 因为对代码量要求比较高,可以比较精简的实现功能。

通过接口设置 可以直接参考官方sample进行初始化: IWDG_HandleTypeDef IwdgHandle; HAL_Init(); /##-3- Configure & Start the IWDG peripheral ########/ IwdgHandle.Instance = IWDG; IwdgHandle.Init.Prescaler = IWDG_PRESCALER_32;//T=1MS IwdgHandle.Init.Reload = (1000); //1ms1000=1s IwdgHandle.Init.Window = IWDG_WINDOW_DISABLE; if(HAL_IWDG_Init(&IwdgHandle) != HAL_OK) { / Initialization Error */ Error_Handler(); }

需要特别注意,因为IWDG是依赖于LSI时钟的,在HAL_IWDG_Init 函数调用之前必须先打开LSI时钟。 以上官方给的sample,是在HAL_Init()中把LSI时钟打开的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3