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

[复制链接]
2792|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初始化代码如下:
  1. /*

  2. ****************************************************************************

  3. *函数名称:void RTC_Configuration(void)

  4. *函数功能: RTC初始化配置函数

  5. *入口参数:

  6. *出口参数:

  7. *日期:2015 4 6

  8. *版本:V1.0

  9. *作者:yrj

  10. ****************************************************************************

  11. */

  12. void RTC_Configuration(void)

  13. {

  14.    /*初始化时间寄存器*/

  15.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /*给后备域提供时钟*/

  16.    PWR_BackupAccessCmd(ENABLE);    /*使能写 Backup domain */

  17.    BKP_DeInit();

  18.    RCC_LSEConfig(RCC_LSE_ON);      /*打开外部低频晶振*/

  19.    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);/*等待外部低频晶振工作正常*/

  20.    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     /*外部低频晶振作为RTC晶振源*/

  21.    RCC_RTCCLKCmd(ENABLE); /*使能RTC*/

  22.    RTC_WaitForSynchro();  /*等待RTC寄存器与RTC_APB时钟同步*/

  23.    RTC_WaitForLastTask(); /*等待最近一次对RTC寄存器的写操作完成*/

  24.    RTC_ITConfig(RTC_IT_SEC, ENABLE);/* 使能RTC秒中断*/

  25.    RTC_WaitForLastTask();  /*等待最近一次对RTC寄存器的写操作完成*/

  26.    RTC_SetPrescaler(32767);/*预分频(32.768 KHz)/(32767+1)*/

  27.    RTC_WaitForLastTask();   /*等待最近一次对RTC寄存器的写操作完成*/

  28. }

  29. /*

  30. ****************************************************************************

  31. *函数名称:u8 RTC_Set(uint32 seccount )

  32. *函数功能: 设置时钟

  33. *入口参数:RTC计时初始值

  34. *出口参数:

  35. *日期:2015 4 6

  36. *版本:V1.0

  37. *作者:yrj  

  38. ****************************************************************************

  39. */

  40. u8 RTC_Set(uint32  seccount )

  41. {  

  42.     PWR_BackupAccessCmd(ENABLE); //使能后备寄存器

  43.     RTC_WaitForLastTask();

  44.     RTC_SetCounter(seccount); /*设置时钟*/

  45.     RTC_WaitForLastTask();

  46.     return 0;      

  47. }

  48. RTC中断服务函数,每秒钟进行一次中断,在中断函数中将LED的状态进行一次翻转。

  49. /*

  50. ***************************************************************************

  51. *函数名称:void RtcException(void)

  52. *函数功能: RTC中断服务函数

  53. *入口参数:无

  54. *出口参数:无

  55. *日期:2015 4 6

  56. *版本:V1.0

  57. *作者:yrj

  58. ***************************************************************************

  59. */

  60. void RtcException(void)

  61. {  

  62.    if(RTC_GetITStatus(RTC_IT_SEC)==SET)

  63.    {

  64.      RTC_WaitForLastTask();

  65.      RTC_ClearITPendingBit(RTC_IT_SEC);

  66.      RTC_WaitForLastTask();


  67.      LED_STAT=~LED_STATE;  /*LED状态每秒钟翻转一次*/

  68.    }

  69. }


justperky 发表于 2015-8-30 23:02 | 显示全部楼层
在使用RTOS嵌入式操作系统时,为保证系统的有效运行,都需要有一个统一的系统时钟,此时RTC通常被选为系统的时基,不是有个滴答定时器用作RTOS的基准么,还用这个RTC干嘛
哆来咪 发表于 2015-8-31 18:01 | 显示全部楼层
一般用系统滴答定时器做OS的时间基准,不用RTC的
eggbiscuit 发表于 2015-8-31 21:53 | 显示全部楼层
还不如用定时器方便了。如果要用作OS的话,用滴答定时器更好点
几时再见 发表于 2015-8-31 22:24 | 显示全部楼层
支持下,希望能有更多的资料来分享。
罗勋义 发表于 2015-8-31 23:12 | 显示全部楼层
谢谢楼主分享了!
vivilzb1985 发表于 2015-9-12 13:07 | 显示全部楼层
秒中断用的还是挺多的。
 楼主| Elric_QZH 发表于 2017-11-25 10:32 | 显示全部楼层
eggbiscuit 发表于 2015-8-31 21:53
还不如用定时器方便了。如果要用作OS的话,用滴答定时器更好点

确实滴答定时器多点。
xgfgli 发表于 2017-11-27 18:05 | 显示全部楼层
可以用系统滴答
电子信使 发表于 2017-11-27 21:25 | 显示全部楼层
RTC在STM32中,不太好用,不知道GD解决了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

133

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部