当前位置: 首页 > news >正文

零基础国产GD32单片机编程入门(十四)内部RTC实时时钟及实战含源码

文章目录

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

一.概要

RTC(Real-Time Clock)是一种用于追踪和记录实际时间的时钟系统。在GD32中,实时时钟RTC通常被用作时钟日历。RTC电路分属于两个电源域:备份域和VDD电源域。位于
备份域中的RTC电路,包含一个32位的累加计数器、一个闹钟、一个预分频器、一个分频器以及RTC时钟配置寄存器,这意味着当系统复位或者从待机模式唤醒时,RTC的设置和时间都保持不变。

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

二.RTC基本特点

1.32位可编程计数器,用于计数运行时间
可编程的预分频器:分频系数最高可达220

2.独立时钟域:
A) PCLK1 时钟域
B) RTC 时钟域 (该时钟必须比PCLK1时钟至少慢4倍)

3.RTC 时钟源:
A) HXTAL时钟除以128
B) LXTAL 振荡电路时钟
C) IRC40K 振荡电路时钟

4.可屏蔽的中断源:
A) 闹钟中断
B) 秒中断
C) 溢出中断

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

RTC内部结构图如下

在这里插入图片描述
RTC电路包含两个主要部分,位于PCLK1时钟域的APB接口和位于RTC时钟域的RTC内核。
APB接口与APB1总线相连,包含一组寄存器,通过APB1总线可以对其进行访问。RTC内核包含两个主要模块。一个是RTC预分频模块,用来产生RTC时间基准时钟SC_CLK。 RTC预分频模块包含一个20位可编程分频器(RTC预分频器),该分频器可以通过对RTC时钟源分频产生SC_CLK。如果对RTC_INTEN寄存器中的秒中断标志位被使能,在每个SC_CLK上升沿,RTC会产生一个秒中断。另外一个模块是一个32 位可编程计数器,其数值可以被初始化为当前系统时间。
在RTC内核中,只有计数器和分频器寄存器为可读寄存器。这两个寄存器的值以及RTC标志会在每个RTC时钟的上升沿进行内部更新,并与APB1时钟进行重新同步。
我们一般读取RTC的时间就是读取计数器的值,再转换成当前时间。

四.配置一个RTC走秒例程

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

在这里插入图片描述

主要代码

extern  uint32_t timedisplay;
void RTC_IRQHandler(void)
{if (rtc_flag_get(RTC_FLAG_SECOND) != RESET){/* clear the RTC second interrupt flag*/rtc_flag_clear(RTC_FLAG_SECOND);/* enable time update */timedisplay = 1;/* wait until last write operation on RTC registers has finished */rtc_lwoff_wait();/* reset RTC counter when time is 23:59:59 */if (rtc_counter_get() == 0x00015180){rtc_counter_set(0x0);/* wait until last write operation on RTC registers has finished */rtc_lwoff_wait();}}
}__IO uint32_t timedisplay;//时间显示标志位,RTC_IRQHandler函数中置位
int main(void)
{rcu_ahb_clock_config(RCU_AHB_CKSYS_DIV1);//AHB主频是1分频systick_config();//系统主频108MHZ,采用外部晶振,由两个宏决定(__SYSTEM_CLOCK_108M_PLL_HXTAL与HXTAL_VALUE)rcu_periph_clock_enable(RCU_AF);//管脚复用时钟alternate function clock使能delay_1ms(1000);//等待1秒nvic_configuration();//中断配置rtc_configuration();//RTC配置rcu_periph_clock_enable(RCU_PMU);//电源管理使能pmu_backup_write_enable();//backup写使能/* wait for RTC registers synchronization */rtc_register_sync_wait();/* enable the RTC second */rtc_interrupt_enable(RTC_INT_SECOND);/* wait until last write operation on RTC registers has finished */rtc_lwoff_wait();while(1){delay_1ms(1000);//等待1秒time_show();//时间读取}
}uint32_t thh = 0, tmm = 0, tss = 0;//时分秒
void time_display(uint32_t timevar)
{/* compute  hours */thh = timevar / 3600;//时/* compute minutes */tmm = (timevar % 3600) / 60;//分/* compute seconds */tss = (timevar % 3600) % 60;//秒}/*!\brief      show the current time (HH:MM:SS) on the Hyperterminal\param[in]  none\param[out] none\retval     none
*/
void time_show(void)
{/* infinite loop */while (1){/* if 1s has paased */if (timedisplay == 1){/* display current time */time_display(rtc_counter_get());//获取计数器值,并转换成时间timedisplay = 0;}}
}

实验效果

时分秒变量会走秒
在这里插入图片描述

五.工程源代码下载

通过网盘分享的文件:16.RTC实时时钟.zip
链接: https://pan.baidu.com/s/11COGBQ-1hdinWHnNvraosw 提取码: y95a
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

六.小结

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


http://www.mrgr.cn/news/20227.html

相关文章:

  • 计算机大专生没有出路了吗?听听过来人怎么讲!
  • 面对市场变革,企业数字化转型的必要性与挑战何在?
  • 竟然有50万个使用Flutter开发的应用了,这也太牛了!
  • 如何缩放C#中的img
  • 司法军警行业ITSM案例分析报告
  • 解决Can‘t load tokenizer for ‘bert-base-chinese‘.问题
  • 【Linux】常见指令及权限相关知识详细梳理
  • linux基础IO——动静态库——实现与应用学习、原理深度解析
  • C++入门基础知识50——【关于C++数字】之C++ 数学运算
  • 解决linux云服务器ping不通另一台linux云服务器的问题
  • 下载适用于 Linux 的 MongoDB Shell教程
  • SpringBoot2:请求处理原理分析-FORM表单请求接口
  • stm32之SPI通信协议
  • llamaindex实现rag
  • Nginx 平滑升级指南
  • keysight346A安捷伦346B噪声源HP346B-18Ghz
  • 跟我一起写 SIPp XML scenario file
  • 巧用无限住宅代理打造价格监控系统
  • 【总结】CSS(SCSS) 不常用属性
  • linux 内核代码学习(八)