GD32F407单片机开发入门(十七)内部RTC实时时钟及实战含源码

文章目录

    • 一.概要
    • 二.RTC基本特点
    • 三.GD32单片机RTC内部结构图
    • 四.配置一个RTC走秒例程
    • 五.工程源代码下载
    • 六.小结

一.概要

RTC(Real-Time Clock)是一种用于追踪和记录实际时间的时钟系统。RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BCD码的形式显示。RTC可以进行夏令时补偿。RTC可以工作在省电模式下,并通过软件配置来智能唤醒。RTC支持外接更高精度的低频时钟,用以达到更高的日历精度。

本文介绍了GD32 RTC实时时钟的基本概念,内部结构,以及用内部RTC进行时间计时的例程。

二.RTC基本特点

1.通过软件设置来实现夏令时补偿
2.参考时钟检测功能:通过外接更高精度的低频率时钟源(50Hz或60Hz)来提高日历精度
3.数字校准功能:通过调整最小时间单位(最大可调精度0.95ppm)来进行日历校准
4.通过移位功能进行亚秒级调整
5.记录事件时间的时间戳功能
6.两个模式可配置的独立的侵入检测
7.可编程的日历和两个位域可屏蔽的闹钟
8.可屏蔽的中断源: 闹钟0和闹钟1,时间戳检测,侵入检测,自动唤醒事件
9.20个32位(共80字节)通用备份寄存器,能够在省电模式下保存数据。当有外部事件侵入时,备份寄存器将会复位

三.GD32单片机RTC内部结构图

RTC内部结构图如下

在这里插入图片描述
RTC单元有三个可选的独立时钟源:LXTAL、IRC32K和HXTAL的2-31(由RCU_CFG寄存器配置)分频后的时钟。
ck_spre用于为日历寄存器提供时钟,每个时钟增加一秒。
异步预分频器(Asynchronous Prescaler):将输入时钟分频为中间频率(如从32.768 kHz分频至1 kHz)。异步分频器主要用来降低功率消耗。
同步预分频器(Synchronous Prescaler):进一步分频中间频率至1 Hz信号,驱动计数器。
可编程闹钟:通过比较器匹配计数器值,触发中断或唤醒事件。

四.配置一个RTC走秒例程

STLINK接GD32F407VET6开发板,STLINK接电脑USB口。

在这里插入图片描述

主要代码

#define RTC_CLOCK_SOURCE_LXTAL //配置时钟源为外部32.768K晶振/*!\brief    get current time and date\param[in]  none\param[out] rtc_initpara_struct: pointer to a rtc_parameter_struct structure which contains parameters for initialization of the rtc peripheralmembers of the structure and the member values are shown as below:year: 0x0 - 0x99(BCD format)month: RTC_JAN, RTC_FEB, RTC_MAR, RTC_APR, RTC_MAY, RTC_JUN,RTC_JUL, RTC_AUG, RTC_SEP, RTC_OCT, RTC_NOV, RTC_DECdate: 0x1 - 0x31(BCD format)day_of_week: RTC_MONDAY, RTC_TUESDAY, RTC_WEDSDAY, RTC_THURSDAYRTC_FRIDAY, RTC_SATURDAY, RTC_SUNDAYhour: 0x0 - 0x12(BCD format) or 0x0 - 0x23(BCD format) depending on the rtc_display_format choseminute: 0x0 - 0x59(BCD format)second: 0x0 - 0x59(BCD format)factor_asyn: 0x0 - 0x7Ffactor_syn: 0x0 - 0x7FFFam_pm: RTC_AM, RTC_PMdisplay_format: RTC_24HOUR, RTC_12HOUR\retval     none
*/
void rtc_current_time_get(rtc_parameter_struct* rtc_initpara_struct)
{uint32_t temp_tr = 0U, temp_dr = 0U, temp_pscr = 0U, temp_ctlr = 0U;temp_tr = (uint32_t)RTC_TIME;   temp_dr = (uint32_t)RTC_DATE;temp_pscr = (uint32_t)RTC_PSC;temp_ctlr = (uint32_t)RTC_CTL;/* get current time and construct rtc_parameter_struct structure */rtc_initpara_struct->year = (uint8_t)GET_DATE_YR(temp_dr);rtc_initpara_struct->month = (uint8_t)GET_DATE_MON(temp_dr);rtc_initpara_struct->date = (uint8_t)GET_DATE_DAY(temp_dr);rtc_initpara_struct->day_of_week = (uint8_t)GET_DATE_DOW(temp_dr);  rtc_initpara_struct->hour = (uint8_t)GET_TIME_HR(temp_tr);rtc_initpara_struct->minute = (uint8_t)GET_TIME_MN(temp_tr);rtc_initpara_struct->second = (uint8_t)GET_TIME_SC(temp_tr);rtc_initpara_struct->factor_asyn = (uint16_t)GET_PSC_FACTOR_A(temp_pscr);rtc_initpara_struct->factor_syn = (uint16_t)GET_PSC_FACTOR_S(temp_pscr);rtc_initpara_struct->am_pm = (uint32_t)(temp_pscr & RTC_TIME_PM); rtc_initpara_struct->display_format = (uint32_t)(temp_ctlr & RTC_CTL_CS);
}
void rtc_show_time(void)
{rtc_current_time_get(&rtc_initpara);  
}
//初始化时间设置
void rtc_setup(void)
{/* setup RTC time value */uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF;rtc_initpara.factor_asyn = prescaler_a;rtc_initpara.factor_syn = prescaler_s;rtc_initpara.year = 0x16;//设置初始化时间:年rtc_initpara.day_of_week = RTC_SATURDAY;rtc_initpara.month = RTC_APR;//设置初始化时间:月rtc_initpara.date = 0x30;//设置初始化时间:日rtc_initpara.display_format = RTC_24HOUR;rtc_initpara.am_pm = RTC_AM;rtc_initpara.hour = 00; //设置初始化时间:时  rtc_initpara.minute = 00;//设置初始化时间:分rtc_initpara.second = 00;//设置初始化时间:秒/* RTC current time configuration */if(ERROR == rtc_init(&rtc_initpara)){    }else{rtc_show_time();RTC_BKP0 = BKP_VALUE;}
}
uint8_t aShowTime[16] = "hh:ms:ss";//定义时分秒
uint8_t aShowDate[16] = "dd-mm-yyyy";//定义年月日
int main(void)
{systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)/* enable PMU clock */rcu_periph_clock_enable(RCU_PMU);/* enable the access of the RTC registers */pmu_backup_write_enable();rtc_pre_config();//配置RTCrtc_setup(); //设置时间2016年4月30日,0点0分0秒while(1){delay_1ms(500);//500ms等待rtc_show_time();//读取时间sprintf((char *)aShowTime, "%2x:%2x:%2x", rtc_initpara.hour, rtc_initpara.minute, rtc_initpara.second);sprintf((char *)aShowDate, "%2x-%2x-%2x", rtc_initpara.month, rtc_initpara.date, 0x2000 + rtc_initpara.year);}
}

