STM32之RTC

RTC简介

实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。

普通定时器拿来作时钟可行吗?普通定时器无法掉电运行!

RTC特性:

1,能提供时间(秒钟数) 2,能在MCU掉电后运行 3,低功耗

常用的RTC方案

|----------|----------------|----------------|
| 对比因素 | 内部 RTC | 外置 RTC |
| 信息差异 | 提供秒/亚秒信号 | 提供秒信号和日历 |
| 功耗 | 功耗高 | 功耗低 |
| 体积 | 不用占用额外体积 | 体积大 |
| 成本 | 成本低 | 成本高 |

1,一般都需要设计RTC外围电路; 2,一般都可以给RTC设置独立的电源; 3,多数RTC的寄存器采用BCD码存储时间信息;

BCD码

时间戳

Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒

时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量

世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

UTC/GMT

GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致

时间戳转换

C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换

|-------------------------------------------------------------------|---------------------|
| 函数 | 作用 |
| time_t time(time_t*); | 获取系统时钟 |
| struct tm* gmtime(const time_t*); | 秒计数器转换为日期时间(格林尼治时间) |
| struct tm* localtime(const time_t*); | 秒计数器转换为日期时间(当地时间) |
| time_t mktime(struct tm*); | 日期时间转换为秒计数器(当地时间) |
| char* ctime(const time_t*); | 秒计数器转换为字符串(默认格式) |
| char* asctime(const struct tm*); | 日期时间转换为字符串(默认格式) |
| size_t strftime(char*, size_t, const char*, const struct tm*); | 日期时间转换为字符串(自定义格式) |

STM32 F1 RTC框图介绍

1,RTC预分频器

2,32位可编程计数器

3,待机唤醒

4,RTC控制寄存器与APB1接口

3个时钟源(HSE / 128) (LSI 40kHz) (LSE 32.768kHz)

RTC工作在后备区域,VDD掉电仍正常

F1 RTC相关寄存器介绍

后备寄存器和RTC寄存器特性(F1)

**部分寄存器写保护:**RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器不会被系统复位

**数据存储功能:**RTC和后备寄存器不会被系统或电源复位源复位;当从待机模式唤醒时,也不会被复位。 后备寄存器可用于保存掉电时的数据。

**独立工作:**RTC和后备寄存器通过一个开关供电,在VDD有效时该开关选择VDD供电,否则由VBAT引脚供电。在VBAT供电时仍可继续工作。

**2个独立复位:**APB1接口由系统复位;RTC核心只能由后备域复位;

RCC_APB1ENR寄存器

使能PWR && BKP时钟

PWR_CR寄存器

使能后备域和RTC的访问权限

RCC_BDCR寄存器

通过RCC_BDCR配置: 1,开启RTC时钟 2,开启LSE时钟; 3,选择RTC计数时钟源;

选择LSE的原因,见F1参考手册V10 59页关于RTC时钟的描述

RTC_CRL寄存器

RTC进入配置模式,关注的位

RTC_CRH寄存器

复位值为0,置1可开启相关中断

RTC_PRLH寄存器

使计数器每计数一次就是1秒,即需要32768分频。

RTC_PRLL寄存器

与RTC_PRL相似的寄存器RTC_DIV可以在不停止分频计数器的工作,获得预分频计数器的当前值。

RTC_CNTH寄存器

注意:进入配置模式才能对寄存器进行操作

RTC_CNTL寄存器

与RTC_CNT相似的寄存器还有RTC_ALR,这里就不做介绍。

RTC相关的HAL库驱动介绍(F1)

|----------------------------------------------|-------------------|--------------|
| 驱动函数 | 关联寄存器 | 功能描述 |
| HAL_RTC_Init (...) | CRL/CRH/PRLH/PRLL | 初始化RTC |
| HAL_RTC_MspInit (...) | 初始化回调 | 使能RTC时钟 |
| HAL_RCC_OscConfig (...) | RCC_CR/PWR_CR | 开启LSE时钟源 |
| HAL_RCCEx_PeriphCLKConfig (...) | RCC_BDCR | 设置RTC时钟源为LSE |
| HAL_PWR_EnableBkUpAccess (...) | PWR_CR | 使能备份域的访问权限 |
| HAL_RTCEx_BKUP Write /Read**()** | BKP_DRx | 读/写备份域数据寄存器 |

以下是需要开启的时钟源: __HAL_RCC_RTC_ENABLE()

__HAL_RCC_PWR_CLK_ENABLE()

__HAL_RCC_BKP_CLK_ENABLE()

RTC基本驱动步骤(F1)

时间设置和读取

由于F1的RTC没有日历寄存器,使用时只存储总秒数,不利于直接设置和显示,所以我们还需要编写函数把时间变成我们日常的日历时间

|----------------------------------------|--------------|
| 驱动函数 | 功能描述 |
| rtc_get_time (...) | 总秒数转成日历时间 |
| rtc_is_leap_year(...) | 判断是否闰年 |
| uint8_t rtc_get_week (...) | 计算公历日历对应的星期几 |
| static long rtc_date2sec(...) | 日历时间转成对应总秒数 |

全局的结构体变量calendar存储时间信息

相关推荐
清风6666663 小时前
基于STM32单片机的OneNet物联网粉尘烟雾检测系统
stm32·单片机·物联网·毕业设计·课程设计
源远流长jerry7 小时前
STM32之RTOS移植和使用
stm32·单片机·嵌入式硬件
范纹杉想快点毕业14 小时前
ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)嵌入式编程 C语言 c++ 软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·51单片机
乔宕一16 小时前
stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
c++·stm32·嵌入式硬件
范纹杉想快点毕业17 小时前
STM32 串口接收数据包(自定义帧头帧尾)
stm32·单片机·嵌入式硬件
茯苓gao17 小时前
STM32G4 电流环闭环
笔记·stm32·单片机·嵌入式硬件·学习
单片机系统设计18 小时前
基于stm32的环境监测系统/智能家居/空气质量监测系统
stm32·单片机·嵌入式硬件·毕业设计·智能家居
不知所云,19 小时前
5. STM32 时钟系统分配
stm32·单片机·嵌入式硬件
糖糖单片机设计21 小时前
硬件开发_基于物联网的沼气池环境监测系统
stm32·单片机·嵌入式硬件·物联网·51单片机