ARM32开发——(十八)RTC实时时表

2024-08-28 08:20

本文主要是介绍ARM32开发——(十八)RTC实时时表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. RTC内置实时时钟

1.1 RTC时钟介绍

RTC是实时时钟(Real-Time Clock)的缩写。它是一种硬件模块或芯片,用于提供准确的日期和时间信息。

GD32F407上有RTC的外设,它提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BCD码的形式显示。

RTC本质上就是一个1秒计数器,通过秒来换算出时间。因此需要我们提供一个1HZ频率的时钟。

1.2 RTC结构框图

1.3 RTC原理图

1.4 RTC时钟电源

RTC时钟分为两个电源域。RTC的核心部分位于备份域中。系统复位或从待机模式唤醒时,RTC的设置和时间都保持不变。另一部分包括APB接口及一组控制寄存器位于VDD电源域中。

1.5 RTC的配置流程

2. RTC时钟备份寄存器

RTC时钟有20个32位(共80字节)通用备份寄存器,能够在省电模式下保存数据。通过备份寄存器可以实现只配置一次时间即可。

注意:如果在尝试向RTC_BKP0写入数据之前或之后调用了rcu_bkp_reset_enable(),那么这确实会导致写入的数据在系统复位后丢失,因为RTC备份寄存器会被复位重置。因此,要确保在向RTC备份寄存器写入数据并期望这些数据在复位后仍然有效时,不能调用rcu_bkp_reset_enable()。

if( RTC_BKP0 == 0xf234 ){	//说明不是第一次初始化,可以不用重新设置时间
}else{//如果后备寄存器0 的值 不为 0XF234//设置后备寄存器0的值为 0XF234,标记已经初始化过RTCRTC_BKP0 = 0xf234;//初始化RTC时间RtcTimeConfig(0x23,0x07,0x12,0x03,0x12,0x59,0x50);
}

3. RTC闹钟Alarm 

3.1 开发流程

  • 配置RTC时钟

  • 设置RTC闹钟

  • 配置RTC闹钟中断

  • 实现中断函数

