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

【NUCLEO-U083RC评测】⑥RTC

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-24 00:09
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
+ g. Q; y3 Q1 _& m; C7 \6 A
工程还是使用之前的模板工程
. e8 Q- B. ^0 P( \- a- U
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg 5 `/ r+ t: ]0 v/ ?
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg 6 d# `, l( ^0 Q! _  c. z$ c1 \* `
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg 0 W. Q! g: N; c1 [4 r; t
: [$ A8 \% K+ ?! S# e6 l
4.jpg & \* _6 L, k* A, e9 O
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()
    + J3 P# s0 u- b3 m: @+ _
  2. {. P& S' B6 E0 r7 X" ?
  3.   RTC_DateTypeDef sdatestructureget;  Z) ~- k* y3 u3 p; |$ _0 g6 j  ]" M
  4.   RTC_TimeTypeDef stimestructureget;  H6 S& Q! @( e8 p- S/ @8 S# U2 N

  5. 7 l$ a7 ?/ S% x4 _, Z
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
    4 G+ g! h. J! t4 {6 u
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);5 g4 S, s. Y- n2 P& C/ d9 a9 Z% G
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
    % Q: F% g- u, S. A3 D
  9.     2000 + sdatestructureget.Year,
    ' ^; N  \3 y8 d. `
  10.     sdatestructureget.Month,
    ; j# O* @& b% x8 S! h' F
  11.     sdatestructureget.Date,, g: Q9 n/ M2 i# X; J
  12.     sdatestructureget.WeekDay,
    ) c% z. o$ s/ ?2 c9 g. l0 D. Y
  13.     stimestructureget.Hours,
    ; B0 c$ X1 Q) ~% ]) `( d. U2 Z
  14.     stimestructureget.Minutes,) V) J: \; `' d) Q% v1 h
  15.     stimestructureget.Seconds" H; N! f- M5 ~0 q, ~! n" s
  16.     );
    8 }7 q5 K% ]/ o$ W: \2 C
  17. }
复制代码
5.jpg
: y( ?# n& X7 l" @$ a1 Y, J
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据

& e9 A/ o/ p( ^2 f* F# L# w* [
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();! H2 G+ ^' C8 u" H; n6 N
  2.     HAL_Delay(1000);$ k4 V( e: Z2 C* {
复制代码
6.jpg 8 s  f% ~: y! B* U+ x* d' a
然后编译下载,效果如下
7.jpg
) u9 _8 g4 H- f9 N, w

' e( s8 [2 ^' d
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()- c0 h+ @' [$ ]
  2. {
      u& ^& V3 p0 j5 D2 R
  3.   RTC_TimeTypeDef sTime = {0};
    9 s* J) `( j1 U7 |' w& ^' l+ ?
  4.   RTC_DateTypeDef sDate = {0};
    9 b! V/ g9 {% {, }
  5. . L; S9 B2 _9 @3 u* r4 E
  6. 1 a5 ^: V( [  p) ]$ B6 M$ r% a
  7.   sTime.Hours = 21; /* 21点 */+ V1 L( ~+ K9 f, [# k# e$ O
  8.   sTime.Minutes = 30; /* 30分 */
    ) a4 M! W3 w) S9 x' p/ R
  9.   sTime.Seconds = 10; /* 10秒 */
    * x. H% I; E5 M* d8 b
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
    , g& X- @+ \; F6 T4 Y1 e( j
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */: d; O5 X- J7 ]) H. i- R
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)/ e- o: R( H2 z5 r+ A
  13.   {0 X/ z# W3 E# J) g. R4 s
  14.     Error_Handler();9 B. O# l! N* S% h8 U! `
  15.   }
    ; R$ c) R2 A( P
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    1 G2 }# }: x6 P0 f- O" _
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */
    9 b& z4 S: |/ X  c* L: c' w
  18.   sDate.Date = 23; /* 23日 */
    5 p; r7 G: S/ g6 Y% b
  19.   sDate.Year = 24;  /* 24年 */1 A% ]( I' ]( g4 x
  20. ' h. `. d7 c- T9 ]
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    . d9 `7 X* [: A
  22.   {
    4 B& h2 P" X; Z  c
  23.     Error_Handler();# M+ k, i' C. T. T. q: ~: a
  24.   }
    $ A; M8 O6 g/ p+ N, v" A# m. D% J- g
  25. }
复制代码
8.jpg
" b, `( Y) ^# I  d, f$ {8 M" Z; s2 q
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    . P, b- _5 X; m; M/ n
  2.   uint8_t flag = 0;9 R) g9 [) S, v+ C/ i
复制代码
9.jpg 7 b- f- d' E% k2 p+ O
  1.     if (flag == 0)9 G! x8 o$ v9 O5 x, V1 `9 @
  2.     {0 s! _: ?. v' N- E
  3.       if (cnt == 10)
    7 V# I4 t  d# r7 G: r
  4.       {
    " S% }3 {' |" @$ G8 \# v
  5.         set_rtc_data();
    . x; k; e/ v1 Q( C% W: n
  6.         flag = 1;
    " b: \, c! w- T+ `0 y
  7.       }9 y0 P+ W- o2 L0 N
  8.       else
    $ {) W4 Z0 O% e
  9.       {$ G- K9 t+ X$ T5 i8 ?  l
  10.         cnt++;
    " E+ C4 }9 B8 R1 m
  11.       }) U' a- ~  H5 i
  12.     }
复制代码
10.jpg
# \  H7 C0 b& n& k6 y; n$ k
然后下载,运行结果如图
11.jpg ; D; Y% D9 h) n  n
/ X+ R- U5 H0 q7 D5 f% \: @$ z
本次测试的工程: 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 手机版