手机网站开发前台架构,专业群建设网站,合肥营销网站建设设计,网络推广渠道有哪些STM32 HAL库 STM32CubeMX -- IWDG 一、IWDG简介二、独立看门狗的工作原理三、驱动函数初始化函数HAL IWDG Init()初始化函数HAL IWDG Init()其他宏函数 四、超时时间计算第一种办法第二种办法#xff08;推荐#xff09; 一、IWDG简介
看门狗(Watchdog)就是MCU上的一种特殊的… STM32 HAL库 STM32CubeMX -- IWDG 一、IWDG简介二、独立看门狗的工作原理三、驱动函数初始化函数HAL IWDG Init()初始化函数HAL IWDG Init()其他宏函数 四、超时时间计算第一种办法第二种办法推荐 一、IWDG简介
看门狗(Watchdog)就是MCU上的一种特殊的定时器用于监视系统的运行在发生错误(例如程序出现死循环)时能触发一个中断或产生系统复位防止程序跑飞。STM32 有两个看门狗一个是独立看门狗另外一个是窗口看门狗独立看门狗号称宠物狗窗口看门狗号称警犬。
二、独立看门狗的工作原理
独立看门狗(Independent WatchdogIWDG)是由内部 32kHz 低速时钟 LSI 驱动的自由运行的 12 位递减计数器。LSI在时钟树上的位置如下图所示。 独立看门狗的内部功能框图如下图所示。
本节先分析独立看门狗的功能框图和它的应用
独立看门狗用通俗一点的话来解释就是一个12 位的递减计数器当计数器的值从某个值一直减到0 的时候系统就会产生一个复位信号即IWDG_RESET。如果在计数没减到0 之前刷新了计数器的值的话那么就不会产生复位信号这个动作就是喂狗 。
独立看门狗一般用来检测和解决由程序引起的故障比如一个程序正常运行的时间是50ms在运行完这个段程序之后紧接着进行喂狗我们设置独立看门狗的定时溢出时间为60ms比我们需要监控的程序50ms 多一点如果超过60ms 还没有喂狗那就说明我们监控的程序出故障了跑飞了那么就会产生系统复位让程序重新运行。
看门狗功能由VDD 电压域供电在停止模式和待机模式下仍能工作。
1、独立看门狗时钟 独立看门狗的时钟由独立的RC 振荡器LSI 提供即使主时钟发生故障它仍然有效非常独立。LSI 的频率一般在30~60KHZ 之间根据温度和工作场合会有一定的漂移所以独立看门狗的定时时间并不一定非常精确只适用于对时间精度要求比较低的场合。
2、计数器时钟 递减计数器的时钟由LSI 经过一个8 位的预分频器得到在预分频器寄存器 IWDG_PR 里有 PR[2:0]用于设置分频系数分频系数从 4、8、16 到 256。
3、计数器 独立看门狗的计数器是一个12 位的递减计数器最大值为0XFFF当计数器减到0 时会产生一个复位信号:IWDG_RESET让程序重新启动运行如果在计数器减到0 之前刷新了计数器的值的话就不会产生复位信号重新刷新计数器值的这个动作我们俗称喂狗。
4、重装载寄存器 重独立看门狗有一个重载寄存器IWDG RLR可以设置一个 12位的重载值例如 4000。在看门狗的递减计数器的值变为0之前将IWDG_RLR 里的值重新载入看门狗计数器就可以避免产生复位。超时时间Tout 预分频因子*(重装载值1)/LSI。关于计算超时时间在下面会详细介绍。
5、键寄存器 独立看门狗还有一个关键字寄存器 IWDG KR其 KEY[15:0]是一个只可以写的关键字写入不同的关键字有不同的作用。 ●写入 0xAAAA 时重载寄存器 IWDG RLR 中的 12 位值就会被写入计数器从而使计数器从头开始递减计数避免系统复位。此操作称为刷新看门狗。 ●写入 0x5555 后才可以修改预分频器寄存器IWDG PR 和重载寄存器 IWDG_RLR 的内容。 ●写入 0xCCCC 时启动独立看门狗。 LSI时钟频率是 32kHz看门狗最大重载值是4095(对应0xFFF)根据预分频系数可以计算出IWDG 的最长超时(timeout)如下表所示。
6、状态寄存器 状态寄存器SR 只有位0PVU 和位1RVU 有效这两位只能由硬件操作软件操作不了。RVU看门狗计数器重装载值更新硬件置1 表示重装载值的更新正在进行中更新完毕之后由硬件清0。PVU: 看门狗预分频值更新硬件置’1’指示预分频值的更新正在进行中当更新完成后由硬件清0。所以只有当RVU/PVU 等于0 的时候才可以更新重装载寄存器/预分频寄存器。
三、驱动函数
独立看门狗的驱动函数比较只有2个常规函数和几个宏函数。独立看门狗没有中断。
初始化函数HAL IWDG Init()
结构体 IWDG HandleTypeDef的定义如下各成员变量的意义见注释
typedef struct
{IWDG_TypeDef *Instance; /*! IWDG寄存器基地 */IWDG_InitTypeDef Init; /*! IWDG 的参数 */
} IWDG_HandleTypeDef;其中的成员变量 Init 是结构体类型 IWDG_ImitTypeDef,它定义了IWDG的参数,这个结构体定义如下各成员变量的意义见注释
typedef struct
{uint32_t Prescaler; /*! IWDG 预分频系数也就是预分频寄存器IWDG_PR里的 PR[2:0] */uint32_t Reload; /*! IWDG计数器重载值也就是重载寄存器IWDG_RLR 的值 */} IWDG_InitTypeDef;初始化函数HAL IWDG Init()
HAL IWDG Refresh()用于刷新看门狗就是将重载寄存器IWDG_RLR 的值重新载入看门狗计数器避免产生系统复位。函数HAL_IWDG _Refresh()的原型定义如下,只需使用IWDC对象指针作为函数参数 HAL_StatusTypeDef HAL IWDG Refresh(IWDG HandleTypeDef *hiwdg);
其他宏函数
文件 stm32f4xx hal iwdg.h 还有几个主要的宏函数这些函数的输入参数__HANDLE__是独立看门狗对象指针。 ●HAL_IWDGSTART(HANDLE)启动独立看门狗就是向关键字寄存器IWDG_KR写入 0x0000CCCc。 ●HAL_IWDG_RELOADCOUNTER(HANDLE)重置看门狗计数器的值就是向关键字寄存器 IWDG_KR 写入 0x0000AAAA这会导致重载寄存器IWDG_RLR中的值载入看门狗计数器。这个宏函数与函数HAL_IWDG_RefreshO的功能相同。 ●IWDG_ENABLE_WRITE ACCESS(HANDLE)使预分频寄存器IWDG_PR 和重载存器 IWDG_RLR 变为可写的其代码就是向关键字寄存器 IWDG_KR 写入 0x00005555。 ●IWDG_DISABLE_WRITEACCESS(HANDLE)使预分频寄存器IWDG_PR 和重载寄存器 IWDG_RLR 变为不可写的其代码就是向关键字寄存器 IWDG KR 写入0x00000000。
四、超时时间计算 通过查阅多个文档和网上各种资料有两种计算办法 两种办法大家酌情选择
第一种办法
Tout (4*2^PR) * (RLV1) / LSI其中PR为上图中预分频系数对应的PR[2:0]位、RLV为重装载值0 ~ 4095、LSI为内部低速时钟也就是驱动IWDG的时钟F1一般LSI为40kHz ;
示例
以F1为例LSI为40kHz、预分频系数为8PR为1、RLV为0和4095
最短时间RLV为0Tout ((4*2^PR)*(RLV1)) / LSI ((4*2)*(01)) / 40000 0.0002s 0.2ms
最长时间RLV为4095Tout ((4*2^PR)*(RLV1)) / LSI ((4*2)*(40951)) / 40000 0.8192s 8192ms第二种办法推荐
Tout (预分频系数 * (重装载值1)) / LSI其中预分频系数和重装载值为直接设置的后面结合配置STM32Cube MX会很方便LSI为内部低速时钟F1一般为40kHz;
示例
以F1为例LSI为40kHz、预分频系数为8重装载值为0和4095
最短时间重装载值为0Tout (预分频系数*重装载值) / LSI (8*1) / 40000 0.0002s 0.2ms
最长时间重装载值为4095Tout (预分频系数*重装载值) / LSI (8*4096) / 40000 0.8192s 8192ms这两种办法都可以算出上表中的数值其实仔细分析这两种办法原理其实都一样为例方便算一点推荐使用第二种办法。
四、STM32Cube MX 配置 基础STM32Cube MX的配置参考这篇博客STM32 CubeMx教程 – 基础知识及配置使用教程
配置RCC使用外部晶振模式
配置SYSdebug模式选择Serial Wire
参数设置部分只有两个参数 配置IWDG先启用独立看门狗配置预分频系数为32重装载值为124 Tout 32*1241/ 40000 100ms
使用一个串口用来打印调试信息设置为异步通信模式
配置时钟树从图上可以看到里面默认的LSI RC振荡时钟 40kHz ,LSI时钟配置到了IWDG
涉及到IWDG独立看门狗的函数有两个
MX_IWDG_Init(); //独立看门狗初始化
HAL_IWDG_Refresh(hiwdg); //喂狗