STM32系列里RTC的亚秒特性及功能(下)

发布者:和谐相处最新更新时间:2024-03-08 来源: elecfans关键字:STM32系列  RTC 手机看文章 扫描二维码
随时随地手机看文章

我们回到前面提到的需求,每隔50±20ms做唤醒,即30ms~70ms范围内实现唤醒都可以接受。如果说使用ALARM中断,相信很多人自然会想到,先设定一个ALARM点,等唤醒后再修改新的ALARM值,就这样延续下去。


这样操作也是可以的,即每次在ALARM中断里修改新的ALARM时间点。下图是对ALARM值进行编程的流程【设置时先要关闭ALARM,修改ALARM值后再手动开启ALARM单元】:


不过,结合眼前的应用需求,我们可以不使用上面的做法,而是巧妙地使用RTC亚秒特性来实现周期性的ALARM以满足需求。怎么个巧法呢?一起来看看。


先假定RTCCLK为32768Hz,RTC同步分频系数和异步分频系数分别为如下参数:

依据现有的分频配置,则亚秒的时间精度或者说分辨率为(1/256)秒,3.9ms的样子,即亚秒计数器每计1个脉冲所对应的时间就是3.9ms,算4ms吧。【记住这个数据后面要用】

谈到这里,我们跳跃一下思路,换个数学话题聊聊。【注:这个地方可能有点突兀。突兀的突悟往往离不开艰辛的修行。】

这里有从0开始按照从小到大排列的一批足够多的自然数列,按10进制展现。我们来看看几种情形:

1、如果找出只要个位数相同的数据,仍然按照从小到大排列,每相邻两个数的差值一定是10。对不对?

2、如果找出只要个位数与十位数都相同的数据,仍然按照从小到大排列,每相邻两个数的差值一定是100。没错吧。

3、如果找出只要个位数与十位数以及百位数都相同的数据 仍然按照从小到大排列,每相邻两个数的差值一定是1000。结论也没问题。

到此,我们应该发现规律了,通过关注低几位数相同而重新有序排列而成的相邻数据之差即为10的几次方,其实这里相邻数的差值也就是原自然数列中两个数的位置间隔。

好,我们不妨改变下数据的进制看看。还是从0开始按照从小到大排列的一批足够多的自然数列,按2进制展现。依然看看几种情形并得出相应结论。

1、若找出只要低1位数相同的数据,仍按照从小到大排列,每相邻两个数的差值一定是2;

2、若找出只要低2位数都相同的数据,仍按照从小到大排列,每相邻两个数的差值一定是4;

3、若找出只要低3位数都相同的数据 仍按照从小到大排列,每相邻两个数的差值一定是8;

其它我们可以依次类推。

同样,我们也发现规律,通过关注二进制数的低几位相同而重新有序排列而成的相邻数据之差即为2的几次方。

上面专门聊了一段纯数学话题,继续回到我们的亚秒应用问题。

我们知道,包括亚秒在内的整个日历数据实质上是个具有高低顺序和进位关系的数据,其中,亚秒是整个日历数据里的最低端。当我们设置ALARM参数时,如果说只关注亚秒的低1位,其它都不关心。基于前面的数学话题铺垫可知,每当出现低1位数据相同的两个相邻数,总是相差2个计数单位,这里就是2个计数脉冲。换言之,每隔2个计数脉冲,结合前面分析,即每隔8ms都会触发ALARM事件。

如果说只关注亚秒的低2位,其它都不关心,那么每当出现低2位数据相同的相邻数,总是相差4个计数单位,即4个计数脉冲。换言之,每隔4个计数脉冲,即16ms都会触发ALARM事件。

如果只关注亚秒的低3位,其它参数都不关心,每当出现低3位数据相同的相邻数,总是相差8个计数单位,即8个计数脉冲,每隔32ms都会触发ALARM事件。

其它依此类推。

谈到这里,设置的只关心亚秒的位数跟ALARM周期的关系应该说很清晰了。我在下面简单罗列了基于前面条件下亚秒的关心位数与ALARM周期的对应表:【灰色表示不关心,不参与日历值与ALARM设定值的比较,只有绿色位参与比较】

现在期望的唤醒周期是50±20ms,我们配置亚秒计数器的低3位或者低4位作为ALARM的比较位【说关心位、参与位什么的都可以】,其它设置为不关心就可以满足要求。我们不妨选择亚秒计数值的低4位参与比较,即每两次相邻ALARM相差16个计数脉冲,周期约为64ms。

下面是我使用CubeMx进行的日历和ALARM A的配置,重点看下ALARM配置。

这里的ALARM配置只选择亚秒的低4位参与比较,既然这样其它参数就无所谓了。其中那个用于比较的亚秒值我这里写的12,这个值写多少并不影响ALARM周期的拟定,只会影响每次发生ALARM事件时的亚秒计数器的低4位的值。其实,当我们选定只关心亚秒计数器的低4位时,重复ALARM的周期就已经定了。

完成配置、建立工程、组织测试代码。

我在ALARM中断里读取每次发生ALARM事件时的亚秒值。我截取几个连续ALARM事件的相关信息在如下几幅图。其中变量Sub_Value和stime1.SubSeconds是一个东西,表示发生ALARM事件时亚秒计数器的值。比如下面各截图中的236、220、204、188、172、156几个数,显然两相邻数的间隔保持准确的16个计数脉冲,若把这几个数转成2进制,他们的低4位都是1100B,即我在前面ALARM设置的亚秒比较值 12 。
若在每次的ALARM中断里把发生ALARM的时间点实时打印出来,可以清晰地看到相邻两次ALARM事件的时间间隔固定在63ms左右,这个值跟前面规划的基本一致。

