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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:
  Y  q- w9 O5 M( m
! G9 ]2 v$ A* |4 O3 e, G
  1. #include <time.h>
复制代码

, f- E$ K: M/ b. _; O4 P3 l3 |数据结构:
  1. struct tm {1 n1 S. h# l0 M
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
    ; n5 C% H' O& [; k; ^* m! u1 e. ]
  3.    int tm_min;         /* 分,范围从 0 到 59        */
    ' ]" |9 n  W; A: y0 S: d5 g1 e8 a
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */9 P0 h# Y+ G. s
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
    6 z" V0 `$ v' T% b$ y8 y' T( K
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */  f" U) a$ W0 i3 o' }+ u. Y! E
  7.    int tm_year;        /* 自 1900 年起的年数 */
    . b- U+ `4 K) U7 p. @
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */9 X- H1 H  N5 d( v
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
    ' q, d8 B- t' q
  10.    int tm_isdst;       /* 夏令时                */
    , _* S( t; |/ H0 v/ Y
  11. };
复制代码
( ~8 l3 R, c. W: R8 t/ g' \' A+ x: {
# e$ V' c8 o# n+ l8 z6 k
由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:# k0 j! I8 Z5 B
& q8 e6 V) i' l" N. [1 ^' U
  1. volatile uint32_t time_dat = 0;
    - H$ i3 I- _1 e  d. a" z7 e4 Q
  2. 8 |5 e% I4 B9 {8 h3 n+ H% S
  3. void HAL_IncTick(void)5 U7 {% F9 _0 Z- f+ H
  4. {- U9 w( {+ f! E6 ~, t0 g! ]  J* Q7 \
  5.     static uint32_t ticks = 0;- j6 ?: Z1 u6 }
  6.     uwTick += uwTickFreq;" ^& w4 r6 Y/ _4 _
  7.     ticks = (ticks + 1) % 1000;
    9 M4 `8 j3 f" y3 J( C% V! U
  8.     if(!ticks)$ U* [3 ~0 C- c- p; r
  9.     {
    9 t9 Z  t. ^- ^; ]& ^* e
  10.         time_dat++;
    1 O2 E* j: j+ \0 G
  11.     }
    3 f3 _7 }  ?0 A% G* T
  12. }
复制代码

