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

1 概述

1.1 资源概述

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

1.2 引脚资源分配

序号引脚资源备注
1PA13SWDIOSWD输入输出信号
2PA14SWDCLKSWD时钟信号
3PC13BUTTON用户按键
4PA5LED2指示灯

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。
看门狗设置
独立看门狗由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();
  }
}

HAL_IWDG_Init函数展开内容

  __HAL_IWDG_START(hiwdg);//启动看门狗
  IWDG_ENABLE_WRITE_ACCESS(hiwdg);//允许看门狗写入

对应内联函数如下

#define __HAL_IWDG_START(__HANDLE__)     WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE)
#define IWDG_ENABLE_WRITE_ACCESS(__HANDLE__)  WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_ENABLE)```

对应宏值如下

#define IWDG_KEY_RELOAD                 0x0000AAAAu  /*!< IWDG Reload Counter Enable   */
#define IWDG_KEY_ENABLE                 0x0000CCCCu  /*!< IWDG Peripheral Enable       */
#define IWDG_KEY_WRITE_ACCESS_ENABLE    0x00005555u  /*!< IWDG KR Write Access Enable  */
#define IWDG_KEY_WRITE_ACCESS_DISABLE   0x00000000u  /*!< IWDG KR Write Access Disable */

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

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)

{			
	/*检测是否有按键按下 */
	if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  
	{	 
		/*等待按键释放 */
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON ) 
		{
			while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);   			
			return 	KEY_ON;	 
		}		
	}
	return KEY_OFF;
}

3 实验结果

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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F407HAL库函数手册是一本详细描述STM32F407系列芯片的HAL库函数的参考手册。HAL即硬件抽象层,这些函数应该能够在不同的STM32F407微控制器之间保持一致,并且可以方便地编写应用程序。 手册详细描述了STM32F407微控制器的各种外设和功能,并为每个外设和功能提供相关的HAL库函数。例如,手册详细列出了所有的GPIO外设,提供了用于配置和控制GPIO的HAL库函数。此外,还提供了一些有用的示例代码和解释,帮助开发人员更好地理解如何使用这些函数。 通过使用STM32F407HAL库函数手册,开发人员可以更快地编写出高质量、高效的STM32F407应用程序,减少了开发时间和开发成本。这是非常有价值的,尤其是在需要使用硬件外设进行复杂任务的应用程序开发中。 总而言之,STM32F407HAL库函数手册是一本非常有价值的参考手册,可以帮助开发人员更好地理解和使用STM32F407微控制器的HAL库函数,从而加快开发速度,提高程序质量和性能。 ### 回答2: STM32F407HAL库函数手册是一份详细的文档,包含了关于STM32F407单片机的所有HAL库函数的具体用法和示例代码。HAL库是指硬件抽象层,是一种针对硬件平台的封装,将底层硬件操作封装成一些易于使用的API函数,有助于提高开发效率和代码重用率。 STM32F407HAL库函数手册的主要内容包括:库函数的分类和用途、函数参数和返回值的详细说明、函数使用的示例代码等。对于初学者而言,阅读手册可以帮助他们了解STM32F407单片机的各种功能模块和使用方法,包括GPIO、USART、SPI、I2C等常用外设的配置和使用方法。 此外,手册还包含了一些高级功能的示例代码,比如DMA、中断、时钟等。这些高级功能能够帮助开发者更加深入地理解STM32F407单片机的工作原理,实现更加复杂的应用。 总之,STM32F407HAL库函数手册是一份非常有价值的文档,对于开发者来说,它是必备的参考资料。通过阅读手册可以有效地提高代码开发效率和质量,实现更加丰富多彩的STM32F407单片机应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值