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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:  J! n$ W" @, i3 r- n& R& d

4 ?$ H$ D0 p) w* [+ I( k$ _
  1. #include <time.h>
复制代码

9 h* ?' }% R6 c( G7 N数据结构:
  1. struct tm {
    - o: M  _5 y0 e( a, }& V& P/ Z& p
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */6 g  v: M4 q% r2 \0 k
  3.    int tm_min;         /* 分,范围从 0 到 59        */1 n& \1 M) S* y
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */) R/ D  Z8 P" M  h3 E
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */- s. C. P2 O- k, B3 \
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  *// q( n5 [+ c% ?' e6 v' D* @3 |
  7.    int tm_year;        /* 自 1900 年起的年数 */+ g6 |: ^! ?- s+ k3 R6 Z5 ?# ^: \
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */
    9 A. `0 X# v# A7 p5 X7 z1 C% X+ C* P
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
    5 z- p1 R" {) {5 z- w4 z$ m% r
  10.    int tm_isdst;       /* 夏令时                */1 h1 Y+ M4 k6 K
  11. };
复制代码
% X& [2 p: A* Z$ @( E

* t9 q9 }; `8 P由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:1 e4 l' x. p7 g& u+ _+ G

1 h$ v3 {& {2 Q! r  f, Z# l
  1. volatile uint32_t time_dat = 0;
    + K: C$ T6 ?) F6 G4 e; r
  2. , g+ F, B% X3 c* n) B! P
  3. void HAL_IncTick(void)
    ) G% `  d8 N9 X* \
  4. {( Q2 V2 }6 J' _% B: k: l
  5.     static uint32_t ticks = 0;
    : _9 ~: _1 @! u
  6.     uwTick += uwTickFreq;% s6 M; l$ v$ I1 k& ?
  7.     ticks = (ticks + 1) % 1000;
    ( {3 T, F: f! \& s% N
  8.     if(!ticks)
    ) o+ I  m( q; Z+ v( K4 f
  9.     {- y; B: c3 h1 Z  t
  10.         time_dat++;- d- Z8 N9 |8 ]9 R
  11.     }, I/ Q5 s: z+ M" V: |$ s3 m- M* Q
  12. }
复制代码

2 Q/ [& D; C' X然后重新实现time()函数:' x0 |2 s# j* n: {+ N

, d! B4 T$ L0 [5 c9 i$ A2 h
  1. time_t time (time_t *_timer)4 e: V% ^" k3 V+ t0 v6 A' T7 }, l
  2. {
      w' g' @' M1 b
  3.     if(_timer != NULL)7 U9 l9 f/ _0 |
  4.     {
    9 c. R8 x& U& y' F; U" d: a- T
  5.         time_dat = *_timer;
    + @. y- v& E6 J6 ]  y# G; m
  6.     }% J! l. C- J& Z
  7.     return time_dat;
    8 v! E: \& w8 \
  8. }
复制代码
! G/ V8 o9 M, \7 G+ d" V
示例使用代码:
3 n- {/ {! a' n2 r1 Y7 H" b6 P* {$ f- m+ o7 o# Q1 O: b, D
  1.     time_t tim;, S+ @7 N7 X, d' C+ |7 Z! X) _
  2.     struct tm *ts;  c- t7 C2 R9 a7 u
  3.     struct tm ctime;
    ; U: Z6 w4 _) N
  4. / L; d/ O% w! b( V
  5. 1 S1 c' f( D+ w- m0 b$ x4 V
  6.     // 转为秒数$ \- W; w* |9 o( v& ]* `
  7.     ctime.tm_year = 2021 - 1900;
    4 z0 @3 y( ~# H4 E1 U
  8.     ctime.tm_mon  = 12   - 1;' W) ]8 m6 F: Y
  9.     ctime.tm_mday = 30;* E/ ^: R, t0 j1 X9 ?( ]; c6 P9 \
  10.     ctime.tm_hour = 10;
    , K5 _' Q6 h8 G. \7 y
  11.     ctime.tm_min  = 24;" E4 ~+ B( {  ]# g  k; f* ?
  12.     ctime.tm_sec  = 51;
    " x8 ?( U, ^. p6 n" u* w% D) Q
  13.     tim = mktime(&ctime);
    + T6 L% [5 g% m. q

  14. ' a3 M7 t3 X- c5 |* [
  15.     // 设置时间
    * X) K: y; ^$ A+ a
  16.     time(&tim);# ?& N9 N% d, Q" [" J; V0 v$ g$ z
  17. 7 ^3 {' X" x# O6 A1 n
  18.     // 获取秒数
    7 l6 D3 V9 _, ]  A* R' [
  19.     tim = time(NULL);
    3 C) e, `0 S' r$ ^2 x* C
  20. & w, ?+ Y( G3 S# W
  21.     // 转为本地时间  ?) ^; a. z! @
  22.     ts = localtime(&tim);3 X. b( l6 a. K4 H6 @3 O9 y& H
  23. 4 I! u% D. V; F8 P) ]0 w0 W
  24.     // 打印9 f+ Z6 U! r/ |7 Y5 |9 v: z
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    " Z- M. i/ K( O/ Q" P/ g

  26. 6 G* h! K9 z# D( \
  27.            ts->tm_year + 1900,9 A2 y% b$ P* b% g+ X3 q
  28.            ts->tm_mon  + 1,1 `4 ~8 V2 ]0 N, V# R) m+ L3 p4 v: |
  29.            ts->tm_mday,/ `& O0 m0 y" h9 i1 t
  30.            ts->tm_hour,
    # K4 z' \$ e  u( E, Q* O
  31.            ts->tm_min,6 f2 k3 g4 F: t. V9 }( p
  32.            ts->tm_sec
    , B" d8 ]$ k! ^$ u' E& Y
  33. ! _8 L: Z) }1 \9 y1 L* T
  34.           );
    / I$ A' }' K" i, d

  35. ( d. u' T3 P5 r. e' |8 \) r" p
  36.     while (1)
    4 l, A/ D3 L2 [/ z3 z( }
  37.     {
    % `% {* `4 M2 _# F# S
  38.         // 获取秒数
    # K- i5 L4 N! H& d0 m" @) q
  39.         tim = time(NULL);1 U6 Y3 @, c# W& g$ ]' P

  40. - i, O% h) A$ b1 t+ Q9 G
  41.         // 转为本地时间$ H) y, V0 y& b- f' v7 V
  42.         ts = localtime(&tim);
    * ?  j4 c8 b7 @( L4 A
  43. 4 l7 {  P3 P; @
  44.         // 打印
    / n# w1 M3 l( D1 S2 {" e
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",& }: }. |( c! f' ~$ E2 U  n

  46. ( ~1 v& q8 a3 _( N, z1 J
  47.                ts->tm_year + 1900,: h) w. B' [% e# n' M5 c% P
  48.                ts->tm_mon  + 1,, t& |7 O* M) z( N7 u
  49.                ts->tm_mday,
    5 N% `  G+ F1 [4 }3 P
  50.                ts->tm_hour,$ t9 C( G: L! E7 Y7 z- R% a8 S
  51.                ts->tm_min,3 _6 r/ Q3 B* H2 V4 r6 C5 A
  52.                ts->tm_sec
    : q/ m) A1 _# e1 Q; D( J

  53. ! @% Y4 ~- ]3 \$ U* d% V( {; L
  54.               );$ a+ H' S6 y. {
  55.         HAL_Delay(1000);  C; K: [- Z0 c/ J4 ?7 h  |' C
  56.     }
复制代码
/ v+ ~! [: `: V0 U& }9 y5 L/ y

! ^! [& O6 h9 x/ y  d# M3 w8 [
: \0 e9 G2 {3 U1 @
( x0 X' w; h" E
赞 收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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