【发布时间】:2015-03-17 09:32:51
【问题描述】:
在keil编译器中使用嵌入式C如何获取当前日期和时间?为此需要包含哪些头文件?
【问题讨论】:
-
哪个Keil编译器; 8051、8x251、C166 还是 ARM(实际上是 ARM RealView)?
在keil编译器中使用嵌入式C如何获取当前日期和时间?为此需要包含哪些头文件?
【问题讨论】:
在 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 秒.这同样适用于分钟、小时、日、月和年的翻转。
【讨论】:
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 我们可以使用这个代码
【讨论】: