你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 独立看门狗程序

[复制链接]
STMCU小助手 发布时间:2022-6-13 17:17
01. 独立看门狗简介
STM32F4 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在 15~47Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

02. 程序功能示例
在配置看门狗后,DS0 将常亮,如果 KEY_UP 按键按下,就喂狗,只要 KEY_UP 不停的按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。

03. 硬件设计
用到的硬件资源有:
1) 指示灯 DS0
2) KEY_UP 按键
3) 独立看门狗
前面两个在之前都有介绍,而独立看门狗实验的核心是在 STM32F4 内部进行,并不需要外部电路。但是考虑到指示当前状态和喂狗等操作,我们需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。喂狗我们采用板上的 KEY_UP 键来操作,而程序重启,则是通过 DS0 来指示的。

04. 编程步骤
4.1 取消寄存器写保护(向 IWDG_KR 写入 0X5555 )
  1. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
复制代码

4.2 设置独立看门狗的预分频系数和重装载值
  1. void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值
  2. void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
复制代码

设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为:

  1. Tout=((4×2^prer) ×rlr) /40
复制代码

其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值);

比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

4.3 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA )

WDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

4.4 启动看门狗(向 向 IWDG_KR 写入 0XCCCC)

  1. IWDG_Enable(); //使能 IWDG
复制代码

05. 程序示例
iwdg.h文件
  1. #ifndef __IWDG_H__
  2. #define __IWDG_H__

  3. #include "sys.h"

  4. //看门狗初始化
  5. void IWDG_Init(u8 prer, u16 value);

  6. //喂狗
  7. void IWDG_Feed(void);

  8. #endif/*__IWDG_H__*/
复制代码

iwdg.c文件

  1. #include "iwdg.h"


  2. //看门狗初始化
  3. void IWDG_Init(u8 prer, u16 value)
  4. {
  5.         //取消写访问保护
  6.         IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  7.         
  8.         //设置预分频
  9.         IWDG_SetPrescaler(prer);
  10.         
  11.         //设置IWDG装载值
  12.         IWDG_SetReload(value);
  13.         
  14.         //重新装载
  15.         IWDG_ReloadCounter();
  16.         
  17.         //使能看门狗
  18.         IWDG_Enable();
  19.         
  20. }

  21. //喂狗
  22. void IWDG_Feed(void)
  23. {        
  24.         //重新装载
  25.         IWDG_ReloadCounter();
  26. }
复制代码

main.c文件

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "beep.h"
  6. #include "key.h"
  7. #include "exti.h"
  8. #include "iwdg.h"

  9. int main(void)
  10. {
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  12.         
  13.         delay_init(168);
  14.         LED_Init();
  15.         KEY_Init();
  16.         uart_init(115200);
  17.         
  18.         LED2 = 0;
  19.         
  20.         delay_ms(100);
  21.         
  22.         //大约6秒
  23.         IWDG_Init(6, 500);
  24.         
  25.         printf("程序初始化OK\r\n");
  26.         
  27.         while(1)
  28.         {
  29.                 if (Key_Scan() == WK_UP_PRESS)
  30.                 {
  31.                         //喂狗
  32.                         IWDG_Feed();
  33.                         printf("喂狗\r\n");
  34.                 }
  35.                
  36.                 printf("while do work \r\n");        
  37.                 delay_ms(1000);
  38.         }        
  39. }
复制代码



收藏 评论0 发布时间:2022-6-13 17:17

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版