实验效果

时分秒变量会走秒,如下图所示,把aShowTime数组放入Memory查看窗口。
在这里插入图片描述

五.工程源代码下载

源码下载链接如下:
CSDN

六.小结

RTC 可以为嵌入式系统提供精确的时间基准,用于各种定时任务和事件。RTC 可以用于智能家居设备中的时间控制,如智能门锁、智能照明等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新能源汽车运动控制器核心芯片选型与优化:MCU、DCDC与CANFD协同设计

摘要:随着新能源汽车产业的迅猛发展,汽车运动控制器的性能和可靠性面临着更高的要求。本文深入探讨了新能源汽车运动控制器中MCU(微控制单元)、DCDC电源管理芯片和CANFD总线通信芯片的选型要点、优化策略及其协同设计方案。通过综…

2.maven 手动安装 jar包

1.背景 有的时候,maven仓库无法下载,可以手动安装。本文以pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar为例。 2.预先准备 下载文件到本地指定位置。 2.1.安装pom mvn install:install-file \-Dfile/home/wind/tmp/pentaho-aggdesigner-5.1.5-jh…

OpenCV 图形API(75)图像与通道拼接函数-----将 4 个单通道图像矩阵 (GMat) 合并为一个 4 通道的多通道图像矩阵函数merge4()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 由4个单通道矩阵创建一个4通道矩阵。 该函数将多个矩阵合并为一个单一的多通道矩阵。也就是说,输出矩阵的每一个元素都是输入矩阵对…

AI日报 · 2025年05月02日 | 再见GPT-4!OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除

1、OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除 在处理 GPT-4o 更新问题的同时,OpenAI CEO Sam Altman 于 5 月 1 日在 X 平台发文,正式确认初代 GPT-4 模型已从 ChatGPT 主用户界面中移除。此举遵循了 OpenAI 此前公布的计划,即在 4 …

patch命令在代码管理中的应用

patch 是一个用于将差异文件(补丁)应用到源代码的工具,常用于修复 bug、添加功能或调整代码结构。在您提供的代码中,patch 命令通过一系列补丁文件(.patch)修改了 open-amp 库的源代码。 patch 命令的核心作…

spring-ai集成langfuse

1、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

PyTorch 与 TensorFlow:深度学习框架的深度剖析与实战对比

