如何在stm32f303中生成时间戳?

时间:2018-01-25 09:56:28

标签: timestamp stm32 real-time-clock

我正在编写代码来生成时间戳,以将其用作执行特定功能的参考。 任何人都可以帮助我如何做到这一点。 我是嵌入式编程的新手。

2 个答案:

答案 0 :(得分:1)

首先,你必须初始化RTC。希望你知道,如何做这个STM32CubeMX。

然后是简单的代码:

#include <time.h>

/* Global Vars */
RTC_TimeTypeDef currentTime;
RTC_DateTypeDef currentDate;
time_t timestamp;
struct tm currTime;


/* Code to get timestamp 
*
*  You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values 
*  in the higher-order calendar shadow registers to ensure consistency between the time and date values.
*  Reading RTC current time locks the values in calendar shadow registers until Current date is read
*  to ensure consistency between the time and date values.
*/

HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &currentDate, RTC_FORMAT_BIN);

currTime.tm_year = currentDate.Year + 100;  // In fact: 2000 + 18 - 1900
currTime.tm_mday = currentDate.Date;
currTime.tm_mon  = currentDate.Month - 1;

currTime.tm_hour = currentTime.Hours;
currTime.tm_min  = currentTime.Minutes;
currTime.tm_sec  = currentTime.Seconds;

timestamp = mktime(&currTime);

P.S。我不检查日期和时间数据是否正确。如果你想 - 自己做一些正确的数据检查。

答案 1 :(得分:0)

这是一个非常广泛的问题。使用STM32,您可以使用不同的方法来实现时间戳。我假设,你的意思是自启动以来经过的毫秒数。如果你想要时钟上的实际时间,你需要一个RTC(实时时钟)。

通常,您需要编写一个名为中断例程(或中断处理程序)的函数,该函数每1毫秒(或任何其他合适的时间间隔)递增一个变量。每次中断触发时都会调用此函数,通常是由于定时器溢出

现在您可以直接配置STM32寄存器(我不建议使用)或使用库(例如StdPeriph或HAL)。特别是后者使用起来非常简单。

即。使用HAL,只需调用 HAL_GetTick()即可获得以ms为单位的时间戳。有关详细信息,请参阅this