RT_Thread:STM32L0系列RTC驱动的支持与修改

1.在rtconfig文件中添加RT_USING_RTC宏定义,这个可以利用env工具添加

#define RT_USING_RTC

2.很重要的一点,本应用是希望使用STM32L071系列内部的硬件RTC的,因此需要增加宏定义

#define BSP_USING_ONCHIP_RTC

3.同样是针对L0系列的适配问题,drv_rtc.c文件是针对L系列的L4写的,没有针对L0的,因此需要增加针对L0的预编译宏定义,如下这个elif分支添加L0

#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32L0)

        /* set the frequency division */
#  ifdef BSP_RTC_USING_LSI
        RTC_Handler.Init.AsynchPrediv = 0X7D;
#  else
        RTC_Handler.Init.AsynchPrediv = 0X7F;
#  endif /* BSP_RTC_USING_LSI */
        RTC_Handler.Init.SynchPrediv = 0XFF;

        RTC_Handler.Init.HourFormat = RTC_HOURFORMAT_24;
        RTC_Handler.Init.OutPut = RTC_OUTPUT_DISABLE;
        RTC_Handler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
        RTC_Handler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
#endif

4.很重要的一点,原驱动是有backup寄存器的操作,本处可以考虑不做

首先在rtconfig.h文件添加下面宏定义,而本项目可以将其注释

#define BSP_RTC_WITH_BACKUP

 

其次在set_rtc_time_stamp函数中的下面backup添加预编译

#ifdef BSP_RTC_WITH_BACKUP
    HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA);
#endif

再在rt_rtc_config函数中的下面if语句也添加预编译

#ifdef BSP_RTC_WITH_BACKUP
    if (HAL_RTCEx_BKUPRead(&RTC_Handler, RTC_BKP_DR1) != BKUP_REG_DATA)
#endif

4.非常重要的一点是关于mktime函数的

在获取当前时间的操作中,使用的是mktime函数进行时间转换的,如下代码段。而定义tm数据结构体时,并未对tm_new进行初始化赋值,这样一来,对于一些编译器环境,尤其是IAR(很惭愧,具体原有还未深究),会造成结构体成员tm_isdst变成一个非0值的情况,造成最终输出的tm_hour小时这个成员加1或者减1

static time_t get_rtc_timestamp(void)
{
    RTC_TimeTypeDef RTC_TimeStruct = {0};
    RTC_DateTypeDef RTC_DateStruct = {0};
    struct tm tm_new;

    HAL_RTC_GetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN);

    tm_new.tm_sec  = RTC_TimeStruct.Seconds;
    tm_new.tm_min  = RTC_TimeStruct.Minutes;
    tm_new.tm_hour = RTC_TimeStruct.Hours;
    tm_new.tm_mday = RTC_DateStruct.Date;
    tm_new.tm_mon  = RTC_DateStruct.Month - 1;
    tm_new.tm_year = RTC_DateStruct.Year + 100;

    LOG_D("get rtc time.");
    return mktime(&tm_new);
}

tm结构体定义

 

RT_Thread:STM32L0系列RTC驱动的支持与修改_第1张图片

解决方案之一是将tm_new这个结构体定义的时候赋值为0,如下,这个方法比较靠谱,特别是函数内局部变量定义初始化。

struct tm tm_new = {0};

这样之后操作就不会有影响了

RT_Thread:STM32L0系列RTC驱动的支持与修改_第2张图片

另一个解决方案是手动赋值tm_isdst,但这样的话就需要想好是否有其它变量需要初始化或者赋值的

tm_new.tm_isdst = 0;

 

夏令时tm_isdst成员的具体影响关系,可以参考另一篇文章《其它:关于时间函数mktime函数夏令时的问题 》

你可能感兴趣的:(STM32学习,RT_Thread)