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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:
& g& ^$ N2 n$ O; G8 z: e! {* \  T
" [9 i" f/ t4 D
  1. #include <time.h>
复制代码

$ A. N; q' l& e% S8 [" n数据结构:
  1. struct tm {' R' M( e& `8 B3 B
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
    1 ^7 k. _& ^  [$ r7 L
  3.    int tm_min;         /* 分,范围从 0 到 59        */1 {& T8 b: e9 _7 U
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */6 \  M9 ^: i) k5 n/ _( T1 O; f
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
    + x( g/ U  {: M3 h1 K
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
    6 b. \' Z; m  S9 y4 ~" t
  7.    int tm_year;        /* 自 1900 年起的年数 */! u1 M8 m! x2 D: H
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */8 C/ S8 P! W# ?9 I- w  Z
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */. W( F, |) p  X. ?& _$ }
  10.    int tm_isdst;       /* 夏令时                */
    $ _0 G2 T  |3 K6 n  q. o
  11. };
复制代码

% v# @$ M& l. y+ n0 Q6 l; W
: u" s' p% H+ p  k8 O" P4 R3 o由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:
9 U! l% a5 F# L& K1 d0 c- V! i( E* T/ b2 Q1 [
  1. volatile uint32_t time_dat = 0;- \4 M9 l. W" g( ]$ l0 h0 A
  2. 8 J. Y! M: D' Q2 x
  3. void HAL_IncTick(void)
    : X  ^, n! p. w
  4. {
    6 m$ R4 `2 Z  B7 [, h3 N0 |! J
  5.     static uint32_t ticks = 0;
    2 V" A# w. G4 Z/ T% n
  6.     uwTick += uwTickFreq;: W/ X. D! j: b( |
  7.     ticks = (ticks + 1) % 1000;
    % K  {- P5 i+ J; R9 r* Z
  8.     if(!ticks)
    2 y  Y# b) M4 C0 d/ ?0 c( }& t# Q
  9.     {
    ) P, y* Z, v& l7 j1 v
  10.         time_dat++;
    # c  e5 d( {( @
  11.     }- N5 X6 `- W$ |1 p  o! q0 Q2 ?
  12. }
复制代码

7 ^9 R/ V' |' i' R2 m然后重新实现time()函数:9 F6 p. y' Q) v' J5 E
: A: t. N& Q: E7 o& y, q# t* x, x5 g
  1. time_t time (time_t *_timer)
      |/ J8 I; ~' ]" ?7 y% L
  2. {+ z7 Y, o% }- G9 O* A6 C
  3.     if(_timer != NULL)' ~% x  _# Y& `9 Z" ~1 J
  4.     {
    / W/ U* |/ n+ [& t; H& Z
  5.         time_dat = *_timer;$ |9 A* w& j6 P) c6 N
  6.     }
    ! l2 a2 I/ M& X6 G3 m7 |
  7.     return time_dat;$ z8 d5 o. t* p( K5 p
  8. }
复制代码

0 Z5 O3 H* A% K$ y* p. q) N% \示例使用代码:6 q+ N" h" c* J6 ]$ k

5 W/ i, x8 ~7 k! J5 }
  1.     time_t tim;
    . l0 Y4 ?+ y0 u( _
  2.     struct tm *ts;
    * _  P* h  \/ g: G1 Z
  3.     struct tm ctime;6 a9 [0 n2 K' p1 E" d3 X
  4. " w, ]! e! c+ X+ [' T& H: I
  5. . f# p, z# R1 X& {
  6.     // 转为秒数  C% n, p& X, J; j
  7.     ctime.tm_year = 2021 - 1900;
    8 H" R% e+ S0 Q- }! j9 y" l; n
  8.     ctime.tm_mon  = 12   - 1;
    ) Q' H2 q: E5 J/ {3 G0 m& ?
  9.     ctime.tm_mday = 30;
    7 p) |7 m$ O6 e
  10.     ctime.tm_hour = 10;; |1 X/ d0 ^1 n* V3 E! U( x
  11.     ctime.tm_min  = 24;( y( U1 Y% n" j2 i
  12.     ctime.tm_sec  = 51;  c0 K( q. W, @% V' T5 h0 g0 y
  13.     tim = mktime(&ctime);5 G' Q" A8 \! d  y% l

  14. * m, _" A5 W8 s& x0 u! Z5 ~
  15.     // 设置时间$ d+ C2 p# y/ f: r8 f" u, @
  16.     time(&tim);; P) V- H4 Q/ z5 l+ B# E- }% P; _& z
  17. 1 b  k% s. C0 Q; i' Z) ~4 R' l; l
  18.     // 获取秒数* ^) z- L/ `, n( S0 e  R$ @) C' h  Y
  19.     tim = time(NULL);
    , \# z: X! G* s* B
  20. 7 x4 z3 R& F! s. U+ I
  21.     // 转为本地时间
    5 [9 @3 _) C: J" s  h
  22.     ts = localtime(&tim);
    . G9 L, Y! S* T9 e3 S6 C

  23. " ?  G0 l: T$ H# a9 C) e9 {
  24.     // 打印9 Q) C: E+ S+ v. O
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    & k3 h# Y; j8 c- [) ~
  26. 0 x5 @  C, B% r* C
  27.            ts->tm_year + 1900,9 |/ J, x. e+ z3 i
  28.            ts->tm_mon  + 1,
    ! x  K5 A. {0 G' Q
  29.            ts->tm_mday,  Q% F/ l1 m. z# O4 ?
  30.            ts->tm_hour,# R) X: M6 Z  r) [
  31.            ts->tm_min,' Y7 U0 l5 |# |" A/ ~+ k
  32.            ts->tm_sec3 @" v1 @# }2 F9 H7 b( b1 `' D
  33. # p9 c+ M& M$ X0 }' E) t
  34.           );
    : _+ ?; x! e3 I- m
  35. + ^9 [) Z0 A( J1 e3 y
  36.     while (1)
      d3 w# X' t2 L7 Q2 @
  37.     {
    + h6 e8 p5 V% D' |* U0 S  [7 O; {
  38.         // 获取秒数! s- N* M( y; |
  39.         tim = time(NULL);
    3 W9 v3 B7 v* u# Q

  40. : Y$ \- \1 v8 E! t
  41.         // 转为本地时间7 g1 A3 ^# v* R3 P9 j0 [; X9 b
  42.         ts = localtime(&tim);8 K' c# {1 g7 Y1 u4 t+ s* Y: R, F" V

  43. 6 W, L( [" K! I3 G  ^: _
  44.         // 打印
      U6 t( g0 b2 ?8 g0 Z" n
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
      p0 L* [& r* {% o* d
  46. + T; R, I* T, E) h( D
  47.                ts->tm_year + 1900,
    ( e- v1 i4 K$ T8 [* |! m
  48.                ts->tm_mon  + 1,' H4 L9 D7 z6 g! h! ~! q- p
  49.                ts->tm_mday,
    6 X4 d" U# o9 e2 [$ T
  50.                ts->tm_hour,% {5 c3 R$ ^! |6 F0 @
  51.                ts->tm_min,) R7 r: L# j# K' ]$ `) \  \3 _
  52.                ts->tm_sec
    4 b' J$ W0 H+ U

  53. ; U1 T8 N; o* d0 F0 c0 k
  54.               );4 a3 o& A# S, l5 [' d3 T5 `
  55.         HAL_Delay(1000);) y$ e- z, p, e% N% {+ ]4 m
  56.     }
复制代码

3 a1 ~% D$ [" W+ t) W: }6 Y+ J3 l$ m0 o" n% Y+ d0 q5 J

0 Q+ e2 i$ w; e3 K6 G( F, Q1 Y
* ]5 X$ @) Y, W
收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似分享

官网相关资源

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