在使用HAL库驱动RTC的时候,遇到过一个BUG,那就是读出来的时间没有变化,后来找到原因。
那就是在读取RTC时间的时候必须日期和时间一起读,且最好保证先读时间,再读日期。
在 HAL_RTC_GetDate 这个函数中有如下注释:
* @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
* in the higher-order calendar shadow registers to ensure consistency between the time and date values.
* Reading RTC current time locks the values in calendar shadow registers until Current date is read.
原因就是要在 高精度日历影子寄存器 中确保时间和日期值之间的一致性,读取RTC当前时间的值会锁定日历影子寄存器中的值。直到读取当前日期后才会解锁。
意思就是想要获取实时时间,必须时间与日期一起读。否则下次读取时间读到的就是之前被锁定的时间值。所以时间没有变化。
关键字:HAL库 RTC 定时器
引用地址:
HAL库_RTC定时器时间卡住
推荐阅读最新更新时间:2024-11-09 11:04
8052定时器2的用法
学了51单片机之后,开发板上的CPU是STC89S52RC的,就是说52单片机,里面比51的多了一个定时器2看了很多书,就是没怎么理解,于是乎决定看AT89S52的数据手册,翻译一遍,可能会加深自己的理解,以后对C8051F的单片机也好好预热一下。 定时计数器2是一个16位定时/计数器,通过T2CON寄存器的C/T2位可以选择定时还是计数功能。定时器2 有3种操作模式:捕获、自动重新装载(递增或递减计数)和波特率发生器,这3种模式由T2CON 中的位进行选择,具体的选择方式见表1。定时器2有两个8为寄存器:TH2和TL2。在定时模式状态下,TL2寄存器每一个机器周期加1,。由于52单片机的每一个机器周期等于12的振荡周期,所以他的
[单片机]
中断&定时器(二)
1、中断 上图即为中断过程示意图,产生中断的请求源被称为中断源,中断源向CPU提出的处理请求被称为中断请求或中断申请。CPU暂时中止当前的事件,转去处理中断请求所对应的事件称为CPU的中断响应过程,对事件的整个处理过程称为中断服务(中断处理)。处理完毕后,返回到原先被中止的地方称为中断返回。 80C51中断系统结构: 80C51的终端系统有5个中断源(52有6个),两个 优先级 ,可以实现二级中断嵌套。 2、51单片机的定时/计数器 51 单片机 有两个定时/计数器T0和T1,为16位可编程计数器,定时器的实质是加1计数器(16位),由低8位和高8位两个寄存器组成,最大计数值为65535个计数脉冲。 该加
[单片机]
STM32的HAL库与标准库的区别
新手在入门 STM32 的时候,一般大多数都会选用标准库和 HAL 库,而极少部分人会通过直接配置寄存器进行开发。 对于刚入门的朋友,可能没法直观了解这些不同开发发方式之间的区别,本文试图以一种非常直白的方式,用自己的理解去将这些东西表述出来。 配置寄存器 不少先学了 51单片机的朋友可能会知道,会有一小部分人或教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了 STM32 就变得不太容易行得通了。 因为 STM32 的寄存器数量是 51单片机的十数倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。也有人喜欢去直接操作寄存器,因为这样更接近原理,代码更
[单片机]
【STM32】HAL库-嵌套向量中断控制器NVIC
中断与异常 嵌套向量中断控制器,简称为NVIC,其支持为数众多的系统异常和外部中断。 Cortex-M3支持256个中断。 中断/异常类型表如下 编号为 1-15 的称为系统异常(注意:没有编号为 0 的异常),大于等于 16 的称为(外部)中断。 除了个别异常的优先级被定死外,其它中断/异常的优先级都是可编程的 外部中断表如下 优先级 在 CM3 中,优先级对于异常来说很关键的,它会决定一个异常是否能被掩蔽,以及在未掩蔽的情况下何时可以响应。优先级的数值越小,则优先级越高。 CM3 支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。 有3个系统异常的优先级是固定的,并且是负数,分别
[单片机]
51单片机定时器、串口、中断
MCS-51功能单元 一、定时器&计数器 数量:两个可编程的16位的定时器/计数器T0和T1;都是16位加法计数结构;分为高8位和低8位;TH0、TL0,TH1、TL1; 定时器/计数器T0、T1是80C51的中断源之一,当数据寄存器溢出,则向CPU申请中断。数据寄存器的复位状态为0。为使计数值或定时值满足自己的要求,需预先将数据寄存器赋值,称为初值设定,中断中也要重新设定初值。 定时器和计数器本质:都是计数器,对下降沿进行计数,计数达到溢出后置为标志位或者进入中断; 两者的区别: 定时器是对内部的机械周期脉冲进行计数,每个脉冲都是一个机械周期;定时时间=机器周期*(2^L-初值) (L=13,16,8) 计数器则是通过外
[单片机]
STC15F104W使用定时器0模拟串口
#include reg51.h #include intrins.h //定义波特率常量 //BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12) //NOTE: (FOSC / 3 / BAUDRATE)必须大于98,(建议增加110) //#define BAUD 0xF400 // 1200bps @ 11.0592MHz #define BAUD 0xFA00 // 2400bps @ 11.0592MHz //#define BAUD 0xFD00 // 4800bps @ 11.0592MHz //#defin
[单片机]
STM32片内RTC亚秒特性以及应用演示的分享
绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。本文中的有关截图若无特别说明均来自STM32L4系列参考手册。 RTC的时钟源【RTCCLK】可以是LSE、LSI或者HSE/32,由RTCCLK最终变成日历的秒脉冲驱动信号经过了2次分频。先经过上图中A处的异步分频单元,默认分频系数是128,形成ck_apre时钟,默认情况下该时钟频率为256Hz;然后该时钟脉冲来到图中B处的同步分频单元,默认分频系数为256,最终形成1Hz的秒脉冲【ck_spre】到日历单元。关于两分频单元分频系数的配置,通过对RTC_PRER寄存器的相关位编程实现。 其中异步分频系数配
[单片机]
51系列单片机定时器的实用方法
定时/计数器 0 和定时/计数器1都有4种定时模式。 16位定时器对内部机器周期进行技术,机器周期加1,定时器值加1,1MHZ模式下,一个机器周期为1us 。 定时器工作模式寄存器TMOD,不可位寻址,需整体赋值,高4位用于定时器1,第四位用于定时器0。 C/T:为定时器功能选择位,C/T=0对机器周期计数,C/T=1,对外部脉冲计数。 GATE:门控位,GATE=0,软件置位TRn即可启动计时器,GATE=1需外部中断引脚为高电平时才能软件置位TRn启动计时器,一般取GATE=0。 定时器控制寄存器TCON: TFn:Tn溢出标志位,当定时器溢出时,硬件置位TFn,中断使能的情况下,申请中断,CPU响应中断后,硬件自
[单片机]