零基础国产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 可以用于智能家居设备中的时间控制,如智能门锁、智能照明等。