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

【NUCLEO-U083RC评测】⑥RTC

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-24 00:09
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
. r: [& {9 D- X' j$ q
工程还是使用之前的模板工程
5 n+ r3 T3 o$ B
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg
) Q6 x' S6 H8 N+ F, }
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg * }# g; ]+ Z# _, y9 i
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg
7 g3 Y" S$ w% d5 L0 h$ b) [5 Y9 t+ r
6 p; x( R" I) p  \2 `5 X
4.jpg ! k9 ]* ~# d. A6 o
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()
    , y' v5 M6 C; @+ Q; M
  2. {
    $ P( z5 L# B9 G  N1 j- p+ H
  3.   RTC_DateTypeDef sdatestructureget;
    " Y: K1 I7 P/ i$ V
  4.   RTC_TimeTypeDef stimestructureget;5 H% ~1 N3 u) [/ [" S0 P

  5. 3 K7 a0 k; a& m0 o7 ^
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);3 b1 W+ V, P2 L' j  B8 ^( L; K* |
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
    3 T! p7 ]" }" @
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n", : }, H8 f$ ^1 E/ o' k; C/ y/ `
  9.     2000 + sdatestructureget.Year,
    ; V! q: \& ]" I2 W$ B5 n
  10.     sdatestructureget.Month,5 q# H7 F  I, M& g
  11.     sdatestructureget.Date,
    * B- z4 G: r9 i1 o2 L7 r+ L5 ?
  12.     sdatestructureget.WeekDay,0 y- v, n/ U5 @2 P) t* a3 A
  13.     stimestructureget.Hours,
    - u; [6 y/ a4 J5 U) N
  14.     stimestructureget.Minutes,( u8 @" v% k+ F8 T6 t& i
  15.     stimestructureget.Seconds4 R- W  s, X& Q/ G. F1 I
  16.     );
    $ |! _& |8 A* S2 ?) ]; J+ Y
  17. }
复制代码
5.jpg
; v% f$ H8 E( {  I: Q
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据

6 \9 D, W! @/ I0 p3 g' S4 Z# X# Q/ l
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();6 J' z' N  s. s: o/ A
  2.     HAL_Delay(1000);
    $ A! ~. ]) e3 ?
复制代码
6.jpg
  f/ y: `" T  Y8 W2 b
然后编译下载,效果如下
7.jpg
. G# M* X) `3 q1 @

3 ^% G! @6 i# W' b1 A
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()1 [1 z7 Q0 K# \* X& z% u' b# R
  2. {' C( }7 P6 R; E- _7 ]) B/ x4 ^
  3.   RTC_TimeTypeDef sTime = {0};: Z: V/ E4 q: U; R* f
  4.   RTC_DateTypeDef sDate = {0};
    7 d1 S+ r2 [$ x" q3 A8 k* a

  5. * p1 a7 W; T+ V2 j8 e
  6. 6 V4 ^+ a- T6 c
  7.   sTime.Hours = 21; /* 21点 */3 x) v% W; |6 D& h4 G* `9 i
  8.   sTime.Minutes = 30; /* 30分 */
    2 |- f" ~& t$ M
  9.   sTime.Seconds = 10; /* 10秒 */( e* Y! M3 w: V8 o& ]
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */) W. F+ `( }2 p# I: L) j
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */- x) W# u6 I  L, ?' Y2 q1 _
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    / {5 l, P* F9 J0 K( P
  13.   {: d& l" h: K* D: g# Z
  14.     Error_Handler();
    1 l& f. j, k. N3 S
  15.   }3 ~2 \: n+ f. _
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    ; |2 P# R0 X2 @" D
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */+ p. Y$ c3 i8 H
  18.   sDate.Date = 23; /* 23日 */
    ' A" r. p: n1 f% q' Q7 P/ X. R) u
  19.   sDate.Year = 24;  /* 24年 */
    1 [8 z  @0 |- Y! w$ j

  20. ) T) ~5 _" q! c4 e! M
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    " m8 n& i9 Y% f* B+ Z  }
  22.   {
    3 T0 @. k8 V' b+ O; J7 B. ^, l, @* H6 p
  23.     Error_Handler();7 n* d+ [5 |/ B  Y
  24.   }
      N* d8 x  d# V5 e6 T
  25. }
复制代码
8.jpg 9 T, [! h! m  E
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    ; L, V. |  u8 z! Z  o+ o
  2.   uint8_t flag = 0;" A7 i! Z0 e3 K
复制代码
9.jpg
- C( G7 Z: r& i: D# h" K  [
  1.     if (flag == 0). |; o, _2 B' X
  2.     {+ m3 y' k; w- ]* r# ^
  3.       if (cnt == 10)0 o; V' U: i1 o: E" n1 b/ `: O
  4.       {
    . {$ f  {6 B' X
  5.         set_rtc_data();
    4 n5 ?9 V: S1 Q8 P
  6.         flag = 1;
    0 v. }. O" m1 f: x
  7.       }
    ) D7 h8 V5 u3 d
  8.       else
    6 z# u+ T8 u8 o+ g, ]. \# H# @0 ~' O
  9.       {
    " j0 r& F8 F! [9 m  L9 t; t! O3 ?6 C6 m
  10.         cnt++;
    % F' M) T1 L( o# Z# S7 f5 s
  11.       }
    1 _& M7 s: j( J0 R  M
  12.     }
复制代码
10.jpg
' Q$ n" I; S, D
然后下载,运行结果如图
11.jpg " G: u( D$ {3 r. v# Y( L
/ g& w. U% ~5 \" P1 ?" x- O
本次测试的工程: 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 手机版