在GD32105R_STAR的开发板中,也许是处于PCB板面积的考虑,RTC和后备寄存器由VDD进行同意供电,当然在以后的设计中也可以选用VBAT引脚进行供电。
GD32 105R_STAR的RTC具有一个32位的可编程计数器,可以通过适当的软件提供日历时钟功能,还具有闹钟中断和阶段性中断功能。RTC的驱动时钟使用外部晶体的32.768kHz的振荡器,内部有一个20位的预分频器用于时基时钟,默认情况下时钟为32.768kHz时,它将产生一个1秒长的时间基准。
在使用RTOS嵌入式操作系统时,为保证系统的有效运行,都需要有一个统一的系统时钟,此时RTC通常被选为系统的时基,本设计中通过对RTC的初始化设置,使其产生1秒的周期定时,RTC初始化代码如下:
/*
****************************************************************************
*函数名称:void RTC_Configuration(void)
*函数功能: RTC初始化配置函数
*入口参数:
*出口参数:
*日期:2015 4 6
*版本:V1.0
*作者:yrj
****************************************************************************
*/
void RTC_Configuration(void)
{
/*初始化时间寄存器*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /*给后备域提供时钟*/
PWR_BackupAccessCmd(ENABLE); /*使能写 Backup domain */
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON); /*打开外部低频晶振*/
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);/*等待外部低频晶振工作正常*/
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /*外部低频晶振作为RTC晶振源*/
RCC_RTCCLKCmd(ENABLE); /*使能RTC*/
RTC_WaitForSynchro(); /*等待RTC寄存器与RTC_APB时钟同步*/
RTC_WaitForLastTask(); /*等待最近一次对RTC寄存器的写操作完成*/
RTC_ITConfig(RTC_IT_SEC, ENABLE);/* 使能RTC秒中断*/
RTC_WaitForLastTask(); /*等待最近一次对RTC寄存器的写操作完成*/
RTC_SetPrescaler(32767);/*预分频(32.768 KHz)/(32767+1)*/
RTC_WaitForLastTask(); /*等待最近一次对RTC寄存器的写操作完成*/
}
/*
****************************************************************************
*函数名称:u8 RTC_Set(uint32 seccount )
*函数功能: 设置时钟
*入口参数:RTC计时初始值
*出口参数:
*日期:2015 4 6
*版本:V1.0
*作者:yrj
****************************************************************************
*/
u8 RTC_Set(uint32 seccount )
{
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器
RTC_WaitForLastTask();
RTC_SetCounter(seccount); /*设置时钟*/
RTC_WaitForLastTask();
return 0;
}
RTC中断服务函数,每秒钟进行一次中断,在中断函数中将LED的状态进行一次翻转。
/*
***************************************************************************
*函数名称:void RtcException(void)
*函数功能: RTC中断服务函数
*入口参数:无
*出口参数:无
*日期:2015 4 6
*版本:V1.0
*作者:yrj
***************************************************************************
*/
void RtcException(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)==SET)
{
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_SEC);
RTC_WaitForLastTask();
LED_STAT=~LED_STATE; /*LED状态每秒钟翻转一次*/
}
}