RT-Thread Studio学习笔记之RTC——解决复位日期不保存问题

2023-10-27

前言

最近使用RT-Thread Studio开发工程时,发现STM32F103系列芯片的RTC功能存在一些缺陷,和同学查找了一些资料后得以解决,希望以此博客作为记录以便温故知新。

RTC简介

RTC(Real-Time Clock)译为实时时钟,因为它一般是集成电路,故也称为时钟芯片。它能提供精确的实时时间,可以用于产生年、月、日、时、分、秒等信息。

在RT-Thread Studio中开启RTC

首先,我们在drivers目录中打开board.h源文件,找到RTC相关内容如下:
在这里插入图片描述
按照如上提示,通过以下三个步骤打开RTC。

1.打开RTC驱动

双击RT-Thread Setting,进入界面后点击更多配置。
在这里插入图片描述
接着找到RTC驱动并勾选。
在这里插入图片描述

2.打开RTC的宏定义

board.h文件中,去掉RTC宏定义的注释。
在这里插入图片描述

3.使能RTC

在drivers目录下的stm32xxxhal_config.h文件中去掉如下代码的注释。在这里插入图片描述

4.下载验证

编译工程后下载到开发板,参照官方开发手册进行验证。

官方文档
首先,使用date命令查询当前时间,随后按照格式输入当前时间,可以看到设置成功。

然而,当按下系统复位按键,系统重启后再使用date命令查询时间时,可以看到时分秒均正常保存,但是日期却并不正确。
在这里插入图片描述

解决复位不保存年月日问题

查找资料后,发现是因为STM32F1系列芯片不支持日历功能,但好在可以通过修改程序进行修正。

在RT-Thread社区看到一篇帖子,里面的方法解决了这个问题。原帖地址

操作步骤

1.打开drivers目录下的drv_rtc.c文件
2.修改get_rtc_timestamp()函数如下

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
}

3.修改set_rtc_time_stamp()函数如下:

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
}

调试验证

编译下载后可以看到,复位后年月日、时分秒均正常保存。
在这里插入图片描述

总结

RT-Thread Studio使用体验较好,RT-Thread社区大神云集,很多共性问题都能在其中找到答案。

这是我在CSDN发表的第一篇博客,内容和排版上都还有很大的改进空间。今后我也会通过这种方式记录我的RTT学习历程,希望大家多多指点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread Studio学习笔记之RTC——解决复位日期不保存问题 的相关文章

  • 整合springBoot+SSM及框架说明

    目录 1 关于springBoot的说明 1 1 springBoot的定义 1 2 springBoot的作用 2 关于springMVC的说明 2 1 springMVC的作用 3 Spring的的作用 4 mybatis的作用 一 创

