利用宏定义__DATE__和__TIME__做软件版本控制

本文介绍了一种利用C语言预定义符号__DATE__和__TIME__获取软件编译时间的方法,通过解析这些宏返回的日期和时间字符串,转换为结构化的日期时间格式,可用于设置系统默认时间或作为版本更新时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用C的预定义符号__DATE__和__TIME__获取软件编译时间,可用来设置系统默认时间或者作为版本更新时间

# include <stdio.h>
# include <stdlib.h>
#include "..\MALLOC\malloc.h"

//时间结构体
typedef struct
{
    vu8 nHour;
    vu8 nMinute;
    vu8 nSecond;

    //公历日月年周
    vu8  nMonth;
    vu8  nDay;
    vu8  nWeek;
    vu16 nYear;

} RTC_TIME_DEF;

//字符串截取
char *myStrncpy(char *dest, const char *src, int n) 
{
    int size = sizeof(char)*(n + 1);
    char *tmp = (char*)mymalloc(size);  // 开辟大小为n+1的临时内存tmp

    if (tmp) 
    {
        memset(tmp, '\0', size);  // 将内存初始化为0
        memcpy(tmp, src, size - 1);  // 将src的前n个字节拷贝到tmp
        memcpy(dest, tmp, size);  // 将临时空间tmp的内容拷贝到dest

        myfree(tmp);  // 释放内存
        return dest;
    }
    else 
    {
        return NULL;
    }
}

//得到软件编译时间 
RTC_TIME_DEF GetSoftWareBuildTargetTime(void)
{
    char arrDate[20]; //Jul 03 2018
    char arrTime[20]; //06:17:05
    char pDest[20];
    RTC_TIME_DEF stTime;

    sprintf(arrDate,"%s",__DATE__);//Jul 03 2018
    sprintf(arrTime,"%s",__TIME__);//06:17:05
    
    //char *strncpy(char *dest, const char *src, int n)
    //(char*)(&(pDest[0])) = myStrncpy(pDest, arrDate, 3);
    sprintf(pDest, "%s", myStrncpy(pDest, arrDate, 3));

    if (strcmp(pDest, "Jan") == 0) stTime.nMonth = 1;
    else if (strcmp(pDest, "Feb") == 0) stTime.nMonth = 2;
    else if (strcmp(pDest, "Mar") == 0) stTime.nMonth = 3;
    else if (strcmp(pDest, "Apr") == 0) stTime.nMonth = 4;
    else if (strcmp(pDest, "May") == 0) stTime.nMonth = 5;
    else if (strcmp(pDest, "Jun") == 0) stTime.nMonth = 6;
    else if (strcmp(pDest, "Jul") == 0) stTime.nMonth = 7;
    else if (strcmp(pDest, "Aug") == 0) stTime.nMonth = 8;
    else if (strcmp(pDest, "Sep") == 0) stTime.nMonth = 9;
    else if (strcmp(pDest, "Oct") == 0) stTime.nMonth = 10;
    else if (strcmp(pDest, "Nov") == 0) stTime.nMonth = 11;
    else if (strcmp(pDest, "Dec") == 0) stTime.nMonth = 12;
    else stTime.nMonth = 1;

     sprintf(pDest, "%s", myStrncpy(pDest, arrDate+4, 2));
    //int atoi(const char *nptr);
    stTime.nDay = atoi(pDest);

    sprintf(pDest, "%s", myStrncpy(pDest, arrDate + 4 + 3, 4));
    //int atoi(const char *nptr);
    stTime.nYear = atoi(pDest);

    //time
    sprintf(pDest, "%s", myStrncpy(pDest, arrTime, 2));
    stTime.nHour = atoi(pDest);
    sprintf(pDest, "%s", myStrncpy(pDest, arrTime+3, 2));
    stTime.nMinute = atoi(pDest);
    sprintf(pDest, "%s", myStrncpy(pDest, arrTime + 3 + 3, 2));
    stTime.nSecond = atoi(pDest);

    return stTime;
}
 

### STM32 HAL库中 `__HAL_RCC_PWR_CLK_ENABLE()` 的作用 `__HAL_RCC_PWR_CLK_ENABLE()` 是一个宏定义,用于启用电源 (PWR) 外设的时钟。在 STM32 微控制器中,许多外设的功能都需要先使能其对应的时钟才能正常使用。对于 PWR 控制器而言,这个宏的作用就是打开 PWR 模块的时钟供应,从而允许后续对该模块寄存器的操作[^1]。 此功能通常被用来管理低功耗模式下的各种特性,比如待机模式、停止模式等。如果未调用 `__HAL_RCC_PWR_CLK_ENABLE()` 来启动 PWR 时钟,则尝试访问任何与 PWR 相关的寄存器可能会失败或引发异常行为。 #### 配置后备区域时钟 后备区域(Backup Domain)包含了 RTC 一些备份寄存器,在系统复位甚至掉电情况下也能保持数据不丢失。为了配置并使用这些资源,除了需要开启上述提到的 PWR 时钟之外,还需要进一步处理如下事项: 1. **解锁后备域** 后备域默认处于锁定状态以保护其中的数据免受意外修改。因此,在更改任何与此有关的内容前需执行解琐动作。这可以通过调用 `HAL_PWR_EnableBkUpAccess()` 实现[^2]。 2. **初始化RTC** 接下来要的便是设定实时时钟 (Real-Time Clock),它依赖于 LSE 或者其他指定作为 RTC 输入信号源的振荡器频率。这里可以利用到前面提及过的 `HAL_RTC_Init()` 及关联的时间/日期结构体填充过程[^3]。 3. **选择合适的时基源给定至 RTC** 使用函数如 `__HAL_RCC_RTC_CONFIG()` 设置 RTC 所使用的具体时钟源选项,并确认所选路径已激活相应外部晶体驱动电路(若是基于 LSE 的话)。另外记得通过命令像 `__HAL_RCC_RTC_ENABLE()` 开启通往 RTC 单元的实际时钟供给线路[^4]。 以下是实现以上描述逻辑的一个简单代码片段示例: ```c // Enable Power clock and unlock Backup domain access. __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); // Configure the system clocks for RTC usage. __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE); __HAL_RCC_RTC_ENABLE(); // Initialize RTC with default parameters. RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 0; if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN)!= HAL_OK){ Error_Handler(); } if(HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN)!= HAL_OK){ Error_Handler(); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值