秉火429笔记之十二 看门狗
目录
1. 概述
2. 独立看门狗(IWDG)
3. 窗口看门狗(WWDG)
1. 概述
STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。
一般情况下,使用频次较高是独立看门狗,也即是通常意义的看门狗。
2. 独立看门狗(IWDG)
一个12位的递减计数器,最大值为0XFFF,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作.
- 看门狗时钟
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度 要求比较低的场合。
- 计数器时钟
递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256,256],计数器时钟CK_CNT= 40/ 4*2^PRV,一个计数器时钟计数器就减一。
- 键寄存器
键值 | 键值作用 |
---|---|
0XAAAA | 把RLR的值重装载到CNT |
0X5555 | PR和RLR这两个寄存器可写 |
0XCCCC | 启动IWDG,软件启动 |
一旦独立看门狗启动,它就关不掉,只有复位才能关掉
- 应用场景
独立看门狗一般用来检测和解决由程序引起的故障。
PS: 可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_IWDGRST)】
- 代码实例
/** 设置 IWDG 的超时时间* Tout = prv/40 * rlv (s)* prv可以是[4,8,16,32,64,128,256]* prv:预分频器值,取值如下:* @arg IWDG_Prescaler_4: IWDG prescaler set to 4* @arg IWDG_Prescaler_8: IWDG prescaler set to 8* @arg IWDG_Prescaler_16: IWDG prescaler set to 16* @arg IWDG_Prescaler_32: IWDG prescaler set to 32* @arg IWDG_Prescaler_64: IWDG prescaler set to 64* @arg IWDG_Prescaler_128: IWDG prescaler set to 128* @arg IWDG_Prescaler_256: IWDG prescaler set to 256** 独立看门狗使用LSI作为时钟。* LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我* 们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度* 要求比较低的场合。** rlv:预分频器值,取值范围为:0-0XFFF* 函数调用举例:* IWDG_Config(IWDG_Prescaler_64 ,625); // IWDG 1s 超时溢出 * (64/40)*625 = 1s*/void bsp_IWDG_Config(uint8_t prv ,uint16_t rlv)
{ // 使能 预分频寄存器PR和重装载寄存器RLR可写IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );// 设置预分频器值IWDG_SetPrescaler( prv );// 设置重装载寄存器值IWDG_SetReload( rlv );// 把重装载寄存器的值放到计数器中IWDG_ReloadCounter();// 使能 IWDGIWDG_Enable();
}// 喂狗
void bsp_IWDG_Feed(void)
{// 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位// 当计数器的值减到0的时候会产生系统复位IWDG_ReloadCounter();
}
3. 窗口看门狗(WWDG)
窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值0X40时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义.
- 窗口看门狗时钟
窗口看门狗时钟来自PCLK1,PCLK1最大是45M,由RCC时钟控制器开启。
- 计数器时钟和计数器
计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中CK计时器时钟=PCLK1/4096,计数器的时钟CNT_CK=PCLK1/4096/(2^WDGTB)。
计数器是一个递减计数器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],当7个位全部为1时是0X7F,这个是最大值,当递减到T6位变成0时,即从0X40变为0X3F时候,会产生看门狗复位。计数器的值只能是:0X40~0X7F之间,实际上用来计数的是T[5:0]。当递减计数器递减到0X40的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR位9 EWI 置1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了, 那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
- 应用场景
WWDG一般被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
PS: 可以在系统上电开始的时候检查是否因看门狗引起的复位【RCC_GetFlagStatus(RCC_FLAG_WWDGRST)】
- 代码实例
//用于记录看门狗 递减计数器的值,方便喂狗函数直接使用
static uint8_t m_bsp_wwdg_cnt ;// WWDG 中断优先级初始化
static void bsp_WWDG_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/* WWDG 配置函数* tr :递减计时器的值, 取值范围为:0x7f~0x40,超出范围会直接复位* wr :窗口值,取值范围为:0x7f~0x40* prv:预分频器值,取值可以是* @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1(45MHz)/4096)/1 约10968Hz 91us* @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1(45MHz)/4096)/2 约5484Hz 182us* @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1(45MHz)/4096)/4 约2742Hz 364us* @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1(45MHz)/4096)/8 约1371Hz 728us* * 例:tr = 127(0x7f,tr的最大值) wr = 80(0x50, 0x40为最小wr最小值) prv = WWDG_Prescaler_8* ~728 * (127-80) = 34.2ms < 刷新窗口 < ~728 * 64 = 46.6ms* 也就是说调用WWDG_Config进行这样的配置,若在之后的34.2ms前喂狗,系统会复位,在46.6ms后没有喂狗,系统也会复位。* 需要在刷新窗口的时间内喂狗,系统才不会复位。
*/
void bsp_WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{ m_bsp_wwdg_cnt = tr;//保存CNT配置,用在喂狗函数// 开启 WWDG 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);// 设置预分频器的值WWDG_SetPrescaler( prv );// 设置上窗口值WWDG_SetWindowValue( wr );// 设置计数器的值,使能WWDGWWDG_Enable(tr); // 清除提前唤醒中断标志位WWDG_ClearFlag(); // 配置WWDG中断优先级bsp_WWDG_NVIC_Config(); // 开WWDG 中断WWDG_EnableIT();
}// 喂狗
void bsp_WWDG_Feed(void)
{// 喂狗,刷新递减计数器的值,设置成最大WDG_CNT=0X7FWWDG_SetCounter( m_bsp_wwdg_cnt );
}
秉火429笔记之十二 看门狗相关推荐
- 秉火429笔记之十八 ETH--以太网
目录 1. 以太网简介 2. SMI 接口 (站管理接口) 2.1 SMI帧格式 2.2 SMI 读写操作 3. MII 和 RMII接口 4. MAC 802.3 4.1 MAC 802.3 帧格 ...
- 秉火429笔记之十四 USART--串口通信
目录 1. 串口通讯协议简介 1.1 物理层 1.2 协议层 2 ST USART 2.1 功能引脚 2.2 重要状态 2.3 编程要点 2.4 代码实例 1. 串口通讯协议简介 串口通讯(Seri ...
- 秉火429笔记之十 EXTI-外部中断/事件
目录 1. EXTI 简介 2. EXTI 功能框图 3. 功能点 4. 编码要点 1. EXTI 简介 外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线.每个中断/事件线都对应有一个 ...
- 秉火429笔记之十六 I2C--操作EEPROM
目录 1. I2C 概述 2. 硬件设计 3. 代码实现 1. I2C 概述 参考该链接,不在赘述:https://blog.csdn.net/XieWinter/article/details/91 ...
- 秉火429笔记之十五 DMA--直接存储区访问
目录 1. 简介 2. 功能 2.1 外设通道 2.2 仲裁器 2.3 FIFO 2.4 存储器端口和外设端口 2.5 编程接口 3. DMA数据配置 1. 简介 直接存储器访问 (DMA) 用于在外 ...
- 秉火429笔记之八 RCC时钟
目录 1. RCC 作用概述 2. RCC框图剖析-时钟树 3. 编程要点 4. 源码实例 1. RCC 作用概述 RCC :reset clock control 复位和时钟控制器. 设置系统时钟S ...
- 秉火429笔记之二寄存器
目录 1. 寄存器概述 2. STM32芯片架构 3. STM32 存储器映射 1. 寄存器概述 寄存器是中央处理器内的组成部分.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和地址.在 ...
- 秉火429笔记之十七 SPI--操作FLASH
目录 1. SPI协议概述 2. STM32 SPI特性及架构 2.1 SPI外设简介 2.2 STM32的SPI架构剖析 2.2.1 通讯引脚 2.2.2 时钟控制逻辑 2.2.3 数据控制逻辑 3 ...
- 秉火429笔记之九 中断应用概述
目录 1. 中断类型 2. NVIC 概述 3. 中断优先级 4. 优先级分组 5. 编程要点 1. 中断类型 在此不严格区分中断和异常,即简单的认为中断与异常一个概念. M4 内核搭载了异常响应系 ...
最新文章
- android 4.0.3固件,Vi30豪华版_Android4.0.3-1.0测试版固件刷机教程【MM刷机】
- Java微信订单查询
- Unix操作系统目录存放内容
- linux 查看共享磁盘_如何可视化地查看 Linux 系统磁盘使用情况?
- 无向图的邻接表表示法 及 深搜遍历DFS
- mysql数据表的字段操作
- MATLAB的算术运算和点运算
- UVA10608 Friends【并查集】
- OpenCV基础篇之Mat数据结构
- 老男孩五篇重要文章:http://oldboy.blog.51cto.com/2561410/1184139
- CHECK约束在表继承中的使用
- RUN 文件安装 postgresql8.4.12
- sip 时序图_教你如何看懂时序图(小白如何快速轻松的看懂时序图)
- 云服务厂商人才空心化隐忧
- 音视频基础知识---音频编码格式
- python之网络部分
- 使用素描图像识别人脸
- Java——静态方法
- Spring的xml配置文件中tx命名空间
- 把大象装冰箱,需要分几步?- - -迅雷产品经理笔试、面试回顾
热门文章
- c语言blackjack设计思路,Veriog——简易的BlackJack(21点)程序
- pythonifelse简化_简化“if…elif..else”条件
- GTX960M安装Anaconda+cuda9.0+cudnn v7.6.5+tensorflow-gpu1.8.0
- 微信小程序毕业设计 基于微信校园跑腿小程序系统开题报告
- bucket list java,Java AmazonS3.deleteBucket方法代码示例
- 算法图解第一章算法简介之二分查找C++代码实现
- ASP.NET中的KRE是什么?
- [转载]摩托车 各车型 坐姿 疲劳逻辑详解
- 前端工具-Yeoman模板 + 接收用户输入
- 企业微信+python实现监控服务器状态和实时查询数据