文章目录
- 一、基础知识点
- 二、开发环境
- 三、STM32CubeMX相关配置
- 四、Vscode代码讲解
- 五、结果演示
 
一、基础知识点
STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;
 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
主要性能:
- 自由运行的递减计数器
- 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
- 看门狗被激活后,则在计数器计数至0x000时产生复位
内部框图
 
看门狗功能处于VDD供电区,即在停机和待机模式时仍能正常工作。
 喂狗过程就是将12位 重装载数值刷新12位递减计数器。
 当计数器计数至0x000时产生复位
看门狗设定时间(40kHz的输入时钟(LSI))
 
二、开发环境
1、硬件开发准备
 主控:STM32F103ZET6
 芯片内部独立看门狗模块IWDG
2、软件开发准备
 软件开发使用虚拟机 + VScode + STM32Cube 开发STM32,在虚拟机中直接完成编译下载。
 该部分可参考:软件开发环境构建
三、STM32CubeMX相关配置
1、STM32CubeMX基本配置
 本实验基于CubeMX详解构建基本框架 进行开发。
2、STM32CubeMX RTC相关配置
 (1)时钟配置
 
 使能独立看门狗,40kHz的输入时钟(LSI)将会开启
(2)看门狗设置
 
 看门狗时间:1/(40KHz/32) * 2500 = 2s
四、Vscode代码讲解
1、定义看门狗相关结构体并初始化
typedef struct MyIWDG_s
{
  uint32_t IWDG_flag;            // 看门狗标志位,用于看门狗测试
  void (*Feed_WDG)(void);        // 喂狗函数
} MyIWDG_t;
extern MyIWDG_t MyIWDG;
 MyIWDG_t MyIWDG = 
{
  TRUE,
  Feed_WDG                        
};
2、具体喂狗函数实现
static void Feed_WDG(void)
{
  HAL_IWDG_Refresh(&hiwdg);
}
3、系统初始化时添加打印(只要看门狗复位系统就会打印)
    printf(" =============== WDG test =============== \n");
4、主循环添加喂狗机制
if( MyIWDG.IWDG_flag == TRUE )
{
    MyIWDG.Feed_WDG();
}
5、测试看门狗部分,通过之前触摸按键控制喂狗动作(改变看门狗标志位IWDG_flag) 触摸按键相关代码可参考外部中断 按键 详解
static void Key3_Monitoring_Function(void)
{
  if(Key3.key_flag == TRUE)
  {
    Key3.key_press = FALSE;
    Key3.key_hold = TRUE;
    for(int i=0; i<200; i++)
    {
      HAL_Delay(10);
      if(GPIO_PIN_SET == HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin))
      {
        Key3.key_press = TRUE;
        Key3.key_hold = FALSE;
        break;
      }
    }
  }
  if( Key3.key_press == TRUE )
  {
    MyIWDG.IWDG_flag = FALSE;
    printf(" System restart \n\r ");
    LED3_Toggle;
  }
  if( Key3.key_hold == TRUE )
  {
    LED3_ON;
    HAL_Delay(500);
    LED3_OFF;
  }
  Key3.key_flag = FALSE;
  Key3.key_press = FALSE;
  Key3.key_hold = FALSE;
}
五、结果演示




















