[APM32F1] C标准库time.h可以在单片机上面使用吗?

[复制链接]
 楼主| Bowclad 发表于 2022-9-14 20:50 | 显示全部楼层 |阅读模式
看到c的标准库里有这个函数,不知道能不能用在上面?
编号10086 发表于 2022-9-15 10:07 | 显示全部楼层
  1. /**
  2. * @author: FlyyingPiggy2020
  3. * @data: 2022-09-08 09:33:10
  4. * @last_author: FlyyingPiggy2020 154562451@qq.com
  5. * @last_time: 2022-09-08 16:26:32
  6. * @brief: 和应用代码无关的函数,用于数学计算等。
  7. * @copyright: copyright(c) 2022 by FlyyingPiggy2020, All Rights Reserved.
  8. */
  9. #include "fp.h"
  10. #include "fp_user_lib.h"


  11. /**
  12. * [url=home.php?mod=space&uid=247401]@brief[/url] 获取从1970年1月1日0时0分0秒至今的秒数
  13. * @param {tm} tm_now
  14. * [url=home.php?mod=space&uid=266161]@return[/url] {*}
  15. */
  16. uint32_t fp_mktime(tm_t tm_now)
  17. {
  18.     uint16_t year = tm_now.tm_year;
  19.     int16_t mon = tm_now.tm_mon;
  20.     uint16_t day = tm_now.tm_mday;
  21.     uint16_t hour = tm_now.tm_hour;
  22.     uint16_t min = tm_now.tm_min;
  23.     uint16_t sec = tm_now.tm_sec;
  24.        
  25.         mon = mon - 2;
  26.     if ( mon <= 0)
  27.         {
  28.         mon += 12;
  29.         year -= 1;
  30.     }
  31.     return (((
  32.              (uint32_t) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
  33.              year*365 - 719499
  34.           )*24 + hour /* now have hours */
  35.        )*60 + min /* now have minutes */
  36.     )*60 + sec; /* finally seconds */
  37. };

  38. /**
  39. * @brief 从1970年1月1日0时0分0秒至今的秒数 转换成 年月日 具体格式参考 struct tm
  40. * @param {tm} tm_time  {uint32_t} timestamp
  41. * @return {*}
  42. */
  43. void fp_gmtime(struct tm *tm_time, uint32_t timestamp)
  44. {
  45.         uint16_t four_year_num; /* 有多少个四年 */
  46.         uint16_t one_year_hours;/* 一年的小时数 */
  47.        
  48.         const static uint8_t days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* 非闰年每月天数 */
  49.         const static uint16_t ONE_YEAR_HOURS = 8760; /* 非闰年的小时数 365 * 24 */
  50.         const static uint16_t FOUR_YEAR_HOURS = 35064;/* 四年的小时数(365 * 3 + 366)* 24  */
  51.        
  52.         if (timestamp >= 0X7FFFFFFF)
  53.         {
  54.                 return;
  55.         }
  56.        
  57.         tm_time->tm_isdst  = 0;
  58.         tm_time->tm_sec = (int32_t)(timestamp % 60); /* 秒 */
  59.         timestamp /= 60;
  60.        
  61.         tm_time->tm_min = (int32_t)(timestamp % 60); /* 分 */
  62.         timestamp /= 60;
  63.        
  64.         tm_time->tm_wday = (int32_t)(timestamp/24 + 4) % 7; /* 计算星期 1970年1月1日是星期四 */
  65.        
  66.         four_year_num = timestamp / FOUR_YEAR_HOURS;
  67.        
  68.         tm_time->tm_year = (four_year_num << 2) + 1970; /* 计算年 */
  69.        
  70.         timestamp %= FOUR_YEAR_HOURS; /* 不足四年的小时数 */
  71.        
  72.         while(1)
  73.         {
  74.                 one_year_hours = ONE_YEAR_HOURS;
  75.                 if ((tm_time->tm_year & 3) == 0)
  76.                 {
  77.                         one_year_hours += 24;
  78.                 }
  79.                
  80.                 if (timestamp < one_year_hours)
  81.                 {
  82.                         break;
  83.                 }
  84.                
  85.                 tm_time->tm_year++;
  86.                 timestamp -= one_year_hours;
  87.         }       
  88.         tm_time->tm_hour = (int32_t)(timestamp % 24); /* 计算时 */
  89.        
  90.         timestamp /=  24; /* 一年中剩下的天数 */
  91.         timestamp++;
  92.        
  93.         tm_time->tm_yday = timestamp - 1; /* 计算天  */
  94.        
  95.         if ((tm_time->tm_year & 3) == 0)
  96.         {
  97.                 if (timestamp > 60)
  98.                 {
  99.                         timestamp--;
  100.                 }
  101.                 else if (timestamp == 60)
  102.                 {
  103.                         tm_time->tm_mon = 1;
  104.                         tm_time->tm_mday = 29;
  105.                         return;
  106.                 }
  107.         }
  108.        
  109.         for (tm_time->tm_mon = 0;  days[tm_time->tm_mon] < timestamp; tm_time->tm_mon++)
  110.         {
  111.                 timestamp -= days[tm_time->tm_mon];
  112.         }
  113.         tm_time->tm_mon++;
  114.         tm_time->tm_yday++;
  115.         tm_time->tm_mday = (int32_t)(timestamp);
  116.        
  117. }

  118. /* 测试例程 */
  119. void fp_time_test_demo(void)
  120. {
  121.     tm_t tm_now,tm_test;
  122.     uint32_t time;
  123.    
  124.     tm_now.tm_year = 2022;
  125.     tm_now.tm_mon = 9;
  126.     tm_now.tm_mday = 8;
  127.     tm_now.tm_hour = 15;
  128.     tm_now.tm_min = 12;
  129.     tm_now.tm_sec = 0;

  130.     time = fp_mktime(tm_now);
  131.         fp_gmtime(&tm_test,time);
  132. }
编号10086 发表于 2022-9-15 10:08 | 显示全部楼层
主要是mktime和gmtime两个函数,可以自己写。

  1. /**
  2. * @author: FlyyingPiggy2020
  3. * @data: 2022-09-08 09:33:10
  4. * @last_author: FlyyingPiggy2020 154562451@qq.com
  5. * @last_time: 2022-09-08 14:22:47
  6. * @brief:
  7. * @copyright: copyright(c) 2022 by FlyyingPiggy2020, All Rights Reserved.
  8. */
  9. #ifndef __FP_USER_LIB_H__
  10. #define __FP_USER_LIB_H__

  11. #include <stdint.h>
  12. typedef struct tm
  13. {
  14.     int16_t tm_sec;         /* 秒 – 取值区间为[0,59] */
  15.     int16_t tm_min;         /* 分 - 取值区间为[0,59] */
  16.     int16_t tm_hour;        /* 时 - 取值区间为[0,23] */
  17.     int16_t tm_mday;        /* 一个月中的日期 - 取值区间为[1,31] */
  18.     int16_t tm_mon;         /* 月份(从一月开始,1代表一月) - 取值区间为[1,12] */
  19.     int16_t tm_year;        /* 年份 */
  20.     int16_t tm_wday;        /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */
  21.     int16_t tm_yday;        /* 从每年1月1日开始的天数– 取值区间[1,366],其中1代表1月1日 */
  22.     int16_t tm_isdst;       /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */   
  23. }tm_t;

  24. uint32_t fp_mktime(tm_t tm_now);

  25. void fp_gmtime(struct tm *tm_time, uint32_t timestamp);
  26. #endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

146

主题

2295

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

146

主题

2295

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部