如何在keil编译器中使用嵌入式C语言获取当前日期和时间

时间:2015-03-17 09:32:52

标签: embedded keil

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

2 个答案:

答案 0 :(得分: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手动初始化为纪元时间计数或从某些外部源(例如通过网络)初始化的1Hz运行的硬件计时器。

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

答案 1 :(得分:0)

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我们可以使用此代码