6 }# @7 ~% ~9 H( p% \# V% x* i然后重新实现time()函数:9 K$ w6 G, r: J" v! G. S

) t- @; K2 S. L0 ~0 H: b
  1. time_t time (time_t *_timer)
    ! ^+ R% N* i' U8 p$ _2 Q& k* m8 J
  2. {* h) h! y- z' o( ]* t3 ?% k( [% d; R
  3.     if(_timer != NULL)
    , I: |& {% P& u. b
  4.     {
    . h2 t! ^& u8 m. a$ V  a. |1 ]
  5.         time_dat = *_timer;
    ; `# \' M  V4 h8 e8 v
  6.     }
    9 l$ y1 r8 z: r' ?9 T
  7.     return time_dat;
    # w4 F: l3 V0 J8 }9 y6 U1 D
  8. }
复制代码
6 [9 x; y1 x) ^+ T
示例使用代码:
/ f" s+ `) }7 R/ H( ^/ k
# G8 z4 V5 ?+ m0 s
  1.     time_t tim;
    - x* j* C) A$ k, ^' e4 a
  2.     struct tm *ts;' k; x- n" `6 r- J
  3.     struct tm ctime;
    % F" j- c& t4 m8 O2 y0 G$ K

  4. & @; S/ t4 N/ M4 z
  5. 3 O1 _" [1 G9 N* y
  6.     // 转为秒数) H- h7 p9 i8 w! `) x& f  }
  7.     ctime.tm_year = 2021 - 1900;
    ; T5 Z0 i3 V7 }; ~1 w
  8.     ctime.tm_mon  = 12   - 1;! ~) Y" K" m5 ]& s) \" O4 x
  9.     ctime.tm_mday = 30;/ c* P+ e% @* _4 I" C8 y
  10.     ctime.tm_hour = 10;
    " s  m, V! L$ {: F3 Q  o) y2 {
  11.     ctime.tm_min  = 24;
    - ^5 ^  l0 z; Y/ \7 Q
  12.     ctime.tm_sec  = 51;
    7 l" w7 u4 a0 M, T
  13.     tim = mktime(&ctime);
    6 L1 A0 j7 L- p2 T0 e8 H4 h

  14. + o6 O& g/ {8 i6 U8 g4 y
  15.     // 设置时间
    5 \6 e4 S7 B5 C: }! l. N
  16.     time(&tim);
    % D0 h- c7 A4 p

  17. . D7 g8 n! n3 W
  18.     // 获取秒数9 d+ T+ O7 \4 T% H1 s' ~
  19.     tim = time(NULL);
    $ U# ]  d# y5 y2 z( p
  20. + K* I1 Q4 ^0 v+ b$ c5 N+ d( P8 F
  21.     // 转为本地时间
    % P# U. p* u  U0 G) D2 ^( n: Y
  22.     ts = localtime(&tim);
    % F! t* w/ J! k$ ^$ x; H' c8 [  S! s
  23. # H/ P* e( b! L6 T  Y
  24.     // 打印
    + W1 O6 \2 s9 ~4 X" `9 P6 }
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    8 F' b  Y& w! j1 D+ Q
  26. " _: y  ?. ]9 l
  27.            ts->tm_year + 1900,
    - C! I; n; d0 d/ }& v8 w% D" r+ }" q3 N
  28.            ts->tm_mon  + 1,9 F! b8 ]* O) i) O' J# o
  29.            ts->tm_mday,, B% z, v0 G# B  o6 X' U
  30.            ts->tm_hour,
    ' Z3 b7 I' a+ k9 O$ b+ t
  31.            ts->tm_min,/ M' T/ s* v( X% a3 B1 a
  32.            ts->tm_sec
    : T0 n2 G8 x' L% R& @% p: W: S

  33. " P! G  E6 K5 `- H: t
  34.           );7 i" _3 {% p' F, h! N5 L- X* i. D4 d

  35. & S9 a; W3 E$ c- i$ k; E; B0 t
  36.     while (1)' m2 e; @" u# o5 J
  37.     {8 B7 j) B  C- O% [# f; a
  38.         // 获取秒数
    5 ^7 _5 S! u# O0 O" [6 A0 q, S4 M
  39.         tim = time(NULL);8 t; q- O! \) @0 X( {. S
  40. # t9 a% c8 a0 }0 k/ D3 ]: r
  41.         // 转为本地时间
    * B+ h  d; _& g* P% J9 K2 z' x
  42.         ts = localtime(&tim);
    . ]3 n. C& W, K& O  \* w5 j: G

  43. 0 l! ~6 m; B! W( l
  44.         // 打印
      v; Q1 x- ^& ?4 ^: c* Q& @
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    1 E3 I1 q2 N6 H* W0 t! L
  46. 2 X, \; `) n0 e1 P( ^5 Z5 Z
  47.                ts->tm_year + 1900,$ T; S6 \. U2 @& M
  48.                ts->tm_mon  + 1,0 u* P& L7 @# U* W9 T6 p
  49.                ts->tm_mday,4 S0 c/ D; Q6 b* \5 f
  50.                ts->tm_hour,
    ; `3 W  v0 E% `3 @, |" v
  51.                ts->tm_min,
    , N  z) u1 ?$ Q9 \8 i3 z
  52.                ts->tm_sec
    ' F' D' U; ?/ c" Z# r2 W9 H

  53. 1 m0 n0 w2 t. w4 n; f( }
  54.               );
    " O3 F8 R9 H2 g3 z
  55.         HAL_Delay(1000);
    5 l5 @# z: d4 @  |$ N
  56.     }
复制代码

* h4 |' F: o- `' a* u, D. k# @$ e3 U- L9 Y. s1 {5 h+ I
; p/ [, ?2 O- t6 ]9 {1 C
" p' E+ j3 E& W1 G3 n
收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似分享

官网相关资源

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