3.1.1 RTC闹钟初始化
// RTC Alarm ---------------------------
rtc_alarm_struct rat;
// 设置忽略的选项 (让闹钟在每分钟的xx秒都执行)
rat.alarm_mask  = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK; 
// 设置忽略的选项 (让闹钟在每小时的xx分钟xx秒都执行)
//  rat.alarm_mask  = RTC_ALARM_DATE_MASK | RTC_ALARM_HOUR_MASK; 
// 设置忽略的选项 (让闹钟在每天的xx小时xx分钟xx秒都执行)
//  rat.alarm_mask  = RTC_ALARM_DATE_MASK; // 设置选择日期/周  25日/周6 23:59:58
rat.weekday_or_date = RTC_ALARM_DATE_SELECTED;
rat.alarm_day     = 0x25; // 日期
rat.alarm_hour    = 0x23; // 小时
rat.alarm_minute  = 0x59;  // 分钟
rat.alarm_second  = 0x58;  // 秒
rat.am_pm = RTC_PM;		  // AM上午,PM下午
rtc_alarm_config(RTC_ALARM0, &rat);// NVIC -----------------------------------
nvic_irq_enable(RTC_Alarm_IRQn, 2, 2);
// 启用alarm0中断
rtc_interrupt_enable(RTC_INT_ALARM0);
// 清理alarm0标记
rtc_flag_clear(RTC_FLAG_ALRM0);
/* 启用enable RTC alarm */
rtc_alarm_enable(RTC_ALARM0);// EXTI --------------------------------------
// 先清理EXTI_17 ALARM0标记
exti_interrupt_flag_clear(RTC_EXTI_LINE);
exti_flag_clear(RTC_EXTI_LINE);
// 初始化EXTI_17 (必须初始化)
exti_init(RTC_EXTI_LINE,EXTI_INTERRUPT,EXTI_TRIG_RISING);
exti_interrupt_enable(RTC_EXTI_LINE);
3.2.2 中断函数
#define RTC_EXTI_LINE   EXTI_17// 闹铃中断
void RTC_Alarm_IRQHandler(void){// 以下判断,二选其一即可if(SET == rtc_flag_get(RTC_FLAG_ALRM0)){rtc_flag_clear(RTC_FLAG_ALRM0);exti_flag_clear(RTC_EXTI_LINE);printf("Alarm_1!\n");}//  if(SET == exti_interrupt_flag_get(RTC_EXTI_LINE)){
//    exti_interrupt_flag_clear(RTC_EXTI_LINE);
//    exti_flag_clear(RTC_EXTI_LINE);
//    rtc_flag_clear(RTC_FLAG_ALRM0);
//    printf("Alarm_2!\n");
//  }}
3.3.3 完整代码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart.h"// 十位取出左移4位 + 个位 (得到BCD数)
#define WRITE_BCD(val) 	((val / 10) << 4) + (val % 10)
// 将高4位乘以10 + 低四位 (得到10进制数)
#define READ_BCD(val) 	(val >> 4) * 10 + (val & 0x0F)void Usart0_recv(uint8_t *data, uint32_t len) {printf("%s\r\n", data);
}static void RTC_config() {// 电池管理加载rcu_periph_clock_enable(RCU_PMU);pmu_backup_write_enable();// 重置备份域(不重置可能导致无法设置晶振,出现不走字情况)/* reset backup domain */rcu_bkp_reset_enable();rcu_bkp_reset_disable();// 晶振加载rcu_osci_on(RCU_LXTAL);rcu_osci_stab_wait(RCU_LXTAL);rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);// RTC功能加载rcu_periph_clock_enable(RCU_RTC);rtc_register_sync_wait();rtc_parameter_struct rps;rps.year = WRITE_BCD(23);rps.month = WRITE_BCD(04);rps.date = WRITE_BCD(20);rps.day_of_week = WRITE_BCD(04);rps.hour = WRITE_BCD(23);rps.minute = WRITE_BCD(59);rps.second = WRITE_BCD(55);rps.display_format = RTC_24HOUR;rps.am_pm = RTC_AM;rps.factor_asyn = 0x7F;rps.factor_syn = 0xFF;rtc_init(&rps);
}static void RTC_read() {rtc_parameter_struct rps;rtc_current_time_get(&rps);uint16_t year = READ_BCD(rps.year) + 2000;uint8_t month = READ_BCD(rps.month);uint8_t date = READ_BCD(rps.date);uint8_t week = READ_BCD(rps.day_of_week);uint8_t hour = READ_BCD(rps.hour);uint8_t minute = READ_BCD(rps.minute);uint8_t second = READ_BCD(rps.second);printf("%d-%d-%d %d %d:%d:%d\r\n", year, month, date, week, hour, minute, second);
}static void ALARM_config() {// 闹钟外部中断exti_flag_clear(EXTI_17);exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);// 重置闹钟rtc_alarm_disable(RTC_ALARM0);rtc_alarm_struct ras;ras.alarm_mask = RTC_ALARM_HOUR_MASK | RTC_ALARM_MINUTE_MASK | RTC_ALARM_SECOND_MASK;ras.weekday_or_date = RTC_ALARM_DATE_SELECTED;ras.alarm_day = 0x21;ras.alarm_hour = WRITE_BCD(23);ras.alarm_minute = WRITE_BCD(59);ras.alarm_second = WRITE_BCD(59);ras.am_pm = RTC_AM;rtc_alarm_config(RTC_ALARM0, &ras);// 中断配置nvic_irq_enable(RTC_Alarm_IRQn, 2, 2);rtc_interrupt_enable(RTC_INT_ALARM0);rtc_flag_clear(RTC_FLAG_ALRM0);rtc_alarm_enable(RTC_ALARM0);
}void RTC_Alarm_IRQHandler() {if (SET == rtc_flag_get(RTC_FLAG_ALRM0)) {// 处理RTC闹钟中断printf("alarm \r\n");}rtc_flag_clear(RTC_FLAG_ALRM0);exti_flag_clear(EXTI_17);
}int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);systick_config();Usart0_init();RTC_config();ALARM_config();while(1) {RTC_read();delay_1ms(1000);}
}

3.2 闹钟Bug处理

如果Alarm闹钟未正确触发,或是频繁触发,先检查编译环境配置,尝试把Optimization等级分别调整为-O2 -O3-Ofast 后再编译烧录。

这篇关于ARM32开发——(十八)RTC实时时表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114235

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安