stm32---待机模式与独立看门狗的和谐相处(即在待机模式下不开启独立看门狗,在正常运行程序下开启独立看门狗)

前提概要:需要使用stm32的RTC备份寄存器BKP,利用的是RTC的BKP寄存器在待机模式下依旧保存寄存器内的数据的特性(此外,需要提前了解如何进入待机模式/开启RTC的备份寄存器BKP/开启独立看门狗模式)

思路图:

stm32---待机模式与独立看门狗的和谐相处(即在待机模式下不开启独立看门狗,在正常运行程序下开启独立看门狗)_第1张图片

相关操作如下(需了解图中注释):

stm32---待机模式与独立看门狗的和谐相处(即在待机模式下不开启独立看门狗,在正常运行程序下开启独立看门狗)_第2张图片

宏定义:

//存放RTC的BKP寄存器的待机模式标志位与独立看门狗标志位
#define IWDG_RESET    0X55
#define STANDBY_RESET 0XAA

相关函数:

//开启看门狗
void IWDG_Open(void)
{
	MX_IWDG_Init();
}
//系统复位
void Reset_soft(void)
{
	__disable_irq();
	HAL_NVIC_SystemReset();
	__enable_irq();
}
//进入待机模式
void Reset_Go_StandBy(void)
{
	  HAL_GPIO_WritePin(KEY1_GPIO_Port,KEY1_Pin, GPIO_PIN_RESET);//PB0端口变低电平,准备好唤醒键初始电平
	  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除 WKUP唤醒键 状态位
	  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//使能WKUP引脚的唤醒功能(使能PA0)
	  HAL_PWR_EnterSTANDBYMode();//进入【待机模式】
}

RTC的备份寄存器BKP读值判断: 

	/*待机模式和独立看门狗的和谐相处(每次复位判断RTC的BKP寄存器中存储的数据是否为STANDBY_RESET标志位)*/
	if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1) == STANDBY_RESET)
	{
		printf("\r\n判断到STANDBY_RESET标志位,进入待机模式\r\n");//串口发送
		printf("写入寄存器BKP为IWDG_RESET\r\n");//串口发送
		//写入寄存器BKP(清除RTC寄存器的STANDBY_RESET标志位)
		HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1, IWDG_RESET);
		Reset_Go_StandBy(); //进入待机模式
	}
	else   //若不是则开启独立看门狗
	{
		IWDG_Open();
	}

判断独立看门狗\软件\退出待机模式的各种复位标志位的操作: 

	 //5.判断复位标志位是否为独立看门狗产生
	if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)!= RESET)
	{
		 printf("\r\n独立看门狗复位!\r\n");//串口发送
		__HAL_RCC_CLEAR_RESET_FLAGS(); //清除复位标志
	}

	//6.判断复位标志位是否为软件复位产生(首次上电复位和HAL_NVIC_SystemReset()属于软件复位)
	if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)!= RESET)
	{
		 printf("\r\n软件复位!\r\n");//串口发送
		__HAL_RCC_CLEAR_RESET_FLAGS();//清除复位标志
	}



	 //4.判断复位是否为待机模式退出产生的
	if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)//判断本次复位是不是从待机中唤醒
	{
		printf("从【待机】模式中唤醒!\r\n");//串口发送
		HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);//禁止WKUP引脚的唤醒功能
		__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);//清除唤醒标志位
		 BUZZER_SOLO1();
	}

按键操作(key1进入待机模式,key2模拟不及时喂狗产生独立看门狗复位):

		  /* -------按键1的工作内容-------
		   *  长按按键1: 3s后进入待机模式
		   * 再次按下按键1的瞬间则退出待机模式,进入工作模式
		   */
		  if(Key_Num == 1) //判断是按键1按下
		  {
			  printf("进入【待机】状态!(按IoT开发板上的“休眠唤醒”键唤醒) \r\n");//串口发送
			  BUZZER_SOLO2();//蜂鸣器输出单音的报警音(样式1:HAL库的精准延时函数)

			  printf("写入BKP为STANDBY_RESET \r\n");//串口发送

			  //5.读取数值到RTC备份寄存器(置STANDBY_RESET标志位,为下次复位不开启独立看门狗做准备)
			  HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1, STANDBY_RESET);

			  Reset_soft();//软件复位
		  }
		  /* -------按键2的工作内容-------
		   *  按下开启加热灯,再次按下关闭加热灯
		   */
		  if(Key_Num == 2)//判断是按键2按下
		  {
			  printf("按下key2 \r\n");
			  BUZZER_SOLO2();
			  HAL_Delay(2000);//超时喂狗,测试独立看门狗

		  }

看门狗喂狗操作:

	  //6.独立看门狗(每2000ms喂狗一次,超过2s未执行喂狗则重启系统)
	  HAL_IWDG_Refresh(&hiwdg);

 

 

 

 

 

你可能感兴趣的:(stm32,嵌入式硬件,单片机)