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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:
/ c$ I) Y- w/ ?7 N4 j. z
% @& r& I5 q; ?" [" @3 P
  1. #include <time.h>
复制代码
' X+ T- }5 k0 c
数据结构:
  1. struct tm {- {$ M6 v* l) U
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
    * z. o' W$ R& q* ?
  3.    int tm_min;         /* 分,范围从 0 到 59        */
    1 e, ~$ r7 c& g$ U) h% K+ C% N
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */4 Y& I* L6 G( F4 t
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */) t) d4 Y6 e- H9 n
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
    - m+ r# a" @* {) |
  7.    int tm_year;        /* 自 1900 年起的年数 *// K& K  ^4 c' Z6 \, D. F" Q
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */
    5 a- A  N+ m+ z4 F2 I" ]
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */" L, \8 r( s# ?, J  \' R
  10.    int tm_isdst;       /* 夏令时                */
    8 M, ?* H: P- U+ A' p2 h$ ~
  11. };
复制代码
2 v; D/ N/ h; L6 O1 Z% j

9 I, \* |4 i4 ?由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:
! J: R+ q* s$ q1 [. Y: `4 m" g1 U* k8 y: C/ M* G
  1. volatile uint32_t time_dat = 0;  X. }# }7 a7 m% h$ C% s$ j

  2. : f+ p) X* v2 P; I2 b# C- ~& k* Y# y
  3. void HAL_IncTick(void)6 y- c4 |8 {, H* j! \
  4. {9 O: t  b  h% `! e
  5.     static uint32_t ticks = 0;* {* a3 C/ ~# E4 w/ d
  6.     uwTick += uwTickFreq;' l' e3 k, u  z6 c$ {3 m; y
  7.     ticks = (ticks + 1) % 1000;( ~! `% ^& o, }% Y7 n1 _
  8.     if(!ticks)( d$ s- T9 ^7 o# {, D
  9.     {9 g; a" B& B( V4 y% X1 U: h9 ?
  10.         time_dat++;5 I4 j+ Z+ V  Z$ L
  11.     }0 `1 f' M- H1 R8 e- J1 J
  12. }
复制代码

$ |7 d9 O$ h# q然后重新实现time()函数:* A9 W5 F/ S: g7 ~; \- ~
, _. n. Z, O: F. a$ J
  1. time_t time (time_t *_timer)! d+ m$ P5 a# [; t, V+ P3 Q4 N: a
  2. {
    6 Y' T1 \5 V/ I, t9 L
  3.     if(_timer != NULL)8 f9 V8 \# ~) H, X* n% u
  4.     {+ t! q- I. l8 P9 i, T9 P
  5.         time_dat = *_timer;
    ! v: H1 L$ t, |& ~9 B
  6.     }7 O; _! w4 C" Q2 t2 t3 K$ `) h+ I' {
  7.     return time_dat;
    : g$ v4 x+ p& N) C
  8. }
复制代码
% R/ ^  i9 x# a8 t. Y
示例使用代码:
) K7 M& ]1 l# P2 ?8 Y& |+ v5 F3 N- [: z! P" v1 A& n; i
  1.     time_t tim;
    * @- j  c, ~& T( {0 [' a; Q
  2.     struct tm *ts;
    9 ?9 T, K0 V/ _. f0 T, o; g2 T
  3.     struct tm ctime;1 m' c* p8 g7 y7 j, H" S& X% o& q
  4. " M% M. O0 ^1 z. I8 Z- ]

  5. # p6 E5 E7 V6 c# }6 Y* c8 K% U# U4 f2 J7 n
  6.     // 转为秒数
    3 Y/ \% v: N3 U2 s+ d3 w
  7.     ctime.tm_year = 2021 - 1900;6 V# j9 P; l, g1 c) N
  8.     ctime.tm_mon  = 12   - 1;
    ; e" z7 X9 a/ W* f" I
  9.     ctime.tm_mday = 30;
    " |2 R: c5 }7 U2 m* `" ^
  10.     ctime.tm_hour = 10;( b4 z/ v" G! ~0 C
  11.     ctime.tm_min  = 24;
      k, W) I% V  `! l  }
  12.     ctime.tm_sec  = 51;$ c; O) C* I5 v: w% V
  13.     tim = mktime(&ctime);8 y. V- Z6 ~* K  m
  14. ; r/ T& ]" C0 Z+ M0 f& I
  15.     // 设置时间5 O' I# L, w0 F9 y( W
  16.     time(&tim);
    : \: A: G! b; w* Z  t3 u

  17. * K) S7 s3 L  t$ z+ G! d
  18.     // 获取秒数
    ( ?! T% A1 q5 ], i7 I% Y
  19.     tim = time(NULL);- \- _6 ?7 n- x1 R: D/ }

  20. * c; u4 l8 ^) U! `% k
  21.     // 转为本地时间; I: v, y# j. R& B  y
  22.     ts = localtime(&tim);
    4 l, w9 v  U2 |: O. v0 l

  23. 7 }+ b# c- [2 n% I. u3 @' |
  24.     // 打印' m$ O! i: K8 H0 q6 s) B* U  V2 n7 d
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",: a+ t6 P$ r: y+ @8 y" }. H

  26. ! v' r0 j4 B: {. h
  27.            ts->tm_year + 1900,0 o: u/ }& z9 R; Z
  28.            ts->tm_mon  + 1,
    6 f/ ~3 J3 n  {: X
  29.            ts->tm_mday,
    3 P! j- M' K" D1 m5 q
  30.            ts->tm_hour,+ a: B- c7 B$ y/ Y6 [7 R3 J
  31.            ts->tm_min,
    1 {* J* K  t3 I; j( |0 _3 _, V$ e
  32.            ts->tm_sec/ _- _: L, J6 W# G$ f

  33. 4 z! p( b  ~* k- B3 V5 X( J( Q
  34.           );, |! F9 d& x. a7 q. @
  35. 0 `' u: t" R2 K8 o7 W: R, ?2 X
  36.     while (1)3 W7 C; |6 ]7 v8 D5 }: G
  37.     {
    . G/ _  ]3 U# k
  38.         // 获取秒数) U  l7 h# p1 x% w9 F7 O0 ?
  39.         tim = time(NULL);
    6 {) y  X7 a5 d+ w# B/ d# w

  40. $ B- \2 D: C( I
  41.         // 转为本地时间
    6 b% ~" k$ Z! X  z  F
  42.         ts = localtime(&tim);( L# [6 L2 f4 y, q( L# j
  43. - J+ w+ j) P9 o
  44.         // 打印
    5 c6 h3 q  `; d, y0 g7 R
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
      s: F$ x) x* b- S! O( e% u2 e
  46. " q% T/ e- t; _
  47.                ts->tm_year + 1900,
    : v  R6 [7 c" H3 [0 v
  48.                ts->tm_mon  + 1,
    ! e' G$ S/ X, X
  49.                ts->tm_mday,
    5 J. x" ^* x7 e' h7 N; A1 @1 a
  50.                ts->tm_hour,4 Z* Z, B' l2 i( C0 ~. d3 w
  51.                ts->tm_min,
    " B$ b! f, I+ v9 L+ Q, e
  52.                ts->tm_sec
    ( `) E  P7 @# k, H- y3 R
  53. 2 v- @1 Y. x! \. \
  54.               );
    - S+ Q8 g: I0 b" K6 b
  55.         HAL_Delay(1000);
    8 v0 t% N- Z6 F$ F, w8 {4 o
  56.     }
复制代码
8 A) [7 J: A0 o6 r4 x  T
- s. Z* O5 r6 \5 |& }
2 r! r6 I$ s1 ?) K0 D$ S6 _
0 R* Z+ g6 ]0 K9 u) V& e- J
收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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