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

【NUCLEO-U083RC评测】⑥RTC

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-24 00:09
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
: ~  p, R. @. E/ L- V' _% z, o
工程还是使用之前的模板工程
; M% o& ]% m  Y7 z: @
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg 0 o: t4 I5 g; y8 U
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg
* L# S& w, o: U7 `
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg
! r6 i' }" I  N' A6 x5 }& d
; R9 W( o7 M& i8 M
4.jpg + H9 R# b, r' l6 [3 I% R) j* \, z
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()$ \( G$ p5 z0 ?$ e+ Y3 H
  2. {& P7 V2 y3 I9 z( G0 ?3 D( [
  3.   RTC_DateTypeDef sdatestructureget;
    , N- [7 Y' c2 n: l
  4.   RTC_TimeTypeDef stimestructureget;0 K3 F9 s/ J, o- R" U
  5. % F3 |, {$ E9 \+ q) ]
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);0 l- ^8 S4 C( `
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
    0 q2 @# {0 T, `$ I" C* J6 F
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
      f" _7 ^5 N, P3 t0 U: X
  9.     2000 + sdatestructureget.Year,
    2 _9 }* r1 [- ?
  10.     sdatestructureget.Month,
    , [; d2 t" H# n7 K. i3 l
  11.     sdatestructureget.Date,7 g) H" t1 f, e
  12.     sdatestructureget.WeekDay,/ O# p/ @. ^( N/ w8 `% A
  13.     stimestructureget.Hours,
    % x! K8 \' j2 i; k
  14.     stimestructureget.Minutes,/ F2 b+ h" i7 \2 N# l, O
  15.     stimestructureget.Seconds
    + M3 v5 Q- z% [
  16.     );; o! o$ H5 @! _
  17. }
复制代码
5.jpg 8 E/ y! [1 b" \: N
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据
6 ?( U! N3 u; d& |: J2 P" \. e
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();8 O- z1 Z' U! E1 {
  2.     HAL_Delay(1000);+ q  I' H" m' r4 G, g
复制代码
6.jpg " p/ e. `; N# D! W% B  T2 l
然后编译下载,效果如下
7.jpg / N0 R/ M  l" E& ]
  W5 c2 w' K/ o) L! j. d# Q! b
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data(). ^6 c, c+ w7 T' e
  2. {9 G% C+ g3 a+ O2 H# R) y, d
  3.   RTC_TimeTypeDef sTime = {0};
    4 h2 f% O" u$ E( W1 p
  4.   RTC_DateTypeDef sDate = {0};
    2 \( P1 e  w! S% K+ G8 a. T: t! h

  5. , `$ ^. c, f# p

  6. 9 b$ P; [/ t' ]+ `) Y
  7.   sTime.Hours = 21; /* 21点 */
    + z' r( a; r/ ~' N
  8.   sTime.Minutes = 30; /* 30分 */% _. T# B1 f% m& k+ }& u/ U+ q
  9.   sTime.Seconds = 10; /* 10秒 */( i( {0 w2 ~) r0 m
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
    $ N/ R0 d( c% P
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */( i) @( t6 R, W) B# B; t
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK), T2 b7 B- S* h0 n# G
  13.   {) S4 [6 t& A; n$ a3 J5 G2 R
  14.     Error_Handler();
    ' X+ d0 r* @1 ^8 `' k  F5 F0 h8 ]
  15.   }
      O3 N$ J2 |0 B/ R7 g4 x) Z
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    1 Y  Z& P/ B1 h3 E# q, }
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */4 v% F& ?: o3 H# @7 n3 s0 m0 ]& k
  18.   sDate.Date = 23; /* 23日 */& g7 l: j2 T: ^& ~! I# U
  19.   sDate.Year = 24;  /* 24年 */
    & U4 }$ F& [8 `1 i) z

  20. + L( G# [, ?6 \" J% F
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
    ; B  E# B: r7 T/ R0 j
  22.   {: m3 F& h  v1 @$ _( i- q# V  s
  23.     Error_Handler();* X3 f) o% c" M9 t
  24.   }9 ]; |: M2 b3 f; \/ }
  25. }
复制代码
8.jpg
' F9 ?8 K3 h9 F$ N' C# K1 A
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    # M( H# h: Y, r7 e" F& }2 N
  2.   uint8_t flag = 0;0 [  j/ Q& e# X  y: l4 m; u
复制代码
9.jpg
5 T* ~6 Q1 x% o
  1.     if (flag == 0)6 c0 ~/ [+ l4 H$ E
  2.     {0 f# q' B& U% t9 N0 ~
  3.       if (cnt == 10)
    2 ]" t% _) @% X0 a* [+ Q; v9 W" t  Q
  4.       {
    ; w8 X& v3 ~4 u# [& L* w9 P
  5.         set_rtc_data();
    1 z7 D$ s) ^( t( M7 T1 D
  6.         flag = 1;6 k, l- l( `- H
  7.       }
    + D# y% z$ N* A: E
  8.       else
    3 v. G6 k2 p+ @$ e* \' ?
  9.       {
    0 p% a, t9 U4 I6 @) i( m8 C4 p4 r
  10.         cnt++;+ j0 p2 n$ U4 f/ G) T  X
  11.       }8 O' f) R* I' ?2 E
  12.     }
复制代码
10.jpg
9 h! w1 W9 w+ S/ n
然后下载,运行结果如图
11.jpg
5 Q  ~6 n/ b& C+ `

( H9 X* v9 Q/ Y. {8 m
本次测试的工程: 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 手机版