记录:RT Thread STM32F103 BSP 中RTC设置日期时间后断电日期不能保存的问题

记录: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 屏蔽了。

PS好记性不如烂笔头 @_@ 记录一下,免得使用的时候找不到了。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值