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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:
/ p; A6 J3 r8 L, `/ q+ V2 v. u, L& q+ d6 Q+ S% J$ h6 e
  1. #include <time.h>
复制代码
! d6 ^3 {8 K" S( ~% E* H
数据结构:
  1. struct tm {' D: U& }2 F2 h0 ^! D' o
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
    3 g. [& b, s* e
  3.    int tm_min;         /* 分,范围从 0 到 59        */4 F" o, ]6 y  B3 _' x/ Q
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */
    ! q$ _* C  Q* B$ C7 T4 A0 U
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */7 G2 d6 s! x& v* W) h
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
    + f: v# }1 c$ l0 J1 u
  7.    int tm_year;        /* 自 1900 年起的年数 */
    , X4 ?: v$ c& p0 c+ ?6 X
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */# |# e9 r2 [2 S% }8 a6 ^
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
    + v2 }4 T3 b9 a% h
  10.    int tm_isdst;       /* 夏令时                */
    ! x5 o  L0 A5 ?; c+ `
  11. };
复制代码

& }3 X3 G" b: ?( M
" Y1 n6 |! d, E, Y: T由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:
" @6 u/ l$ }8 }: \: p6 }  P- g
  1. volatile uint32_t time_dat = 0;. \3 K& J0 y1 I1 K
  2. 2 W9 s7 u- a% s2 p+ ~2 C8 b( E! t
  3. void HAL_IncTick(void)
    ' I& [' P: v/ ?5 b! ?
  4. {
    4 @$ x& f& W# ^& p4 ]3 T
  5.     static uint32_t ticks = 0;3 n; s# q/ b; J: C+ ?: J: d
  6.     uwTick += uwTickFreq;+ I6 }+ ~/ O! b# T" w
  7.     ticks = (ticks + 1) % 1000;
    4 v1 s5 u1 b) J. X/ ]4 g& S/ G. f
  8.     if(!ticks)
    3 G$ t7 L/ m( K# X1 {% A1 X, H
  9.     {6 G$ a0 m- o6 A+ @+ w
  10.         time_dat++;7 W8 w; _9 S4 l5 f
  11.     }
    7 r9 L% ?- {5 r: {3 Y: v$ g1 c
  12. }
复制代码
$ ^+ |9 u: W. A2 e2 G1 y+ r
然后重新实现time()函数:; `' ~  B- F' \
$ f. a( B; _4 }8 p# x3 |4 R. D
  1. time_t time (time_t *_timer)% H' H9 k8 W$ [: j+ P1 C
  2. {7 o# a  [( h  N$ T* B  R
  3.     if(_timer != NULL)% A+ z* L9 W& f  v: H) q4 x
  4.     {
    ; D4 P' g' N* k
  5.         time_dat = *_timer;% I6 i1 x( W0 V. j2 ~5 c) n9 `
  6.     }
    ' N6 _* V) m4 S7 O. L/ v
  7.     return time_dat;
    ) _, e8 w- @1 v( T  N) V
  8. }
复制代码

; O. R  a+ Q. \$ p) S示例使用代码:
' Y6 x% ]$ O* |, I) S3 X' p. \% f% {" c
  1.     time_t tim;1 b1 ^' j' p3 d% C
  2.     struct tm *ts;0 @& y+ F8 b$ _, I
  3.     struct tm ctime;
    - {* G! x, j  A! s; f. \
  4. ) T6 a; |6 B5 x! ]/ j
  5. + Z/ q) h* k" i
  6.     // 转为秒数
    ; }, r7 f. \& N: S$ T
  7.     ctime.tm_year = 2021 - 1900;* h1 f: j+ J8 z. B
  8.     ctime.tm_mon  = 12   - 1;( J& v+ [; v0 @! t
  9.     ctime.tm_mday = 30;
    " |+ \0 X9 W) a0 H6 @( h
  10.     ctime.tm_hour = 10;9 f- E  M9 F& @
  11.     ctime.tm_min  = 24;
    8 `+ s5 h$ |* ]/ x# r* R/ ^' R
  12.     ctime.tm_sec  = 51;/ c# z' {+ f* P9 X9 F
  13.     tim = mktime(&ctime);3 U" T# D5 V: c' j) W6 C* x

  14. . P3 f7 S+ s  `/ R
  15.     // 设置时间. j9 q- x8 O2 B( w0 B" B, k- p
  16.     time(&tim);
    6 n- x+ Y* T& H
  17. . U% `. g1 M6 S% U. M
  18.     // 获取秒数
    : I; O/ ]/ h* Z
  19.     tim = time(NULL);! ]9 p3 H3 V' U& |, F6 y

  20. 0 P  E* F; m: J. X
  21.     // 转为本地时间
    7 N2 q" {1 I& y2 G8 \
  22.     ts = localtime(&tim);+ v" g: C! Y6 V% V7 }

  23. 4 E# J& F0 ~+ X
  24.     // 打印7 J1 `! ]. }" S( ?- G
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",$ h) f1 w" N0 r
  26. ( U" U( t/ J: a6 d! g
  27.            ts->tm_year + 1900,  @, t. ^  z$ o( K
  28.            ts->tm_mon  + 1,
    ! U) w5 `9 g9 Q$ W( ^+ |
  29.            ts->tm_mday,
    9 s) X# w" O# K# @% ~# ^5 d/ B
  30.            ts->tm_hour,
    % z9 L! E  R$ `! d4 J+ W
  31.            ts->tm_min,& ^" R1 R: W/ R/ s7 R# n
  32.            ts->tm_sec5 t$ |2 D, _4 }6 o

  33. 3 U  z% a( r& r4 z  N
  34.           );
    5 P' i2 L5 t- ?1 ^2 _' |
  35. 4 U% h- g- n) X7 |, Q% t
  36.     while (1)
    8 K# Q% A  N9 u# D; B; W
  37.     {
    $ n9 j  z/ `% x4 ]* s
  38.         // 获取秒数/ x+ q/ ~. y: U. m: f' }; S# j
  39.         tim = time(NULL);
    - v' ?+ G( Q( t/ a- N. [
  40. 0 X: |. h1 ]6 e3 s, `
  41.         // 转为本地时间
    ( ~# y. f3 o1 J6 n6 M
  42.         ts = localtime(&tim);+ y3 j- U2 I* B/ M0 o% ]% {3 o

  43.   x' A% m# S/ |$ |
  44.         // 打印
    1 G: Q  k% u/ {; q! t( O
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",8 \$ S' I  H& {: D0 R" a4 @

  46. + Z  U! B( M& J+ Y
  47.                ts->tm_year + 1900,
    ' X" t& f8 k; O% n  x6 T
  48.                ts->tm_mon  + 1,& I- r- C) J* M7 A
  49.                ts->tm_mday,
    . e, B4 f  u+ j5 V0 w
  50.                ts->tm_hour,
    - l1 ~# F# ~/ ~  J1 M& E) v
  51.                ts->tm_min,% I) s. w" P$ T, ]6 H
  52.                ts->tm_sec
    : d+ t2 z& _& D9 L0 G7 F  R+ G

  53. 7 z2 V1 E  W# K# X
  54.               );' N5 ]- U/ |1 x3 m9 F3 R( [- F
  55.         HAL_Delay(1000);
    3 J/ `$ h1 o2 z
  56.     }
复制代码

$ B. B! q; O4 Z
6 v! Q) k9 F4 l; }! O8 o- s
$ }( s3 M3 t7 Z9 o. ]- \# v9 t% F/ M% o) M" o+ Z
收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似分享

官网相关资源

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