【心得】关于STM32中RTC的校准方法
最近看了一些关于RTC校准的帖子,发现很多人存在疑惑。正好最近我也在STM32中实现了RTC校准。发些心得。这些对老手来说有些罗索,但对新手有益处。
实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t CalibrationValue) 函数。谈到RTC校准的相关参考文档包括AN2604.pdf,AN2821.pdf和AN2821.zip。这三个文档都可以从STM32官方网站下载。
按照AN2604.pdf描述的原理,RTC 的校准值应在0-127之间。可实现的校准误差对应为0-121ppm。相当于每30天跑快的秒数为0-314s。
这里应注意的一个关键问题是,RTC只能对跑快进行校准,不能对跑慢进行校准。如果手表晶振的标称频率是32768Hz,设其可能的误差范围是±2Hz,则实际频率会在32766Hz-32770Hz之间。如果RTC的内部分频系数设定为32768,则32768Hz是不需要校准的频率,32768Hz-32770Hz是可以校准的频率(最大校准能力大概是32772Hz)。但是32766Hz-32768Hz的跑慢频率段则无法实现校准。为此,在推荐的校准方法中,使用32766代替32768作为分频系数。这样一来,32766Hz是不需要校准的频率,32766Hz-32770Hz是可以校准的频率范围。
剩下的问题是,如何测量误差,并以此得出校准值。一般来说有两种方法,一是测量TamperPin的频率值,然后计算ppm误差;二是实际运行一定的天数,与标准时钟做对比,先得到每30天跑快的秒数,然后计算ppm误差。
AN2604.pdf,AN2821.pdf里都详细描述了第一种方法。AN2821.zip则使用定时器T2对TamperPin的频率值进行自动测量,实现了自动校准。自动校准确实简化了用户操作,但是它要依赖于8MHz主时钟的精度。自动校准不可能达到比8MHz主时钟精度更高的结果。所以给用户留有手动校准界面仍是万全之策。即使有自动校准,也可以手动、自动叠加作用。
另一方面,使用第一种方法进行校准,需要准确测量TamperPin的频率值,比如达到511.xxxHz的精度。普通示波器做不到这一点,一般的频率计也不行,高精度的频率计才可以。只有搞计量的专业人士才会有这种设备。作为搞控制系统的人,搞一个非计量精度的时钟,使用第一种方法还是有困难的。
第一种方法也好,第二种方法也罢,核心都是计算ppm误差。我们先看一下第一种方法是如何计算ppm误差的。由于使用了32766作为分频系数,因此32766Hz是不需要校准的基准频率。不要把32768Hz看得太重,现在它啥也不是,32766Hz可看成新的标称频率。TamperPin的频率应为32766Hz/64=511.968Hz。这也就是文档中计算误差时反复使用的基准频率。按照文档中所举的例子,若实测TamperPin的频率为511.982Hz,则误差为27.35ppm。计算过程为(511.982Hz-511.968Hz)/ 511.968Hz *10^6 = 27.35ppm。文档最后给出最接近的校准值为28。注意这里是最后的校准值28,是由27 ppm查表得到的,而不是有些帖子中误解的将27.35ppm近似成28ppm。
其实ppm误差的计算公式为:ppm误差=偏差/基准值*10的6次方。据此,采用第二种方法时,先得到了每30天跑快的秒数。这跑快的秒数就是偏差,而30天就是基准值。所以ppm误差=每30天跑快的秒数/(30天*24小时*3600秒)*10的6次方。用这个公式可以容易地解释文档AN2604.pdf中提到的“0.65ppm大约是每月误差1.7秒”。因为:1.7/(30*24*3600)*10^6 = 0.65ppm。
计算出了ppm误差,还要解决查表。对文档中给出的表格也不必看重。弄明白这个表格是怎么来的之后,可以使用简单的计算公式代替查表。AN2604.pdf中说,若校准值为1,则RTC 校准时,每2的20次方个时钟周期扣除1个时钟脉冲。这相当于0.954ppm(1/2^20*10^6 = 0.954)。而校准值最大为127,所以最大可以减慢121ppm(0.954ppm*127 = 121)。所以这个校准表就是由简单的乘除运算得来的,当然要使用浮点运算才可以得到准确结果。
以下是采用第二种方法实现的RTC 校准程序。
首先定义了两个常数,一是PPM_PER_STEP,准确到浮点数可表示的精度数0.9536743ppm。另一个是PPM_PER_SEC,即每30天快一秒对应的ppm误差,准确到浮点数可表示的精度数0. 3858025ppm。
#define PPM_PER_STEP 0.9536743 //10^6/2^20.#define PPM_PER_SEC 0.3858025 //10^6/(30d*24h*3600s).然后定义全局变量FastSecPer30days。通过用户菜单设定并传递到RTC校准程序里。u16 FastSecPer30days = 117; //菜单输入。117只用于演示。
实现的校准函数为:
void RTC_Calibration(void){float Deviation = 0.0;u8 CalibStep = 0;Deviation = FastSecPer30days * PPM_PER_SEC; //得到ppm误差Deviation /= PPM_PER_STEP; //得到校准值的浮点数CalibStep = (u8)Deviation; // 得到校准值的整形数if(Deviation >= (CalibStep + 0.5))CalibStep += 1; //四舍五入if(CalibStep > 127)CalibStep = 127; // 校准值应在0—127之间BKP_SetRTCCalibrationValue(CalibStep); //调用库函数}//函数结束RTC_Calibration
相关文章:
【心得】关于STM32中RTC的校准方法
最近看了一些关于RTC校准的帖子,发现很多人存在疑惑。正好最近我也在STM32中实现了RTC校准。发些心得。这些对老手来说有些罗索,但对新手有益处。 实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t Calibra…...
消息中间件面试篇
目录 消息中间件 RabbitMQ 消息不丢失 生产者确认机制 消息持久化 交换机持久化 队列持久化 消息持久化 消费者确认 消息重复消费 出现的场景 解决方案 每条消息设置一个唯一的标识id 幂等方案:【 分布式锁、数据库锁(悲观锁、乐观锁&#…...
【MySQL】-20 MySQL综合-6(MySQL创建数据表+MySQL修改数据表+MySQL删除数据表)
MySQL创建数据表MySQL修改数据表MySQL删除数据表 MySQL创建数据表基本语法在指定的数据库中创建表查看表结构 MySQL修改数据表基本语法添加字段修改字段数据类型删除字段修改字段名称修改表名 MySQL删除数据表基本语法删除表 MySQL创建数据表 在创建数据库之后,接下…...
linux查看当前连接的IP
linux下查询当前所有连接的ip_linux查看某个ip的连接-CSDN博客 netstat -ntu | grep tcp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr...
洛谷_P1923 【深基9.例4】求第 k 小的数_python写法
哪位大佬可以出一下这个的题解?????话说蓝桥杯可以用numpy库吗?????? 这道题有一个很简单的思路就是排序完成之后再访问。 but有很大的问题&…...
【MySQL】学习约束和使用图形化界面创建表
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
QGIS编译(跨平台编译)之四十八:pixman编译(Windows、Linux、MacOS环境下编译)
文章目录 一、pixman介绍二、pixman下载三、Linux下编译四、MacOS下编译五、Windows下编译一、pixman介绍 Pixman 是一个开源的图形库,它提供了底层像素操作功能,包括像素格式转换、图像合成、图像缩放、图像旋转等多种操作。Pixman 主要被用作 Cairo 图形库的后端,支持 Ca…...
华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)
第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …...
【sass】 中使用 /deep/ 修改 elementUI 组件样式报错
element plus 想要覆盖组件的样式,想到了/deep/样式穿透,但样式一直不生效,代码如下: <style scoped lang"sass"> .main_wrapper{padding: 0 53pxposition: relativetop: -20px } >>> .el-tabs__item{h…...
Python算法题集_排序链表
Python算法题集_排序链表 题148:排序链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【冒泡大法】2) 改进版一【列表排序】3) 改进版二【数值归并排序】4) 改进版三【快慢指针归并排序】 4. 最优算法 本文为Python算法题集之一的…...
红日靶场2学习
靶场下载来自: http://vulnstack.qiyuanxuetang.net/vuln/detail/3/ 靶场统一登录密码:1qazWSX 按大佬的说法是 环境需要模拟内网和外网两个网段,PC端虚拟机相当于网关服务器,所以需要两张网卡,一个用来向外网提供web…...
将 下载下来的 jar 包 安装到本地的 maven 仓库中
使用管理员权限 打开一个 cmd 窗口输入 mvn -v 查看 maven 版本由于之前 并没有这样的操作所以第一次 执行的时候 提示 命令不存在所以需要将 maven 软件中的 bin 文件的目录 添加到 环境变量中 的 path 变量 中本机路径为:D:\Program Files (x86)\apache-maven-3.5.2\bin C:\…...
Qt初使用(使用Qt创建项目,在创建的项目中添加类,Qt中输出内容到控制台,设置窗口大小和窗口标题,Qt查看说明文档)
目录 一.创建带模板的项目新建项目运行在文件中查看该项目文件 二.在创建好的项目中添加类三.创建空项目(不使用自带的模板)四.Qt中输出内容到控制台五.设置窗口大小 , 窗口标题 ,固定窗口大小QWidget组件的说明 六.Pro文件帮助文档 按windows键…...
【黑马程序员】C++运算符重载
文章目录 运算符重载加号运算符重载成员函数实现运算符重载全局函数实现运算符重载全局函数实现函数重载 左移运算符重载递增运算符重载赋值运算符重载关系运算符重载函数调用运算符重载 运算符重载 对已有的运算符重新进行定义,赋予其另一种功能,以适应…...
Java中的乐观锁和悲观锁
使用场景及用法 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,…...
从Unity到Three.js(计时器、Transform)
计时器、模型对象平移函数、枚举定义的使用 对应unity中的一些常用功能 import * as THREE from three;const scene new THREE.Scene(); const camera new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 1000);const renderer new THREE.WebG…...
红日靶场(初学)
按照以前的来说一般是有两层网络的内网和外网 这个也是这样的 所以需要两张网卡,一个用来向外网提供web服务,一个是通向内网 以下就是配置 以下就是一些相关信息 外网网段是写成了192.168.111.1/24 WEB PC DC kali 开始扫描 nmap -sS -sV -Pn -T4 19…...
【PyTorch】改变张量(Tensor)形状操作
PyTorch深度学习总结 第二章 PyTorch中改变张量(Tensor)形状操作 文章目录 PyTorch深度学习总结一、前言二、改变张量形状 一、前言 上文讲解了张量生成和信息获取的知识,本文将针对张量的操作进行详细讲解。 二、改变张量形状 1、改变张量形状的函数总结&#x…...
《金融人工智能:用python实现ai量化交易》
融合了数学、python、深度学习以及金融知识,是本推荐的好书。请收藏本文,读后再给大学总结。...
位运算+leetcode ( 2 )
题一:只出现一次的数字(1) 1.链接 136. 只出现一次的数字 - 力扣(LeetCode) 2.思想 借用位运算中异或操作符的特点,a^a0,0^aa先定义一个sum0就用一个循环来遍历这个数组,每次都进行…...
华为升腾C92变身校园打铃器:从Linux到Win7的完整改造指南
1. 华为升腾C92硬件潜力解析 很多人第一次接触华为升腾C92时,都会被它小巧的机身误导,以为这只是一台性能有限的瘦客户机。我当初在学校见到这批预装Linux系统的设备时,也是这么想的。直到某天停电后需要手动打铃,才萌生了改造它的…...
拆解两款低压MOS芯片:4606和8205A,实测驱动电压低至0.7V,低压电路神器?
4606与8205A低压MOS芯片深度评测:0.7V驱动的电路革新实践 在低压电路设计领域,工程师们始终面临一个核心挑战:如何在有限电压下实现高效功率控制。传统MOS管通常需要较高的栅极驱动电压(普遍在2V以上),这限…...
如何快速搭建微信智能机器人:7步实现多AI服务自动回复
如何快速搭建微信智能机器人:7步实现多AI服务自动回复 【免费下载链接】wechat-bot 🤖一个基于 WeChaty 结合 ChatGPT / Claude / Kimi / DeepSeek / Ollama等Ai服务实现的微信机器人 ,可以用来帮助你自动回复微信消息,或者社群分…...
从概率图到优化问题:信息矩阵、Hessian矩阵与协方差矩阵的内在统一
1. 概率图模型中的信息矩阵与协方差矩阵 我第一次接触信息矩阵是在做视觉SLAM项目时,当时被一堆矩阵运算绕得头晕。后来才发现,理解它们的关系就像拼乐高——每个零件都有明确的位置和作用。让我们从一个简单的因子图例子开始,看看这些矩阵如…...
YOLO-ONNX-Java分布式推理架构设计与实现
YOLO-ONNX-Java分布式推理架构设计与实现 引言:单机推理的性能瓶颈 在实际的AI视觉识别项目中,随着业务规模的扩大,单机推理往往面临以下挑战: 并发处理能力有限:单台服务器无法同时处理大量视频流GPU资源利用率低&…...
ATmega328P烧录Bootloader报错?别急着换芯片,可能是签名搞的鬼(附avrdude.conf修改教程)
ATmega328P烧录Bootloader报错?别急着换芯片,可能是签名搞的鬼(附avrdude.conf修改教程) 当你兴致勃勃地准备给新买的ATmega328P芯片烧录Bootloader时,突然弹出一串红色报错信息,那种心情就像煮熟的鸭子飞走…...
模板 ID 配置化: “公众号路由 + 模板消息发送” 封装成一个干净的业务 Service
文章目录 引言 I “公众号路由 + 模板消息发送” 多公众号 同模板不同 ID 公众号实例 公众号路由 模板消息发送 Service(业务层 ✅) 异步调用 II 公众号账号配置【升级版】 账号配置 启用配置 模板 ID 解析器 公众号 Router(升级版 ✅) III 路由(Redis 版本) WxRedisOps…...
为什么你需要FFmpeg Batch AV Converter:视频批量处理的终极解决方案
为什么你需要FFmpeg Batch AV Converter:视频批量处理的终极解决方案 【免费下载链接】ffmpeg_batch FFmpeg Batch AV Converter 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg_batch 如果你经常需要处理大量视频文件,一定经历过这样的烦恼…...
FPGA与Jetson异构计算:破解机器视觉高带宽实时处理难题
1. 项目概述:当FPGA遇上Jetson,一台为视觉而生的“小钢炮”在机器视觉和工业检测这个行当里干了十几年,我经手过不少号称“高性能”的嵌入式系统。它们要么是体积硕大、功耗惊人的工控机,要么是接口单一、扩展性堪忧的嵌入式板卡。…...
终极指南:如何快速免费挂机Steam游戏时长获取交易卡牌
终极指南:如何快速免费挂机Steam游戏时长获取交易卡牌 【免费下载链接】HourBoostr Two programs for idling Steam game hours and trading cards 项目地址: https://gitcode.com/gh_mirrors/ho/HourBoostr 还在为Steam交易卡牌掉落机制而烦恼吗?…...
