stm32 RTC闹钟唤醒低功耗模式

stm32 RTC闹钟唤醒 低功耗模式

rtc初始化

void MX_RTC_Init(void)
{

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef DateToUpdate = {0};

  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */

	RTC_SET_Alarm(&sTime );
	
	if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!=0X1234)
		{
				HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR1,0X1234);

		}else return;
  /* USER CODE END Check_RTC_BKUP */

  /** Initialize RTC and set the Time and Date
  */
  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
  DateToUpdate.Month = RTC_MONTH_JANUARY;
  DateToUpdate.Date = 0x1;
  DateToUpdate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
}

void RTC_SET_Alarm(RTC_TimeTypeDef * sTime )
{	
    RTC_AlarmTypeDef alarm;
    HAL_RTC_GetTime(&hrtc, sTime, RTC_FORMAT_BIN);
 
    sTime->Seconds += ALARM_INTERVAL;
    if(sTime->Seconds >=60)
    {
        sTime->Minutes += 1;
        sTime->Seconds = sTime->Seconds-60;
        if(sTime->Minutes >=60)
        {
            sTime->Hours += 1;
            sTime->Minutes = 0;
            if(sTime->Hours >=24)
                sTime->Hours = 0;
        }
    }else ;

    alarm.AlarmTime.Hours   = sTime->Hours;
    alarm.AlarmTime.Minutes = sTime->Minutes ;
    alarm.AlarmTime.Seconds = sTime->Seconds ;
    alarm.Alarm = RTC_ALARM_A;

    if(HAL_RTC_SetAlarm_IT(&hrtc, &alarm, RTC_FORMAT_BIN)!= HAL_OK)
     {
        Error_Handler();
     }

}

主函数

int main(void)
{

  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_RTC_Init();
  MX_USART1_UART_Init();
  while (1)
  {
    /* USER CODE BEGIN 3 */
    
		HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
		HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);
		
		HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
		/* Get the RTC current Date */
		HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

		/* Display date Format : yy/mm/dd */
		printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
		/* Display time Format : hh:mm:ss */
		printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

	    printf("\r\n");

		HAL_SuspendTick(); 
        HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI;

		SystemClock_Config();
		MX_RTC_Init();
  }
  /* USER CODE END 3 */
}

在这里插入图片描述

5秒唤醒一次还是挺准的

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 RTC休眠闹钟唤醒是指利用STM32系列微控制器的RTC实时时钟)模块实现的一种电源管理功能。当系统处于低功耗模式下(如休眠模式),RTC可以在预设的时间点产生一个中断信号,唤醒系统从休眠状态中恢复。 要使用STM32RTC作为闹钟唤醒功能,首先需要初始化RTC模块并设置闹钟时间。可以通过设置RTC的时分秒以及日期参数来设定闹钟的触发时间。然后需要配置RTC中断,使得闹钟触发时能够产生一个中断信号。可以在RTC的CR寄存器中设置ALRAE位来使能闹钟中断,并在RTC的ALRMAR寄存器中设置闹钟的时间。设置好参数后,需要通过打开RTC闹钟中断的NVIC中断控制器来使能闹钟中断。 当系统进入休眠模式后,RTC会计时并在预设的触发时间点产生中断信号,唤醒系统。在中断服务函数中,处理闹钟触发的事件,可以进行一些必要的操作以及系统状态的恢复。 需要注意的是,在使用RTC休眠闹钟唤醒功能时,需要合理选择休眠模式并设置相应的功耗管理选项,以达到最低功耗的目的。要注意RTC模块的供电要求以及时钟校准等相关设置,以确保RTC模块的准确性和稳定性。 总结一下,STM32 RTC休眠闹钟唤醒功能是通过使用RTC模块来实现的一种电源管理功能。通过设置RTC闹钟时间和中断使能,可以在系统休眠时在预设的时间点唤醒系统,处理相应的事件并恢复系统状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值