你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U083RC评测】⑥RTC

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-24 00:09
今天来玩一下STM32U0RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的

工程还是使用之前的模板工程

一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg

4.jpg
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()
  2. {
  3.   RTC_DateTypeDef sdatestructureget;
  4.   RTC_TimeTypeDef stimestructureget;

  5.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  6.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  7.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
  8.     2000 + sdatestructureget.Year,
  9.     sdatestructureget.Month,
  10.     sdatestructureget.Date,
  11.     sdatestructureget.WeekDay,
  12.     stimestructureget.Hours,
  13.     stimestructureget.Minutes,
  14.     stimestructureget.Seconds
  15.     );
  16. }
复制代码
5.jpg
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据

把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();
  2.     HAL_Delay(1000);
复制代码
6.jpg
然后编译下载,效果如下
7.jpg

然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()
  2. {
  3.   RTC_TimeTypeDef sTime = {0};
  4.   RTC_DateTypeDef sDate = {0};


  5.   sTime.Hours = 21; /* 21点 */
  6.   sTime.Minutes = 30; /* 30分 */
  7.   sTime.Seconds = 10; /* 10秒 */
  8.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
  9.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */
  10.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  11.   {
  12.     Error_Handler();
  13.   }
  14.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
  15.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */
  16.   sDate.Date = 23; /* 23日 */
  17.   sDate.Year = 24;  /* 24年 */

  18.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22. }
复制代码
8.jpg
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
  2.   uint8_t flag = 0;
复制代码
9.jpg
  1.     if (flag == 0)
  2.     {
  3.       if (cnt == 10)
  4.       {
  5.         set_rtc_data();
  6.         flag = 1;
  7.       }
  8.       else
  9.       {
  10.         cnt++;
  11.       }
  12.     }
复制代码
10.jpg
然后下载,运行结果如图
11.jpg

本次测试的工程: STM32U0_RTC_test.rar (5.18 MB, 下载次数: 0)
3.jpg

STM32U0_RTC_test.rar

下载

5.18 MB, 下载次数: 3

收藏 评论1 发布时间:2024-5-24 00:09

举报

1个回答
STMCU-管管 回答时间:2025-4-30 09:41:39

感谢分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版