打印
[STM32U5]

【NUCLEO-U5A5ZJ-Q测评】RTC时间和RTC闹钟测试

[复制链接]
892|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OldestTrick|  楼主 | 2023-12-5 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1、STM32U5的一个特性就是超低功耗,如果想要获取更低的功耗就需要在空闲的时候进入到低功耗模式,之前我们测试过几种低功耗模式的功耗对比。考虑到具体的功耗和进入低功耗后恢复后状态,STOP是一个比较适合的模式。进入和退出STOP模式后,STM32的SRAMs 和寄存器的内容不会丢失。
2、STM32U5A5 有4种STOP模式,几种模式进入和退出方式基本一致。

RTC 、IWDG、外部中断都可以唤醒外部中断。
3 、RTC测试
首先是对RTC的初始化
hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
  hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  hrtc.Init.BinMode = RTC_BINARY_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {

  }
根据需要设置初始的时间和日期
  sTime.Hours = 0x2;
  sTime.Minutes = 0x20;
  sTime.Seconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {

  }
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_DECEMBER;
  sDate.Date = 0x7;
  sDate.Year = 0x20;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {

  }
然后我们每秒打印一次时间
void RTC_TimeShow(void)
{
        uint8_t *showtime[12];
  RTC_DateTypeDef sdatestructureget;
  RTC_TimeTypeDef stimestructureget;

  /* Get the RTC current Time */
  HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  /* Get the RTC current Date */
  HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  /* Display time Format : hh:mm:ss */
  sprintf((char *)showtime, "%02d:%02d:%02d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
  ux_send((const uint8_t *)showtime,8);
}
可以看到时间正常的更新

4、RTC 闹钟测试
首先设置RTC 闹钟5秒中断一次
void RTC_AlarmConfig(void)
{
         RTC_TimeTypeDef stimestructureget;
         HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);

          RTC_AlarmTypeDef sAlarm = {0};
          /** Enable the Alarm A
          */
          sAlarm.AlarmTime.Hours = stimestructureget.Hours;
          sAlarm.AlarmTime.Minutes = stimestructureget.Minutes;
          sAlarm.AlarmTime.Seconds = stimestructureget.Seconds + 5;
          sAlarm.AlarmTime.SubSeconds = 0x56;
          sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_MINUTES|RTC_ALARMMASK_HOURS;
          sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
          sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
          sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY;
          sAlarm.Alarm = RTC_ALARM_A;
          if(sAlarm.AlarmTime.Seconds == 60)sAlarm.AlarmTime.Seconds=0;

          if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
          {

          }

}
然后在中断回调函数里面输出当前的时间,并重新设置下次闹钟的时间
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{

        ux_send((const uint8_t *)"RTC Alarm!",10);
        RTC_TimeShow();
        RTC_AlarmConfig();

}
可以看到 RTC闹钟5秒更新一次时间

如果是进入STOP模式的话,将会5秒被唤醒一次。



使用特权

评论回复
沙发
单片小菜| | 2023-12-11 18:46 | 只看该作者
这个最好是链接ESP32进行互联网抓取时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

44

帖子

3

粉丝