抹茶妹妹 发表于 2022-9-30 22:53

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();
   }

}




抹茶妹妹 发表于 2022-9-30 22:55

主函数
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 */
}

抹茶妹妹 发表于 2022-9-30 22:55

抹茶妹妹 发表于 2022-9-30 23:01

5秒唤醒一次还是挺准的

asmine 发表于 2022-10-1 08:58

唤醒频率怎么修改
页: [1]
查看完整版本: stm32 RTC闹钟唤醒低功耗模式