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

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

[复制链接]
STMCU小助手 发布时间:2022-4-8 23:36
C标准时间函数库头文件:

  1. #include <time.h>
复制代码

数据结构:
  1. struct tm {
  2.    int tm_sec;         /* 秒,范围从 0 到 59        */
  3.    int tm_min;         /* 分,范围从 0 到 59        */
  4.    int tm_hour;        /* 小时,范围从 0 到 23        */
  5.    int tm_mday;        /* 一月中的第几天,范围从 1 到 31    */
  6.    int tm_mon;         /* 月,范围从 0 到 11,这里注意是从0开始算的,0代表1月,1代表2月,以此类推  */
  7.    int tm_year;        /* 自 1900 年起的年数 */
  8.    int tm_wday;        /* 一周中的第几天,范围从 0 到 6,这里注意:0代表星期天 */
  9.    int tm_yday;        /* 一年中的第几天,范围从 0 到 365    */
  10.    int tm_isdst;       /* 夏令时                */
  11. };
复制代码


由于HAL库默认使用了SysTick定时器为时基,并且一般是1ms中断一次,所以我们可以利用该定时器实现秒前进,需要覆写该函数:

  1. volatile uint32_t time_dat = 0;

  2. void HAL_IncTick(void)
  3. {
  4.     static uint32_t ticks = 0;
  5.     uwTick += uwTickFreq;
  6.     ticks = (ticks + 1) % 1000;
  7.     if(!ticks)
  8.     {
  9.         time_dat++;
  10.     }
  11. }
复制代码

然后重新实现time()函数:

  1. time_t time (time_t *_timer)
  2. {
  3.     if(_timer != NULL)
  4.     {
  5.         time_dat = *_timer;
  6.     }
  7.     return time_dat;
  8. }
复制代码

示例使用代码:

  1.     time_t tim;
  2.     struct tm *ts;
  3.     struct tm ctime;


  4.     // 转为秒数
  5.     ctime.tm_year = 2021 - 1900;
  6.     ctime.tm_mon  = 12   - 1;
  7.     ctime.tm_mday = 30;
  8.     ctime.tm_hour = 10;
  9.     ctime.tm_min  = 24;
  10.     ctime.tm_sec  = 51;
  11.     tim = mktime(&ctime);

  12.     // 设置时间
  13.     time(&tim);

  14.     // 获取秒数
  15.     tim = time(NULL);

  16.     // 转为本地时间
  17.     ts = localtime(&tim);

  18.     // 打印
  19.     printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",

  20.            ts->tm_year + 1900,
  21.            ts->tm_mon  + 1,
  22.            ts->tm_mday,
  23.            ts->tm_hour,
  24.            ts->tm_min,
  25.            ts->tm_sec

  26.           );

  27.     while (1)
  28.     {
  29.         // 获取秒数
  30.         tim = time(NULL);

  31.         // 转为本地时间
  32.         ts = localtime(&tim);

  33.         // 打印
  34.         printf(" %04d-%02d-%02d %02d:%02d:%02d \r\n",

  35.                ts->tm_year + 1900,
  36.                ts->tm_mon  + 1,
  37.                ts->tm_mday,
  38.                ts->tm_hour,
  39.                ts->tm_min,
  40.                ts->tm_sec

  41.               );
  42.         HAL_Delay(1000);
  43.     }
复制代码




收藏 评论0 发布时间:2022-4-8 23:36

举报

0个回答

所属标签

相似分享

官网相关资源

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