有人或许会问,相邻ALARM事件的时间差为什么没有计数脉冲数差值那样稳定精准。我认为主要有两点原因,一是我测试时并没有使用标准的32768外部时钟,而是选择的内部LSI,它的频率一般在31Khz到33KHz之间,不像LSE那么精准。还有一个原因,在做亚秒时间计算时,因为无法整除原因肯定会带来计算偏差。

利用上面方法可以省去每次修改ALARM配置的操作,类似这种具有周期性且周期不大于1秒的应用都可以尝试考虑上述方法,必要的时候可以考虑调整同步分频系数即亚秒计数器的重装值以满足具体的时间精度要求。当然,调整同步分频系数的同时往往要调整异步分频系数,原则上异步分频系数要尽量大以充分降低RTC模块带来的功耗,具体应用时我们可以综合考虑后再做调整。


今天的STM32片内RTC亚秒特性以及应用演示的分享就到这里,抛砖引玉,愿君有所获。


关键字:STM32系列  RTC 引用地址:STM32系列里RTC的亚秒特性及功能(下)

上一篇:STM32为什么需要位带操作呢?
下一篇:使用STM32寄存器点亮LED灯

推荐阅读最新更新时间:2024-11-07 21:05

STM32笔记(五)RTC的初始化
RTC这东西晕晕的,因为一个模块涉及到了RTC,BKP,RCC多个模块,之间的关系让人有点模糊 入门的知识请大家看手册,我来总结: 总之,RTC只是个能靠电池维持运行的32位定时器over! 所以,使用时要注意以下问题: 1.上电后要检查备份电池有没有断过电。如何检查?恩,RTC的示例代码中已经明示: 往备份域寄存器中写一个特殊的字符,备份域寄存器是和RTC一起在断电下能保存数据的。 上电后检查下这个特殊字符是否还存在,如果存在,ok,RTC的数据应该也没丢,不需要重新配置它 如果那个特殊字符丢了,那RTC的定时器数据一定也丢了,那我们要重新来配置RTC了 这个过程包括时钟使能、RTC时钟源切换、设置分频系数等等,这个可以参考FW
[单片机]
LCD监视器开关电源功率开关调整器FS6M07652RTC
摘要:FS6M07652RTC由SenseFET及其控制IC组成,专门为LCD监视器电源和适配器设计。叙述了FS6M07652RTC的特点、应用电路和设计考虑。 关键词:LCD监视器;开关电源功率开关;调整器   1 引言 FS6M07652RTC是美国Fairchild公司为LCD监视器回扫式SMPS而专门设计的一种功率开关调整器。同其它Fairchild功率开关(简称FPS)一样,FS6M07652RTC是将带电流感测功能的MOSFET(被称作SenseFET)及其控制IC内置于同一封装之内,属于二合一组合器件。快捷(即仙童)FPS是在韩国三星功率开关(SPS)的基础上发展起来的功率开关调节器系列器件。几年前,快捷
[电源管理]
LCD监视器开关电源功率开关调整器FS6M07652<font color='red'>RTC</font>特
STM32F0xx_ RTC实时时钟配置详细过程
Ⅰ、概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下。 STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。 STM32F0的RTC模块和F1的RTC模块最大区别在于F0模块中有“DATE”和“TIME”寄存器,也就是可以直接读取寄存器里面的值,而F1是秒计数寄存器的值,需要通过相关算法下才能得到时间的值。 本文提供的软件工程里面还包含一个BKP模块,主要是用于掉电保持RTC数值(第一次上电初始化RTC,后面就不用初始化)。例程是在第一次初始化RTC值为:2016年6月5日 周七 12
[单片机]
STM32F0xx_ <font color='red'>RTC</font>实时时钟配置详细过程
pcf8563外部RTC驱动程序基于STM32F10x
#ifndef uchar #define uchar unsigned char #endif #define SEC 0x02 //秒寄存器 #define MIN 0x03 //分寄存器 #define HOUR 0x04 //时寄存器 #define DAY 0x05 //日寄存器 #define WEEK 0x06 //周寄存器 #define MONTH 0x07 //月寄存器 #define YEAR 0x08 //年寄存器 #define read_ADD 0xA3 //写器件地址 #define write_ADD 0xA2 //读器件地址 tm timer_8563; /
[单片机]
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建 硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线 软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options- Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。 name.txt内容 Setmem 0x53000000 0x00000000 3
[单片机]
mini2440裸机试炼之—<font color='red'>RTC</font>闹钟中断,节拍中断
STM32系列ADC采样频率及相应时间的确定
一、采样频率的确定 1.首先确定ADC 的时钟,这里需要看你的RCC的设置。在采用固件库的基础上,设定ADC的采样频率相对来说是很容易的。 (1)由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。 (2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同 RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); (3)在时钟配置寄存器(RCC_C
[单片机]
STM32】HAL库-RTC实时时钟
简介 实时时钟是一个独立的定时器 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。 时钟源 通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL 位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。 除非备份域复位,此选择不能被改变。
[单片机]
【<font color='red'>STM32</font>】HAL库-<font color='red'>RTC</font>实时时钟
STM32小白入门(第13天)-------RTC实时时钟和闹钟事件
一、RTC的概述 RTC就是实时时钟,详细英文 Real Time Clock。 二、详细描述 1.使用 2. 中断配置注意事项 三、程序设计 一)RTC唤醒事件 1. RTC的初始化 void rtc_init(void) { /* Enable the PWR clock ,使能电源时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC,允许访问RTC */ PWR_BackupAccessCmd(ENABLE); /* Enable the LS
[单片机]
<font color='red'>STM32</font>小白入门(第13天)-------<font color='red'>RTC</font>实时时钟和闹钟事件
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved