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

【NUCLEO-U083RC评测】⑥RTC

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

8 n' J% W# v% K* w. w
工程还是使用之前的模板工程

6 `! d& C) {5 l3 R& I$ U7 T* X
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg
" K( X5 l# r0 x' w$ L2 s$ h
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg
6 T! ]7 e8 |1 d
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg / D3 K) [4 {1 S+ T
; g- _( P3 A( g8 m4 m
4.jpg
, W/ b( _* M% o/ J2 G3 @; {% S
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()
    ' L+ ]6 c( G$ b
  2. {
    ! k) l" @/ ]  G# r5 ]/ r; d
  3.   RTC_DateTypeDef sdatestructureget;, n, M+ @" J# a  A& }
  4.   RTC_TimeTypeDef stimestructureget;
      K1 d) K& N1 ?8 N# E5 H& n8 c
  5. & u8 S# s7 s9 W0 s+ _
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
    # ^& R  m9 U  B7 q  A
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);8 D! s. L8 a, r7 b% }  b
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
    * _5 `) t" a' m- b  x7 |+ c( N
  9.     2000 + sdatestructureget.Year,# ~& w: Q- I9 E9 Z
  10.     sdatestructureget.Month,
    & T$ L; n' e5 x4 }! b# q
  11.     sdatestructureget.Date,0 A* }, W) I: A6 @
  12.     sdatestructureget.WeekDay,- T5 B9 r( D/ @% r6 o' k8 D
  13.     stimestructureget.Hours,6 {3 ]) }! M3 w6 f
  14.     stimestructureget.Minutes,
    3 q' e% K+ K( o/ F+ ?: W% K
  15.     stimestructureget.Seconds
    4 X* N! y3 x9 g+ p7 r
  16.     );4 n. p# ~- z8 X6 x
  17. }
复制代码
5.jpg
% v+ W! ]9 |2 L# [/ \( W
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据

/ k9 Q+ ^0 b  S( F1 B
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();
    ! H6 V7 f* }+ U1 O: c
  2.     HAL_Delay(1000);
    # K5 C' }" K) }9 T  S
复制代码
6.jpg 0 ^+ u! A6 Z$ P4 s- ?% x
然后编译下载,效果如下
7.jpg ( i7 I$ _6 Y0 u8 O. z' m% a

) F: A  k. t  o' e% J0 n
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()
    1 |# E( n4 \$ Y, ]9 \, }" l$ q. q
  2. {, _0 y# J# T2 e2 S4 H4 U; e! b0 Q* `
  3.   RTC_TimeTypeDef sTime = {0};
    & p/ q$ a6 d6 t3 j/ F
  4.   RTC_DateTypeDef sDate = {0};( X/ f7 I( a' c: z, w* k
  5. ' J) s4 Q2 D) d$ B
  6. * t& i, O5 x* b! x/ U
  7.   sTime.Hours = 21; /* 21点 */
    2 t: |8 h/ F0 c% Y4 ~3 R  E' M" \
  8.   sTime.Minutes = 30; /* 30分 */+ H# j$ k0 q) \$ w
  9.   sTime.Seconds = 10; /* 10秒 */# x4 K4 j6 l4 Y
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */. B$ D1 G& p& ^, L
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */: l' F! E& n5 A# H8 A5 |
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    $ N  x1 H6 ?! f7 @  v3 u/ R
  13.   {
    # r0 F: w* n% T- E
  14.     Error_Handler();; w* W: Q* I) U) ^6 c6 {
  15.   }
    8 _9 u# I: s/ x; X& ?3 Z; t
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    3 I; ?2 C' _& I
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */
    + C% A, }: n# g7 N* J  v: {/ \
  18.   sDate.Date = 23; /* 23日 */5 Q/ X2 M8 W0 g
  19.   sDate.Year = 24;  /* 24年 */
    " U3 ^) j% |! H  G3 M% h

  20. * g6 ^. V' x. ?7 G4 ~
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)4 s7 \4 k! K$ l
  22.   {
    ; V8 w  }+ a. T. `4 E0 e! l
  23.     Error_Handler();% ?* I' g- W( P7 w6 r1 B
  24.   }9 A' h3 J  ~+ Y) z' F% c
  25. }
复制代码
8.jpg : {8 \  e1 V# i3 ^1 ~0 ?9 T4 `
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    $ O" `8 o3 N9 a1 M
  2.   uint8_t flag = 0;5 z' G$ R3 ?3 a5 {& q9 n2 A
复制代码
9.jpg " L4 n: u1 o, h+ ?) u4 O
  1.     if (flag == 0)' @8 j) x9 R1 j  Y4 ^! S
  2.     {
    " t5 R% F* y" a, A8 `
  3.       if (cnt == 10); `, m- s5 p9 r3 g$ V2 B
  4.       {
    % T+ R) N, o0 Q6 l, [
  5.         set_rtc_data();
    : \% B( \3 x: I- |( K  f+ p3 \
  6.         flag = 1;
    : y4 }2 B* X! T. A; ]0 \
  7.       }
    ( O" N: Q+ D2 q
  8.       else
    + d7 Q& b& v* P+ i9 i& ]2 L
  9.       {
    1 a4 m& T  [0 T+ d! S5 S
  10.         cnt++;' F5 ~- r' O; `) }! R" `# p  C
  11.       }( Y3 z( h: ^0 T
  12.     }
复制代码
10.jpg   i5 A8 N" o) {" l, a; B9 L5 s
然后下载,运行结果如图
11.jpg
6 C* W8 B( b$ d2 O0 r. \. P
% u- v9 s- X0 q" R/ P
本次测试的工程: 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版