记录:RT Thread STM32F103 BSP 中RTC设置日期时间后断电日期不能保存的问题
STM32F103 不支持日历功能,RTC保存数据为秒钟数值。
故,这里修改drv_rtc.c文件中的
static time_t get_rtc_timestamp(void)
static rt_err_t set_rtc_time_stamp(time_t time_stamp)
两个函数。
static time_t get_rtc_timestamp(void)
{
#if 0
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);
#else
time_t timestamp;
timestamp = RTC->CNTH; /* 得到计数器中的值(秒钟数) */
timestamp <<= 16;
timestamp += RTC->CNTL;
LOG_D("get rtc time.");
return timestamp;
#endif
}
static rt_err_t set_rtc_time_stamp(time_t time_stamp)
{
#if 0
RTC_TimeTypeDef RTC_TimeStruct = {0};
RTC_DateTypeDef RTC_DateStruct = {0};
struct tm *p_tm;
p_tm = localtime(&time_stamp);
if (p_tm->tm_year < 100)
{
return -RT_ERROR;
}
RTC_TimeStruct.Seconds = p_tm->tm_sec ;
RTC_TimeStruct.Minutes = p_tm->tm_min ;
RTC_TimeStruct.Hours = p_tm->tm_hour;
RTC_DateStruct.Date = p_tm->tm_mday;
RTC_DateStruct.Month = p_tm->tm_mon + 1 ;
RTC_DateStruct.Year = p_tm->tm_year - 100;
RTC_DateStruct.WeekDay = p_tm->tm_wday + 1;
if (HAL_RTC_SetTime(&RTC_Handler, &RTC_TimeStruct, RTC_FORMAT_BIN) != HAL_OK)
{
return -RT_ERROR;
}
if (HAL_RTC_SetDate(&RTC_Handler, &RTC_DateStruct, RTC_FORMAT_BIN) != HAL_OK)
{
return -RT_ERROR;
}
LOG_D("set rtc time.");
HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA);
return RT_EOK;
#else
/* 设置时钟 */
RCC->APB1ENR |= 1<<28; /* 使能电源时钟 */
RCC->APB1ENR |= 1<<27; /* 使能备份时钟 */
PWR->CR |= 1 << 8; /* 取消备份区写保护 */
/* 上面三步是必须的! */
RTC->CRL |= 1 << 4; /* 允许配置 */
RTC->CNTL = time_stamp & 0xffff;
RTC->CNTH = time_stamp >> 16;
RTC->CRL &= ~(1 << 4); /* 配置更新 */
while (!(RTC->CRL & (1 << 5))) {} /* 等待RTC寄存器操作完成 */
HAL_RTCEx_BKUPWrite(&RTC_Handler, RTC_BKP_DR1, BKUP_REG_DATA);
LOG_D("set rtc time.");
return RT_EOK;
#endif
}
原来的代码被我使用if 0 屏蔽了。