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

【经验分享】STM32利用HAL库实现标准库<time.h>的时间函数使用

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:
& G, ~9 f2 W8 ]9 u' A
" R- v8 `' [2 T- o1 T
  1. #include <time.h>
复制代码

' m. r' W3 @9 @7 u: l数据结构:
  1. struct tm {* F/ M; {1 l* ?* D$ [- Q2 Z# i
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
    0 x8 o) `0 j: j. N  m6 o  d5 d
  3.    int tm_min;         /* 分,范围从 0 到 59        */
    6 `" _: N: T. i7 A0 Y
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */
    7 @3 L% D( R* m0 U) i! l# G* e2 l$ G
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */7 d& l& |4 l) N5 u  F" F
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
    # O: M# T# N: }8 d  L0 I5 ?4 }
  7.    int tm_year;        /* 自 1900 年起的年数 */
    2 g& V4 u) K5 A# A' e# |: N
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */% y) s" p. N! ?4 J3 Z) f
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
    , S+ w! i1 G" I* z& U+ S! m) t2 T5 P
  10.    int tm_isdst;       /* 夏令时                */
    $ d- c; h- n+ L6 r# l0 z7 H6 t
  11. };
复制代码
) J1 B' a) H5 z0 e- l

5 ~$ [# P4 b2 B由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:
+ ]/ D% W) A  H. k  g2 ~* q3 O- i; s! a$ Q( C* N" ~  N
  1. volatile uint32_t time_dat = 0;
    * m& _6 k- y2 w* D5 j5 y. `
  2. : }$ j: h2 p- G; Q1 d& ~& D5 U
  3. void HAL_IncTick(void)/ r5 |: I) U" u4 \4 r' R0 T/ p* N
  4. {3 T" d1 ?# i, A8 e/ l  P5 `: t
  5.     static uint32_t ticks = 0;; h, R  ~4 x) F" l! ~
  6.     uwTick += uwTickFreq;5 p  D8 z- @8 I1 t0 j! K* Q
  7.     ticks = (ticks + 1) % 1000;/ f  |* ^# R3 S( ~
  8.     if(!ticks)
    * k5 g# j' o" x2 b* h* R, U4 c
  9.     {; o  m, |5 E$ @. ?# @
  10.         time_dat++;
    9 b5 }+ |+ o$ b# B8 l& E0 n
  11.     }' W5 c0 H9 |6 D& J1 V2 B" Z+ p
  12. }
复制代码