随机推荐

  • 轻松搞懂Linux中的用户管理

    文章目录 概念 用户账户 用户组 用户权限 用户管理工具 概念 用户管理是Linux系统管理员必须掌握的重要技能之一 Linux系统是一个多用户操作系统 可以支持多个用户同时使用 每个用户拥有自己的账户和权限 因此管理员需要了解如何创建 管
  • vue之父子组件间通信实例讲解(props、$ref、$emit)

    组件是 vue js 最强大的功能之一 而组件实例的作用域是相互独立的 这就意味着不同组件之间的数据无法相互引用 那么组件间如何通信 也就成为了vue中重点知识了 这篇文章将会通过props ref和 emit 这几个知识点 来讲解如何实现
  • vue自定义指令

    除了核心功能默认内置的指令 v model 和 v show Vue 也允许注册自定义指令 有的情况下 对普通 DOM 元素进行底层操作 这时候就会用到自定义指令 下面定义了一个v test指令绑定数据name
  • jupyter的安装步骤

    1 安装python文件 首先去官网python去下载python的安装包 点击donwload 选择合适的系统 这里我是windown系统 点击进去 如图找到有installer的去下载 不建议下载最新版本的 会有兼容问题 2 安装pyt
  • Qgis python开发教程(一)Introduction

    最近工作中用到Qgis开发 找了网上一圈 关于python的开发很少 最后找到官方API 官方API很不错 但是英文难免麻烦一些 自己尝试翻译出来并实践一下 以备自己后续的学习 并非逐字逐句翻译 就是把自己认为重点的地方记录摘要 水平有限
  • C++建造者模式:Builder Pattern

    建造者模式又称生成者模式 该模式是一种创建型设计模式 能够分步骤创建复杂对象 该模式允许使用相同的创建代码通过不同的创建过程生成不同类型的对象 建造者模式 Builder 所构建的对象一定是庞大而复杂的 并且一定是按照既定的制造工序将组件组
  • Android判断是否安装某App

    开发过程中会遇到跳转其他App的情况 诸如支付宝支付跳转 更新跳转等 跳转之前需要判断手机是否安装该App 以下以应用宝为例 public boolean isMobile spExist PackageManager manager th
  • AI驱动的大数据创新:探索软件开发中的机会和挑战

    文章目录 机会 数据驱动的决策 自动化和效率提升 智能预测和优化 个性化体验 挑战 数据隐私与安全 技术复杂性 数据质量和清洗 伦理和社会问题 案例 智能代码生成工具 总结 个人主页 程序员 小侯 CSDN新晋作者 欢迎 点赞 评论 收藏
  • 前端三大件基础知识汇总【自用】

    一 HTML5和CSS3 HTML5 CSS3 二 Javascript基础 1 基础语法 2 Javascript 对象 3 DOM 4 Javascript 事件 5 BOM 补充 图片切换练习 1 clearInterval 可以接收
  • 《nginx》一、nginx核心指令

    nginx conf 配置文件主要分为三部分 全局块 events块 http块 1 全局块核心参数 user USERNAME GROUP 解释 指定运行nginx的worker子进程的属主和属组 其中属组可以不指定 示例 user ng
  • Java实现Apache sshd客户端(密码和公钥登录并执行命令)

    第一步 引入依赖
  • iPad 图标变小而分散 解决方法

    想必各位都遇到过这种情况吧 当你装了某个不正常cydia插件以后 ipad变成iphone界面 图标小而分散 状态栏变得花屏 而任何程序包括cydia都打不开时 请大家不要急着重新恢复ipad 可以按照我这个办法拯救一下 我也是今天4 3
  • 狂神说MyBatis02:CRUD操作及配置解析

    狂神说MyBatis系列连载课程 通俗易懂 基于MyBatis3 5 2版本 欢迎各位狂粉转发关注学习 视频同步文档 未经作者授权 禁止转载 CRUD操作 上集回顾 狂神说MyBatis01 第一个程序 namespace 将上面案例中的U
  • 云计算与大数据概论第七周

    大数据分析是指对规模巨大的数据进行分析 大数据可以概括为5个V 数据量大 Volume 速度快 Velocity 类型多 Variety 价值 Value 真实性 Veracity 大数据作为时下最火热的IT行业的词汇 随之而来的数据仓库
  • Linux下gdb编译调试程序

    Linux下gdb编译调试程序 前言 一 调试前的准备 二 gdb中断点的使用 三 gdb中运行调试程序 四 gdb中打印值和监控值 总结 参考 前言 本文记录调试工具gdb的一些基础使用方式 gdb是一个程序调试工具 注意 如果是程序语法
  • R语言ggplot2可视化绘制带有多个y轴的分面图

    R语言ggplot2可视化绘制带有多个y轴的分面图 在数据可视化中 分面图是一种常用的绘图方式 可以同时展示多个变量之间的关系 而ggplot2是R语言中一个强大的数据可视化包 可以用于创建精美的分面图 对于某些情况下 我们可能需要在分面图
  • Registry新建以及版本

    1 美图 2 添加新的schema 现在 我们可以访问Web UI了 让我们尝试向注册表添加新的架构 您的HDF版本中可能已经包含了一些模式 但是请继续并让我们添加另一个 单击 界面右上方的 符号 这将打开一个名为 Add New Sche
  • vue学习(十三) 删除对象数组中的某个元素

    html div v for循环就不写了 每一条数据最后都有一个删除的超链 prevent阻止默认的跳转行为 只执行点击事件 a href 删除 a div script
  • SQLi LABS Less-13 报错注入+布尔盲注

    第十三关是单引号 括号的字符型注入 推荐使用报错注入 布尔盲注 目录 一 功能分析 二 思路分析 三 解题步骤 方式一 报错注入 第一步 判断注入点 第二步 判断报错条件 第三步 脱库 方式二 布尔盲注 第一步 判断注入点类型 第二步 判断
  • RT-Thread Studio学习笔记之RTC——解决复位日期不保存问题

    目录 前言 RTC简介 在RT Thread Studio中开启RTC 1 打开RTC驱动 2 打开RTC的宏定义 3 使能RTC 4 下载验证 解决复位不保存年月日问题 操作步骤 调试验证 总结 前言 最近使用RT Thread Stud