文章目录
- 一、基础知识点
- 二、开发环境
- 三、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;
}