打印[STM32U5]【NUCLEO-U5A5ZJ-Q测评】RTC时间和RTC闹钟测试

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秒被唤醒一次。
---------------------
作者:OldestTrick
链接:https://bbs.21ic.com/icview-3346018-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值