打印

【转】GD32105R例程---RTC秒中断

[复制链接]
2341|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Elric_QZH|  楼主 | 2015-8-30 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在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状态每秒钟翻转一次*/

   }

}


沙发
justperky| | 2015-8-30 23:02 | 只看该作者
在使用RTOS嵌入式操作系统时,为保证系统的有效运行,都需要有一个统一的系统时钟,此时RTC通常被选为系统的时基,不是有个滴答定时器用作RTOS的基准么,还用这个RTC干嘛

使用特权

评论回复
板凳
哆来咪| | 2015-8-31 18:01 | 只看该作者
一般用系统滴答定时器做OS的时间基准,不用RTC的

使用特权

评论回复
地板
eggbiscuit| | 2015-8-31 21:53 | 只看该作者
还不如用定时器方便了。如果要用作OS的话,用滴答定时器更好点

使用特权

评论回复
5
几时再见| | 2015-8-31 22:24 | 只看该作者
支持下,希望能有更多的资料来分享。

使用特权

评论回复
6
罗勋义| | 2015-8-31 23:12 | 只看该作者
谢谢楼主分享了!

使用特权

评论回复
7
vivilzb1985| | 2015-9-12 13:07 | 只看该作者
秒中断用的还是挺多的。

使用特权

评论回复
8
Elric_QZH|  楼主 | 2017-11-25 10:32 | 只看该作者
eggbiscuit 发表于 2015-8-31 21:53
还不如用定时器方便了。如果要用作OS的话,用滴答定时器更好点

确实滴答定时器多点。

使用特权

评论回复
9
xgfgli| | 2017-11-27 18:05 | 只看该作者
可以用系统滴答

使用特权

评论回复
10
电子信使| | 2017-11-27 21:25 | 只看该作者
RTC在STM32中,不太好用,不知道GD解决了吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

133

帖子

0

粉丝