STM32开发,使用HAL库函数实现独立看门狗功能

Serepta ·
更新时间:2024-11-13
· 692 次阅读

STM32开发,使用HAL库函数实现独立看门狗功能1 概述1.1 资源概述1.2 引脚资源分配1.3 独立看门狗概述1.3 实现功能2 软件开发2.1 CUBEMX配置2.2 代码编写3 实验结果 1 概述 1.1 资源概述

开发板:ST官方NUCLEO-F103RB开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6
NUCLEO开发板

1.2 引脚资源分配
序号 引脚 资源 备注
1 PA13 SWDIO SWD输入输出信号
2 PA14 SWDCLK SWD时钟信号
3 PC13 BUTTON 用户按键
4 PA5 LED2 指示灯
1.3 独立看门狗概述

独立看门狗可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
IWDG的主要性能
● 自由运行的递减计数器 ;
● 时钟由独立的RC振荡器提供(可在停止和待机模式下工作);
● 看门狗被激活后,则在计数器计数至0x000时产生复位。

1.3 实现功能

1、上电初始化后,LED2灯亮;
2、在While(1)中进行按键检测,若检测到按键,喂狗,将灯熄灭;
3、若未检测到按键,系统自动复位;
4、采用内部LSI时钟,16分频,预装载值4096(0xFFF)。

2 软件开发 2.1 CUBEMX配置

激活IDWG,分频系数改为16,预装载值设为4096。
看门狗设置
独立看门狗由LSI提供时钟
独立看门狗时钟
这里可以计算得到看门狗复位时间如下,这个时间足够我们操作按键喂狗。
t=1/(400000Hz/16)×4096=1.638S

2.2 代码编写

1、使用CUBEMX生成代码后,会自动生成前面配置的独立看门狗的初始化函数(分频系数和预装载值)。

MX_IWDG_Init();//看门狗初始化程序

下面是这个函数的定义。

void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_16; hiwdg.Init.Reload = 4095; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } }

我们需要在main函数中初始化LED2灯,点亮。

HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);//初始化时将LED2灯点亮

2、在while(1)中增加按键检测和喂狗操作。当检测到按键时,执行喂狗以及将LED2灯熄灭。

while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假设检测到按键操作 { HAL_Delay(20);//按键抖动检测 if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假设检测到按键操作 { HAL_IWDG_Refresh(&hiwdg);//执行喂狗操作 HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);//LED熄灭 } } }

这里的HAL_IWDG_Refresh函数的功能是在键寄存器IWDG_KR中写入0xAAAA,也就是喂狗操作。

3 实验结果

实验结果:未检测到按键时,LED2灯常亮,当在规定的时间内按键操作,LED2灯熄灭。
独立看门狗实验结果


作者:whs??



函数 hal stm32

需要 登录 后方可回复, 如果你还没有账号请 注册新账号