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

【NUCLEO-U083RC评测】⑥RTC

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

; ?( Y4 s5 ]5 \# m0 B
工程还是使用之前的模板工程
5 Q# ?& c! ^; C$ Q+ Y" ~5 C" g6 W
一、cube配置
开启RTC,把时钟源和日历都激活
1.jpg
: r' S9 P7 A0 c% _2 `
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2.jpg " O! G2 p0 A( e
其他参数保持默认即可
我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确
然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
3.jpg
( P4 K3 {; ~" s% d! c) l) r( Q+ N8 V
: I5 [  d% P, _" W9 U' K' z
4.jpg 2 u( D& G' Y5 o% n$ j$ G
最后生成代码(截图略)
二、代码修改
先来写一个获取RTC信息并打印的函数
  1. void print_rtc_data()$ x6 \7 i4 f  G# x- X
  2. {6 N: j8 [. h# U; E' }+ |. \
  3.   RTC_DateTypeDef sdatestructureget;7 ^9 \9 _7 P! z: {: S. g$ _: j0 {( Z
  4.   RTC_TimeTypeDef stimestructureget;8 e9 U+ W# j3 q) p' Q( {
  5. - P4 h" S, f# {# W7 C+ T: P
  6.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
    - a+ T# [5 j4 r7 d4 P( A. N
  7.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);) t" d" j' Y1 h  ?2 A
  8.   printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
      ~, Z$ p& Q! l
  9.     2000 + sdatestructureget.Year,
    & h0 P; d/ I  Z# d% o5 v3 |
  10.     sdatestructureget.Month,/ ]/ D8 R) n1 L4 ~4 e& \' F
  11.     sdatestructureget.Date,
    : k5 p* e  |% f8 y5 J/ E9 T
  12.     sdatestructureget.WeekDay,7 Z) e1 L8 ^1 q8 [  k. q: L
  13.     stimestructureget.Hours,4 |" W7 z0 |5 y3 s
  14.     stimestructureget.Minutes,
    , @+ X& P/ O) R* A# n
  15.     stimestructureget.Seconds& y7 V. @4 O/ k: w# x
  16.     );/ ^; ?3 ]8 k: ^, F* W
  17. }
复制代码
5.jpg
$ x  U' J* b- p+ n6 x0 p
这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据

% H9 V7 J) G  [
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印
  1.     print_rtc_data();
    ) C6 }8 r$ `7 p1 t) ?8 _) [
  2.     HAL_Delay(1000);3 a) S8 r2 N" O" N  f* V
复制代码
6.jpg * L) O5 D1 o  W/ @# |- j
然后编译下载,效果如下
7.jpg ( |# g( x8 l9 s" @

$ H  a2 v( s: D) @, C- P6 x
然后我们来试一下重新设置年月日、时分秒、周几参数
写一个设置的函数
  1. void set_rtc_data()- R: Z) e$ y7 U$ G
  2. {% Q$ |4 Z- G; v( K
  3.   RTC_TimeTypeDef sTime = {0};* }  Q1 b0 b2 h- R' A
  4.   RTC_DateTypeDef sDate = {0};9 k# r7 z4 ?$ S6 `* {& A) X9 [

  5. - n6 o1 {, H* B* q! i% f+ i
  6. # W4 u3 N. m# S2 g- n
  7.   sTime.Hours = 21; /* 21点 */3 v- I* U6 N6 }) X9 z" i1 C! G
  8.   sTime.Minutes = 30; /* 30分 */0 p& i$ q9 B/ g9 e" V$ `: H
  9.   sTime.Seconds = 10; /* 10秒 */; r, h8 l6 a  v: B
  10.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
    % M+ V: n$ s; F1 y+ Z, W/ V
  11.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;  /* 和初始化时的值保持一致 */
    " v1 D& V: [) |1 G* Z
  12.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)8 o, H( o9 x3 E& F$ R* m) K
  13.   {9 s/ x* K4 ~1 [. P9 G8 \  v
  14.     Error_Handler();
    " M: g1 ?2 Y6 H, }2 }0 B
  15.   }
    0 r) q5 Q. p  u, N4 q
  16.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
    - c. w* B6 L7 K7 X; I/ v
  17.   sDate.Month = RTC_MONTH_MAY;  /* 5月 */
    7 I- x* r9 c$ `
  18.   sDate.Date = 23; /* 23日 */
    4 B3 R$ C7 ^% U+ d: t' C9 d
  19.   sDate.Year = 24;  /* 24年 */
    $ a/ Q1 r6 Q' B( I

  20. / H9 S1 G: ^. d  z, t& O6 N4 e
  21.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)0 n: w" f: {5 H3 p$ M* I9 C
  22.   {- c8 X# @1 V* F" J! z2 Z
  23.     Error_Handler();
    ! m- M5 \" [8 p) \
  24.   }
    ( k' b$ i% [! s! [: a
  25. }
复制代码
8.jpg
. @3 i. D, L  f$ H2 A# y
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值
  1.   uint8_t cnt = 0;
    / o, @, X0 r+ p1 O: c' D1 c
  2.   uint8_t flag = 0;) s9 T5 i+ T4 T4 {+ i5 y* W
复制代码
9.jpg # T; ^2 R5 k: r4 R* J
  1.     if (flag == 0)3 r( d1 s; [3 w
  2.     {
    1 p; ?' @! O! Y( J& b
  3.       if (cnt == 10)
    , a! M- S8 y* ?- Y
  4.       {- s7 l9 J: i. F2 }+ m4 u8 n& a" o' U. s
  5.         set_rtc_data();
    & j) m6 J. K% Z5 h) h8 z
  6.         flag = 1;( r3 |, p0 I8 R2 c) N
  7.       }% g5 N& t2 U8 j$ O8 O% `* E, a
  8.       else* v/ u; a, g2 Q
  9.       {
    - u" \# Y1 @7 A+ \7 F8 y
  10.         cnt++;
    4 T0 \' T1 g) ]: L6 v9 T) F
  11.       }
    8 G8 [& i' k$ B2 s
  12.     }
复制代码
10.jpg
- b# }8 z' k0 T0 s9 D
然后下载,运行结果如图
11.jpg
, K0 k; e" p+ S. y3 y! k1 M4 [
! F+ y+ r% G7 `4 T# u! k) h
本次测试的工程: 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 手机版