如何在stm32f303中生成时间戳?
Posted
技术标签:
【中文标题】如何在stm32f303中生成时间戳?【英文标题】:How to generate a timestamp in stm32f303? 【发布时间】:2018-07-04 12:51:08 【问题描述】:我正在编写代码来生成时间戳,以将其用作执行某个功能的参考。 谁能帮我怎么做。 我是嵌入式编程的新手。
【问题讨论】:
欢迎来到 ***。请take the tour阅读What topics can I ask about和What topics to avoid和How to ask a good question和the perfect question以及如何创建Minimal, Complete and Verifiable Example。 【参考方案1】:这是一个非常广泛的问题。使用 STM32,您有不同的方法来实现时间戳。我假设,您的意思是自启动以来经过的毫秒数。如果你想要时钟上的实际时间,你需要一个 RTC(实时时钟)。
通常,您需要编写一个名为中断例程(或中断处理程序)的函数,该函数每 1 毫秒(或任何其他合适的时间间隔)递增一个变量。每次中断触发时都会调用此函数,通常是由于定时器溢出。
现在您可以直接配置 STM32 寄存器(我不推荐)或使用库(例如 StdPeriph 或HAL)。尤其是后者使用起来非常简单。
即使用 HAL,HAL_GetTick() 的简单调用会为您提供以毫秒为单位的时间戳。请参阅this 了解更多信息。
【讨论】:
为什么不推荐?这个英国媒体报道软件更好吗? @PeterJ_01 它可以非常快速地完成工作并引导初学者在早期阶段取得成功。如果初学者不知道他们必须寻找什么,他们就无法阅读数据表并正确设置寄存器。在我看来,库是习惯微控制器概念并快速获得结果的第一步。如果您成功使用库,那么您可以更深入地手动设置位(即在 RCC_APBEN、GPIOx->MODE、ODR 和 IDR 中)。我知道还有其他完全有效的方法,但这是我的拙见。 这只是你个人的看法,在我看来这是 100% 错误的。 我尊重这一点。我想建议您然后写一个替代答案,提出您的方法,而不是(或至少另外)否决显然没有错误的答案。 这里只是评论,因为没有推荐的程序编写方法。这取决于程序员。【参考方案2】:首先,你必须初始化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, ¤tTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, ¤tDate, 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. 我不检查日期和时间数据是否正确。如果你想 - 自己检查一下正确的数据。
【讨论】:
以上是关于如何在stm32f303中生成时间戳?的主要内容,如果未能解决你的问题,请参考以下文章