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

【经验分享】STM32开发,使用HAL库函数实现独立看门狗功能

[复制链接]
STMCU小助手 发布时间:2022-5-6 09:26
1 概述
1.1 资源概述

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

8%RJBQ@}2KTQAQPE~Q3B9.png

1.2 引脚资源分配

M)LO6WYVZTE24CT(%LK}W[3.png

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

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

2 软件开发
2.1 CUBEMX配置
时钟配置


激活IDWG,分频系数改为16,预装载值设为4096。

6({3SBZH$Z()%2[QPD~01Q8.png

独立看门狗由LSI提供时钟

20200405091416635.png

这里可以计算得到看门狗复位时间如下,这个时间足够我们操作按键喂狗。
t=1/(400000Hz/16)×4096=1.638S

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

  1.   MX_IWDG_Init();//看门狗初始化程序
复制代码

下面是这个函数的定义。

  1. void MX_IWDG_Init(void)
  2. {

  3.   hiwdg.Instance = IWDG;
  4.   hiwdg.Init.Prescaler = IWDG_PRESCALER_16;
  5.   hiwdg.Init.Reload = 4095;
  6.   if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  7.   {
  8.     Error_Handler();
  9.   }

  10. }
复制代码

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

  1. HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);//初始化时将LED2灯点亮
复制代码

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

  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5. if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假设检测到按键操作
  6.          
  7.           {
  8.          HAL_Delay(20);//按键抖动检测                 
  9.                 if(HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin)==RESET)//假设检测到按键操作
  10.                 {
  11.                         HAL_IWDG_Refresh(&hiwdg);//执行喂狗操作
  12.                           
  13.                         HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);//LED熄灭
  14.                 }         
  15.           }
  16.   }
复制代码

这里的HAL_IWDG_Refresh函数的功能是在键寄存器IWDG_KR中写入0xAAAA,也就是喂狗操作。
这里的按键检测,是不严谨的,因为按键会抖动,所以这里可能存在喂狗多次,下面是按键检测的函数,加入了while();循环,只有在按键弹起时才返回数据。
在初始化按键的IO口,切记要注意上下拉操作,如果是低电平有效就上拉,如果是高电平有效就下拉,不配置或者配置相反,都有可能导致按键不可用,或者不符合逻辑。

  1. uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

  2. {                        

  3.         /*检测是否有按键按下 */

  4.         if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  

  5.         {         

  6.                 /*等待按键释放 */
  7.                 HAL_Delay(10);
  8.                 if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )
  9.                 {
  10.                         while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);                           
  11.                         return         KEY_ON;         
  12.                 }
  13.                
  14.         }
  15.         return KEY_OFF;

  16. }
复制代码

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

20200405100526444.gif
收藏 评论0 发布时间:2022-5-6 09:26

举报

0个回答

所属标签

相似分享

官网相关资源

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