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

【NUCLEO-U083RC评测】⑥RTC

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

# f9 j5 X8 S; ~) q4 F& f# b7 O
工程还是使用之前的模板工程

+ S6 N. ^7 x5 o. I5 Z% M
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg 1 H/ N4 p1 X# ?8 q' e; k
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg
2 t0 z6 r! s* [' V: }$ T- \
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg
1 v8 s! P& p, ^1 V( V

1 c5 R& F5 O- o2 K
4.jpg : v* G" Q1 R- \/ n9 k
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()/ {) k7 o: s' p' n$ i4 j
  2. {4 K9 J+ ?5 O" I& d3 `
  3.   RTC_DateTypeDef sdatestructureget;! p3 f6 I3 Z+ h% B$ V
  4.   RTC_TimeTypeDef stimestructureget;
    . O! M4 c- U/ F- }5 f0 n/ B

  5. # Y  B3 R4 n4 d, R7 ^) d# ^
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);) O7 H* x7 C% @; c  e6 z( g
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);1 E/ O" Y( e# B( K( K3 @
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
    2 o* p8 g7 z% M: x
  9.     2000 + sdatestructureget.Year," m$ c4 L" J, ]' U2 w* y( I+ C3 X
  10.     sdatestructureget.Month,2 z" M1 \. [5 A, u& N
  11.     sdatestructureget.Date,
    . s" F/ d$ N6 ^7 t9 y
  12.     sdatestructureget.WeekDay,  @6 ~9 G) z: N" t  G
  13.     stimestructureget.Hours,, X, j: Y4 [- C/ ~! v. ?+ ]
  14.     stimestructureget.Minutes,
    / B" K  a" E; W2 M1 X4 M$ @
  15.     stimestructureget.Seconds3 D  R# w7 q. r3 l" m  a
  16.     );( E2 a+ w6 L% q. c
  17. }
复制代码
5.jpg
) L6 o/ j  Y( c3 b. b1 s
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据
8 M+ ~8 z5 ]- S: ?
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();9 V, ~2 y, Y  J% j
  2.     HAL_Delay(1000);
    $ `0 \! v: X! q+ _& o& q4 y
复制代码
6.jpg & w9 c! q4 ?, D+ e  z1 c% }
然后编译下载,效果如下
7.jpg 4 |7 e1 V2 H: S" x0 Q

9 ?! {* d* l( x8 W
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()
    ) N+ U! |# |' C
  2. {9 N/ w( I0 E! v! n, h& [( H! ?
  3.   RTC_TimeTypeDef sTime = {0};
    1 g" \; O1 w0 p( ]- F, @
  4.   RTC_DateTypeDef sDate = {0};
    ; E, |& H- @* ~  A# b& m
  5. 6 i; V* q) D+ Y1 `: I/ ?9 ]

  6. . \0 z* e# m( i' [! j* M* E; I. M
  7.   sTime.Hours = 21; /* 21点 */+ d" @+ e0 h" {0 h& v+ F9 g8 ~
  8.   sTime.Minutes = 30; /* 30分 */
    + I' T6 t! B# o! X$ m0 \& S3 i6 i
  9.   sTime.Seconds = 10; /* 10秒 */2 H9 A5 r! X/ @3 ?8 v* l2 i
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */' m( P, Q- G. r1 T& d7 Q/ E
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */
    , M- @; `5 }  a, r
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
      C. Q$ ]6 x! }. ]- n
  13.   {& e& `4 Y6 [1 q0 M. B
  14.     Error_Handler();- Q6 r/ t# g" s: m3 J" [) r
  15.   }3 U5 h; J; X1 Y5 g4 \$ U+ f
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    1 y# n! O* d& m& _# r
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */( \! P7 P$ ~- C& h3 k% V- p
  18.   sDate.Date = 23; /* 23日 */
    1 v1 {: M  Z  t; ~& R: r
  19.   sDate.Year = 24;  /* 24年 */6 \6 i$ ?" X  |! f4 e% }- w

  20. 7 m$ b) _& J- w) P( S
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    4 q# }& k+ n. c) ^! ^, p# M' f
  22.   {+ {! e4 S' I5 P3 N! J) d
  23.     Error_Handler();, v  }% k0 t  P7 a; \
  24.   }
    5 g1 a5 C3 Q# s: E1 i
  25. }
复制代码
8.jpg ' c. ]5 M' }) C5 d- A
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    7 d. B- }5 i) O
  2.   uint8_t flag = 0;. Y" w+ ?# |# b* \
复制代码
9.jpg 5 \5 c" V4 e" I; m% E0 C. B0 }
  1.     if (flag == 0)$ S) T, B7 l+ J5 n4 L0 u
  2.     {! Y9 R; e; R. k' M2 O
  3.       if (cnt == 10)" r( N: ?/ w4 Z1 Y# X; V: ?  B. X
  4.       {
    5 o) Z& h2 [, c; M8 I0 _2 i
  5.         set_rtc_data();6 k$ _8 x5 ~# J' o  A- l6 d  a
  6.         flag = 1;
    7 M, e/ k7 n+ E, r0 v' t! Q+ n6 ?) D% K
  7.       }' u/ s; O8 v( j' }' ~
  8.       else
    * b; i, [- T. ?9 h
  9.       {
    8 A. h: Z1 @! O: N* ]0 q
  10.         cnt++;7 c! y9 j& p0 q2 S
  11.       }
    : j! [+ k4 R) B5 }6 _; a
  12.     }
复制代码
10.jpg * J& I5 t& E  _& c9 J/ _  k! ~
然后下载,运行结果如图
11.jpg 8 D; K9 b( O. e3 ]
: A9 t2 u' ]+ g: l$ d! 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-管管 回答时间:6 小时前

感谢分享

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