硬汉嵌入式论坛

 找回密码
 立即注册
查看: 612|回复: 7
收起左侧

[技术讨论] 以编译时间加预计下载时间来校准RTC时钟实现实时调试日志生成等功能

[复制链接]

3

主题

46

回帖

55

积分

初级会员

一个极客ageek

积分
55
发表于 2023-8-14 11:49:06 | 显示全部楼层 |阅读模式
本帖最后由 nikola 于 2023-8-14 11:50 编辑

以编译时间加预计下载时间来校准RTC时钟的功能
比起随便往后备寄存器写一个值再然后预测编译和下载后的时来更新RTC要方便许多

优点:
第一是初始化RTC时间不需要重新定一个值写到后备寄存器,
而是把编译时间存后备寄存器,重新编译后自然编译时间不同,检测后备寄存器时间不同就会自动更新
(还是需要注意部分型号芯片可能后备寄存器空间有限存不下完整的编译时间)

第二是无需手动填写RTC校准初始时间,RTC按编译时间+预计下载所需秒数,只需要预估下载时间就可以调得更精准。
也不需要串口手动发命令校准或者网络校准。


缺点:

编译时间是必须代码内有出现改动重新编译才会更新
没有改动编译编译时间不更新

编译后必须立即下载复位,或者直接进入调试模式立即启动。
因为编译后重新运行才会把编译时间+预计下载时间更新到RTC。

如果编译后过了很久才下载烧录,则时间已经超出预计下载时间导致RTC更新的时间有偏差。


主要应用:
在编译后进行调试,自动校准RTC时间,把RTC时间用于输出调试日志信息。
每次重新编译后立即进入调试,RTC时间都是比较精准,几乎和电脑同步的。

在easylog上测试实时调试日志成功
这里只传rtc_update相关代码
可以自行移植到自己的日志系统上。

RTC_Update.zip (4.71 KB, 下载次数: 9)

RTC1.png
RTC2.png
RTC3.png

//# 移植和使用方法

//## 1.实现RTC初始化代码
//自行使用cubemx生成或自己使用HAL编写rtc.c和rtc.h实现rtc初始化
//其中rtc句柄,需要extern声明到头文件让rtc_update能找到。
//例如 extern RTC_HandleTypeDef hrtc;//cubemx生成的rtc句柄

//## 2.更新RTC时间为编译下载后的时间
//估算下载的时间写到DOWNLOAD_SECOND
//重新编译代码(好像单纯按编译还不行,得有改动才会真正去编译),
//可以随便修改一个宏定义值有改动就会真正编译
//编译后立即下载

//在RTC初始化后不要用cubemx的设置时间
//它没有对后备寄存器数据进行判断就直接设置会导致
//之后再调用RTC_Set_Compile_Time();
//会对比BKP寄存器存储的RTC时间来决定是否需要更新
//在cubemx生成的rtc.c这里调用后就返回

/* USER CODE BEGIN Check_RTC_BKUP */
//RTC_Set_Compile_Time();
//return ;
/* USER CODE END Check_RTC_BKUP */

//## 3.获取RTC时间格式输出的字符串
//调用rtc_time_formart();
//返回值就是字符串首地址,可以输出到串口或给GUI显示

//# 4. RTC 需LSE 提供时钟还有后备电池给VBAT供电
//不然无法连续计时,如果是HSI提供的时钟会导致断电复位后
//时间又往回倒到后备寄存器内的时间

//只要使用该方法在编译后立即下载烧录,就能保证每次调试下载的RTC是自动校准了的
//缺点是编译要有改动才会真正编译更新编译时间
//目前只能随便改动一个宏定义值使得编译生效




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-8-14 14:43:09 | 显示全部楼层
谢谢楼主分享,好办法。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2023-8-14 17:08:17 | 显示全部楼层
如何批量?
回复

使用道具 举报

1

主题

43

回帖

46

积分

新手上路

积分
46
发表于 2023-8-15 08:50:26 | 显示全部楼层
硬件设备校时,有网络校时,GPS校时,编译校时还是不可行的。
回复

使用道具 举报

3

主题

46

回帖

55

积分

初级会员

一个极客ageek

积分
55
 楼主| 发表于 2023-8-15 14:05:27 | 显示全部楼层

不适合批量,批量的话你得每次都重新编译不能用同一个固件。建议写个上位机定个协议来通过串口校准。
回复

使用道具 举报

3

主题

46

回帖

55

积分

初级会员

一个极客ageek

积分
55
 楼主| 发表于 2023-8-15 14:06:53 | 显示全部楼层
casy99 发表于 2023-8-15 08:50
硬件设备校时,有网络校时,GPS校时,编译校时还是不可行的。

你没搞懂我的应用场景,我说的应用是在编译后进行调试,自动校准RTC时间,把RTC时间用于输出调试日志信息。不是给每一台机器重新编译一次来做校准。
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2023-8-16 09:38:33 | 显示全部楼层
不错地思路,我联想到地改进方案是由IDE下发时间给芯片。
UVISION DEBUGGER: Debug Configuration via INI File vs DBGCONF File
回复

使用道具 举报

3

主题

46

回帖

55

积分

初级会员

一个极客ageek

积分
55
 楼主| 发表于 2023-8-16 14:33:56 | 显示全部楼层
emwin 发表于 2023-8-16 09:38
不错地思路,我联想到地改进方案是由IDE下发时间给芯片。
UVISION DEBUGGER: Debug Configuration via INI ...

之前有试过Keil的INI文件可以编程导出watchwindow数据或者给watchwindow的变量赋值。更正RTC的值确实可以,不过没试过能不能调函数或者写函数来把后备寄存器值也一起更新,后备寄存器得开时钟和关写保护,而且这个INI调试文件得在停止调试下手动选择INI文件来加载之后才能在命令窗口进行执行,也略显麻烦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 08:50 , Processed in 0.259917 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表