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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:6 \: Y4 X9 B5 M) E2 ?9 U7 J! `

2 q) o( @7 `! X( U# b( t9 L
  1. #include <time.h>
复制代码

! @: j  L- i& W: O# |% p3 ^数据结构:
  1. struct tm {" x8 y3 U9 K1 K
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */' S6 ^2 Y3 ]8 E: ^
  3.    int tm_min;         /* 分,范围从 0 到 59        */
    $ q5 N( t- k# v, l3 p& z
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */, c0 q7 W5 R8 V$ n( O/ U6 E
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
    5 @0 k+ |1 z# z) |1 w& r: F/ U2 Y; g
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
    6 B+ t& n# D% T5 k' U' P4 K, P
  7.    int tm_year;        /* 自 1900 年起的年数 */: G' w) m( B% i/ m3 w( c( E6 f+ l
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */- e- u" N4 k! p
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */7 u& m; K, B3 Q5 }4 P) j/ P
  10.    int tm_isdst;       /* 夏令时                */9 L8 B6 ~. s$ ]) W4 D) L
  11. };
复制代码
9 P8 L4 e. z0 z
" w% i" D5 e: N3 e& L
由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:% c& v3 |6 @- M- x- k

$ q& w! }5 ]( {+ F
  1. volatile uint32_t time_dat = 0;* r% Y3 I* C7 v0 W" T
  2. ; K8 E" a& y  ^- k' g- z
  3. void HAL_IncTick(void)5 V/ p  J% G( Q3 e2 E# d
  4. {
    ' n1 T: l8 }8 _
  5.     static uint32_t ticks = 0;+ c- y/ w# F) C$ w
  6.     uwTick += uwTickFreq;( N# w1 r. ^  T' ~; X5 k/ M" F. m4 U
  7.     ticks = (ticks + 1) % 1000;
    1 V. m, O$ V# W7 o, }
  8.     if(!ticks)
    ; k: j1 T* \% v. ~$ |6 ^9 H
  9.     {
    % V8 o2 |7 P; }8 A
  10.         time_dat++;
    3 R5 B/ m5 M8 B/ C" N! c5 R5 U: O) y2 i
  11.     }8 v/ p! ^5 y" g! M2 f+ l; @) `
  12. }
复制代码

, [3 v- q, |& {# u  M* l然后重新实现time()函数:4 J! w& |. P$ D, R+ ~1 }! `
) M+ Z0 a  F/ |
  1. time_t time (time_t *_timer)
    . _3 K$ }( m+ z' ]5 p- a
  2. {4 U, X% P; F. v1 u. i. n2 v
  3.     if(_timer != NULL)
    7 N4 y, w4 `' i# s; w, A
  4.     {
    & v5 H8 z( b) o7 Y! [6 i+ {7 j( [+ Q0 b* e
  5.         time_dat = *_timer;
    ; D( Q4 \7 A+ H' |; [
  6.     }
      Z1 ^  z/ y( w
  7.     return time_dat;
    + p* i* j# J. {; N; K
  8. }
复制代码

6 |) F. p7 b4 h: A' e# e示例使用代码:# R  ?7 r' D; w% Z2 M
9 _" p' Y( F# V) S
  1.     time_t tim;
    : M0 [' W7 D5 X
  2.     struct tm *ts;
    * S. M' e9 a$ `& ^( p& H5 Q
  3.     struct tm ctime;
    & H0 b6 ~8 x4 q6 c$ o
  4. 1 `2 `  q" W/ Z+ ~, ~* H( B2 \; c
  5. - p+ K9 Y& m$ |" ~
  6.     // 转为秒数
    # \* ]5 B" k( A  y$ s6 J4 W
  7.     ctime.tm_year = 2021 - 1900;
    7 N& v9 j/ W' F) B3 U
  8.     ctime.tm_mon  = 12   - 1;2 W: j# u% t; O4 Y0 |! _% k9 X
  9.     ctime.tm_mday = 30;
    7 U9 g" T. Q1 f+ f* c! W
  10.     ctime.tm_hour = 10;: Z  ^) p4 G- @5 R7 v+ d
  11.     ctime.tm_min  = 24;7 C3 U' e" Y! ]. O5 ~
  12.     ctime.tm_sec  = 51;
    + L' d- y9 w0 k- Q3 G
  13.     tim = mktime(&ctime);
    8 S* ]5 b& E) v5 V' h

  14. - N# p' `) T7 F. c- c7 ?& Q* M
  15.     // 设置时间
    ! h$ W" q! Z1 O2 g! s; s  S) s
  16.     time(&tim);" e0 L5 N- ~# }( W6 e

  17. * ~- f, u5 ]% b! S( ~% f+ V) c
  18.     // 获取秒数6 B+ O6 s4 l2 _+ y& E9 i
  19.     tim = time(NULL);
    * k2 I1 R9 Q- u' T- w$ R' I

  20. ( _6 r$ q$ P/ V6 @$ j( R) l- _
  21.     // 转为本地时间
    ! @3 I" s& l/ z3 L% m& T. f
  22.     ts = localtime(&tim);& [2 K1 u- T2 o9 |2 f9 i

  23. # g  {; q+ d' y( O% J0 _
  24.     // 打印
    + n& I# S' j! b  ^/ g8 I+ }7 \( F
  25.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",
    * c6 Z0 t" L4 \& w: x" F

  26. 7 w; g7 F7 ^5 }8 Y
  27.            ts->tm_year + 1900,9 A9 h) ~" b+ ~( }- I/ _  o
  28.            ts->tm_mon  + 1,
    " K: J3 t' r- s4 e
  29.            ts->tm_mday,
    6 u0 a  F8 U  {$ t% S9 ~
  30.            ts->tm_hour,
    1 r  N8 g. V7 u
  31.            ts->tm_min,# ~* _" t/ Z# {! w6 Y
  32.            ts->tm_sec
    5 ^$ G7 l1 G, {$ V& O! R! t" k! P

  33. , |6 n) A& U( Z) @1 k
  34.           );
    ! g6 V, d/ S  G5 m1 v
  35. 1 C5 \* D6 w; e; ?! V/ W
  36.     while (1)" I" ^$ D2 `# A" s! M
  37.     {
    $ j) w+ e; j8 ~( W. p
  38.         // 获取秒数( e, R. d6 Y6 z8 L6 Q9 m
  39.         tim = time(NULL);
    9 J; T; O$ q% z( e) g- k1 q: m) {+ B
  40. ! S8 t: U: l3 k
  41.         // 转为本地时间
    8 P; x6 E- e3 z0 b* ~. M
  42.         ts = localtime(&tim);
    , S" k+ [$ I0 v% T9 Z2 [

  43. 3 C  @* g0 j7 M) W: l9 @
  44.         // 打印  ], m/ P* V1 g& W: o$ W
  45.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",' A% {% [2 ]$ o; R7 E! J) y

  46. : i% y: h0 m3 @- N  w- ^
  47.                ts->tm_year + 1900,
    4 J$ Q+ \+ F9 {# n
  48.                ts->tm_mon  + 1,
    + B7 K- q6 D- g4 q/ U1 c# P6 _  ^
  49.                ts->tm_mday,/ a0 P8 \" q/ `' [1 R, U2 ~
  50.                ts->tm_hour,
    , V- R. j. L1 D  t9 r* J- z/ P
  51.                ts->tm_min,% E8 j1 _8 |( @+ D' k* {1 S' c) {
  52.                ts->tm_sec
    * o* \* m" p$ T- X

  53. 0 @2 j; ^! D/ @$ s7 |. u
  54.               );
    1 G; r2 s3 k3 Y! m) S' W
  55.         HAL_Delay(1000);1 Z, n7 J, y/ A3 Q/ }- Z
  56.     }
复制代码

3 E! `8 s3 V) D2 I+ H0 t- U: O
$ o' ~7 K3 n4 m5 ~' [# X% P
0 k$ z# ~' k% I8 U" }% L/ s1 b  J
收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

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