PyTorch 与 TensorFlow&#xff1a;深度学习框架的深度剖析与实战对比 摘要 &#xff1a;本文深入对比 PyTorch 与 TensorFlow 两大深度学习框架&#xff0c;从核心架构、优缺点、适用场景等多维度剖析&#xff0c;结合实例讲解&#xff0c;帮助开发者清晰理解两者特性&#x…

如何配置NGINX作为反向代理服务器来缓存后端服务的响应?

大家好&#xff0c;我是锋哥。今天分享关于【如何配置NGINX作为反向代理服务器来缓存后端服务的响应&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何配置NGINX作为反向代理服务器来缓存后端服务的响应&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…

DiT:文档图像Transformer 的自监督预训练

摘要 图像transformer&#xff08;Image Transformer&#xff09;最近在自然图像理解方面取得了显著进展&#xff0c; 无论是使用监督&#xff08;ViT、DeiT等&#xff09;还是自监督&#xff08;BEiT、MAE等&#xff09;预训练技术。在本文中&#xff0c;我们提出了DiT&#…

51c嵌入式~电路~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/11888986 一、电流检测电路 电流检测的应用 电路检测电路常用于&#xff1a;高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流检测等场景。电路专辑 对于大部分应用&#xff…

【Git】万字详解 Git 的原理与使用(上)

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 初识 Git1.1 Git 是什么&#xff1f;1.2 为什么要有 Git 2. 安装 Git2.1 Linux-Ubuntu 安装 Git2.2 Windo…

【原创开发】无印去水印[特殊字符]短视频去水印工具[特殊字符]支持一键批量解析

支持&#xff1a;快手&#xff0c;抖音&#xff0c;小红书&#xff0c;哔哩哔哩&#xff0c;等多款应用去水印&#xff0c;支持图集解析下载 【应用名称】&#xff1a;无印 【应用版本】&#xff1a;1.3 【应用大小】&#xff1a;17M 【测试机型】&#xff1a;小米14 【下载链…

qemu(3) -- qemu-arm使用

1. 前言 qemu中有很多的特技&#xff0c;此处记录下qemu-arm的使用方式&#xff0c;简单来说qemu-system-xx用于虚拟整个设备&#xff0c;包括操作系统的运行环境&#xff0c;而qemu-xx仅虚拟Linux应用程序的环境&#xff0c;不涉及操作系统&#xff0c;应用程序的系统调用有宿…

Docker的简单使用(不全)

Docker Hello World Docker 允许在容器内运行应用程序&#xff0c;使用docker run命令来在容器内运行一个应用程序 输出Hello World runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world docker&#xff1a;Docker的二进制执行文件 run…

SALOME源码分析: 命令系统

本文分析SALOME中命令系统&#xff0c;涉及的知识点包括&#xff0c; MDF框架数据对象模型 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。注2&#xff1a;文章内容会不定期更新。 一、命令对象 1.1 Class Hierarchy 1.2 SUIT_Operation #…

Bootstrap(自助法)​​:无需假设分布的统计推断工具

核心思想​​ Bootstrap 是一种​​重采样&#xff08;Resampling&#xff09;技术​​&#xff0c;通过在原始数据中​​有放回地重复抽样​​&#xff0c;生成大量新样本集&#xff0c;用于估计统计量&#xff08;如均值、方差&#xff09;的分布或模型性能的不确定性。 ​​…

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸&#xff08;Python沙盒逃逸深度解析&#xff09; 一、沙盒逃逸的核心目标 执行系统命令 通过调用os.system、subprocess.Popen等函数执行Shell命令&#xff0c;例如读取文件或反弹Shell。 文件操作 读取敏感文件&#xff08;如/etc/passwd&#xff09;、写入后门文件…

融智学数学符号体系的系统解读(之一)

融智学数学符号体系的系统解读 一、道函数&#xff08;Dao Function&#xff09; 数学表达式&#xff1a; f(x,y,z)0&#xff08;狭义&#xff09; f(x,y,z,ict)0&#xff08;广义&#xff09; 符号解析&#xff1a; x: 形象思维坐标轴 数学意义: 表征基于感官输入的多模…

Java 中使用正则表达式

1. 引入包 在使用正则表达式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 :这些是正则表达式中的特殊字符,用于匹配特定的模式。 . :匹配任意单个字符(换行符除外)。例如,a.b 可以匹配 "acb&quo…

cat file.tar.gz | tar -xzf - -C /target/dir两个减号之间为什么有个空格?是写错了吗?(管道命令后续)

在 tar 命令的参数 -xzf - -C 中&#xff0c;两个减号&#xff08;-&#xff09;之间的空格是故意保留的语法&#xff0c;没有写错。具体原因如下&#xff1a; 1. -xzf - 的语法解析 -xzf 是 tar 命令的组合参数&#xff1a; x&#xff1a;表示解压&#xff08;extract&#x…