【问题标题】:how to get the current date and time using embedded C language in keil compiler如何在keil编译器中使用嵌入式C语言获取当前日期和时间
【发布时间】:2015-03-17 09:32:51
【问题描述】:

在keil编译器中使用嵌入式C如何获取当前日期和时间?为此需要包含哪些头文件?

【问题讨论】:

  • 哪个Keil编译器; 8051、8x251、C166 还是 ARM(实际上是 ARM RealView)?

标签: embedded keil


【解决方案1】:

在 Keil 标准库中,time.h time_t time( time_t *timeptr ) 函数是一个空的“弱链接”存根或未定义函数,您必须实现它才能访问硬件上可用的任何时间资源;通常对于微控制器,您将拥有一个由 32768Hz 晶体提供时钟的片上 RTC。

ARM implementation 中,默认存根使用半托管通过 JTAG/SWI 从开发主机获取时间,因此在独立系统中不起作用。无论哪种方式,您都需要使用自己的覆盖默认实现或存根。

您的代码应包含以下内容:

#if defined __cplusplus
extern "C"
{
#endif

    time_t time( std::time_t *timeptr ) 
    {
        time_t epoch_time  = 0 ;
        struct tm time_struct = {0} ;

        // Your code to get RTC data in a tm struct here
        ...

        // Convert tm struct to UNIX epoch time     
        epoch_time = std::mktime( &time_struct ) ;

        if( tp != 0 )
        {
            *timeptr = epoch_time ; 
        }

        return epoch_time ; 
    }

#if defined __cplusplus
}
#endif

使用此函数的代码应包含 time.h/ctime 以获取原型。链接器会将对time() 的调用解析为您的实现,覆盖任何现有的默认库实现或存根。

如果您没有 RTC 硬件,则可以实现以 1Hz 运行的硬件计时器,手动初始化为纪元时间计数或从某些外部源(例如通过网络)初始化。

在读取 RTC 硬件(或任何其他时间源)时,您需要确保时间一致;例如,可以读取 59 秒,就像它滚动到 00 秒一样,然后读取分钟,所以最后会说 20 分 59 秒,而它应该是 19 分 59 秒或 20 分 00 秒.这同样适用于分钟、小时、日、月和年的翻转。

【讨论】:

    【解决方案2】:

    HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BIN);

    HAL_RTC_GetDate(&hrtc,&sDate,RTC_FORMAT_BCD);
    printf("%02d:%02d:%02d\n",sTime.Hours,sTime.Minutes,sTime.Seconds);
    

    这个命令是基于 HAL_drivers 的,通过启用 RTC 我们可以使用这个代码

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2010-09-29
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2011-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多