- J& b0 N# t% B3 z" J; o! [& A6 r然后重新实现time()函数:
, M0 P8 k: A# e( |0 d3 ?7 C' d' z! I, }' u8 y  J
  1. time_t time (time_t *_timer)
    9 q& y6 ~8 j5 ^' ~4 l- i( |# i
  2. {0 s- m# F* X) h9 t1 [% i2 ]$ y( J  a
  3.     if(_timer != NULL)/ r' j, s- w! U
  4.     {, Y" I# s' W7 |4 i
  5.         time_dat = *_timer;3 ?' W: ~5 L5 J. ^0 ~8 l, z$ G
  6.     }
    - Z3 x' K9 \: v
  7.     return time_dat;( ]6 {, V, _% A* A, @7 g
  8. }
复制代码

; m8 u0 f* D# @1 V7 p3 y示例使用代码:
0 k  U) v" ~0 [4 U, E% L& E. I* [+ y' `1 ^' y) _) x* Q$ Q
  1.     time_t tim;
    6 s1 X+ p$ Q; P% |/ v6 M
  2.     struct tm *ts;
    ! H$ F* `3 o+ f
  3.     struct tm ctime;0 N; N, Q1 \% J

  4. ! N8 Q* X: ~* J3 k2 u! n* B

  5. 0 {( s% k/ l! ^% K" o5 _; z4 @
  6.     // 转为秒数3 N. P5 L1 |7 L' g1 f
  7.     ctime.tm_year = 2021 - 1900;/ h; ~7 l, N2 m* I# D
  8.     ctime.tm_mon  = 12   - 1;
    - r3 I: X* N! }& J9 O, ?) U/ ?2 U3 O
  9.     ctime.tm_mday = 30;: V, O! p0 t0 w* `5 l- h' m
  10.     ctime.tm_hour = 10;& Q( x+ r6 g& ?7 `6 k* Y# J
  11.     ctime.tm_min  = 24;
    2 F1 z- E' k3 l
  12.     ctime.tm_sec  = 51;
    5 i" p  I( C: I3 [
  13.     tim = mktime(&ctime);0 }9 y8 V) q8 ^

  14. 7 w$ z! T: @& s$ M6 Y* k
  15.     // 设置时间5 F9 U/ i, B, N- J' }/ z4 x
  16.     time(&tim);
    9 i$ e, Z, a* Y3 q0 @% y; r

  17. ) `: N# O! s! Z' [9 f( J8 ~5 I
  18.     // 获取秒数3 b. @" y% k! h/ G+ r
  19.     tim = time(NULL);
    ! F9 P0 W! N$ s& s! N8 [: J3 P
  20. $ Y5 ~+ F4 x7 i6 D. p1 v' M
  21.     // 转为本地时间8 [9 D* X9 E: r8 v3 A
  22.     ts = localtime(&tim);
    - s  \- B& g/ i, m( z$ k8 Q' ~
  23. 1 y* _% E# F, s
  24.     // 打印# ^9 h8 M  M: L
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    - I/ K# X% c' v& f/ c1 F/ v

  26. ) _  ^$ T* r' N
  27.            ts->tm_year + 1900,# V/ J# u! i1 p  B4 i6 n" x3 X
  28.            ts->tm_mon  + 1,
    7 }1 z7 x6 y  i- E
  29.            ts->tm_mday,; r. L8 n5 V- n& D- ?' _& g
  30.            ts->tm_hour,6 V* C# O% l, o/ N4 ?
  31.            ts->tm_min,2 s0 p6 U: c. B6 f1 C: m
  32.            ts->tm_sec6 `# f% d4 T& I- ^" g
  33. , f/ v: Q" H0 [% V, u5 A
  34.           );) g, B; U, N  b$ P
  35. " {7 P' [( K. x. o' C- B
  36.     while (1)
    7 `- s$ x  a6 X( Z) Z  M. s* s9 `
  37.     {6 G* h% ]8 A' I- k# ~; h  Y
  38.         // 获取秒数4 q2 L6 Z$ F3 U% o) {3 u2 E
  39.         tim = time(NULL);2 L! z4 k1 x# B
  40. 4 N& V; }5 H( m* J6 x/ V4 c
  41.         // 转为本地时间4 [# R4 l0 k) |* R
  42.         ts = localtime(&tim);6 u; ^% N' ]& _$ |; Z
  43. 3 V/ Y# F9 C2 ?0 J
  44.         // 打印
    ( Z/ N: O1 N2 B  m. l
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    ) }) P5 P# W$ x( f% I0 T: b9 j

  46. 2 a6 \7 C+ V; O; a
  47.                ts->tm_year + 1900,& {8 M* v0 J9 I% W# t0 P
  48.                ts->tm_mon  + 1,$ h, n, M3 ?2 w( E/ c! z( U7 |
  49.                ts->tm_mday," z# p6 |  O1 b- J/ B: e" H0 J
  50.                ts->tm_hour,
    , j, U8 n  i2 t( a# U) H9 F  n' O
  51.                ts->tm_min,
    $ H" I/ X  x' C: p4 p
  52.                ts->tm_sec
    : m  S; Y2 v' v% |9 y% A$ U

  53. 7 P8 y* r3 ]( I" l
  54.               );
    ! r  X& l( e$ z. R2 ?" K' L+ r
  55.         HAL_Delay(1000);. Z/ T" p" p) J; E6 n
  56.     }
复制代码
; ?4 t. f& |- e2 `* S, ^+ E% v' Y7 o
4 G% m7 Q6 r  W! ~. u% w* y
& M8 q' l) x1 c) x$ A

( k. h3 ^4 ]0 I+ c
赞 收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版