打印
[开发板与模块]

【HT32F52352 Starter Kit测评】+RTC的使用

[复制链接]
3843|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 werasd 于 2022-5-25 15:09 编辑

HT32F52352芯片内部配有RTC实时时钟电路,它包括APB接口、一个32-bit向上计数器、一个控制寄存器、一个预分频器、一个比较寄存器和一个状态寄存器。
通过RTC与OLED屏相配合,就可快速地构建一个电子时钟,其计时效果如图1和图2所示所示。
图1  RTC计时效果

图2  串口输出效果
要使RTC实现电子时钟的功能,必须对ht32f5xxxx_01_it.c中的原中断处理函数加以修改。
原中断函数是一个空函数,其内容为:
void RTC_IRQHandler(void)
{
}
该函数修改后的内容为:
void RTC_IRQHandler(void)
{
  extern vu32 gwTimeDisplay;
  u8 bFlags;
  bFlags = RTC_GetFlagStatus();
  if (bFlags & RTC_FLAG_CSEC)
  {
    gwTimeDisplay = 1;
  }
}

RTC配置函数:
void RTC_Configuration(void)
{
  PWRCU_DeInit();
  #if (EXAMPLE_NO_LSE == 0) && (LIBCFG_LSE == 1)
  RTC_LSESMConfig(RTC_LSESM_FAST);
  RTC_LSECmd(ENABLE);
  while (CKCU_GetClockReadyStatus(CKCU_FLAG_LSERDY) == RESET);
  RTC_ClockSourceConfig(RTC_SRC_LSE);
  #else
  RTC_ClockSourceConfig(RTC_SRC_LSI);
  #endif
  RTC_IntConfig(RTC_INT_CSEC, ENABLE);
  RTC_SetPrescaler(RTC_RPRE_32768);
}

另外,此外还需要为RTC设置一个初始的计时值。由于开发板上并没有配置相应的用户键,在未进行扩展的情况下,只好由函数Time_Regulate(void)直接进行设置。
相应的函数内容为:
u32 Time_Regulate(void)
{
    u32 Tmp_HH = 0xFF, Tmp_MM = 0xFF, Tmp_SS = 0xFF;
         printf("\r\n==============Time Settings=====================================");
         Tmp_HH = 23;
         Tmp_MM = 59;
         Tmp_SS = 52;
    return((Tmp_HH * 3600 + Tmp_MM * 60 + Tmp_SS));
}

此外,为了显示计时值所使用的函数为:
void Time_Display(u32 wTimeVar)
{
    u32 THH = 0, TMM = 0, TSS = 0;
    wTimeVar %= 86400;
    THH = wTimeVar/3600;
    TMM = (wTimeVar % 3600)/60;
    TSS = (wTimeVar % 3600)% 60;
         OLED_ShowNum(20,6,THH,2,16);
         OLED_ShowNum(44,6,TMM,2,16);
         OLED_ShowNum(68,6,TSS,2,16);
}

完成电子时钟功能的主程序为:
int main(void)
{
    {
        CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
        CKCUClock.Bit.BKP   = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
    }
#if (!LIBCFG_NO_PWRCU_TEST_REG)
    if (PWRCU_CheckReadyAccessed() != PWRCU_OK)
    {
        while (1);
    }
    #endif
    HT32F_DVB_LEDInit(HT_LED1);
    RETARGET_Configuration();
    NVIC_EnableIRQ(RTC_IRQn);
    RTC_Configuration();
    printf("\r\n RTC configured....");
    TimeReg = Time_Regulate();
    RTC_Cmd(ENABLE);
    oled_GPIO_Configuration();
    OLED_Init();

    OLED_Clear();
     OLED_ShowString(20,0,"OLED & RTC",16);
    OLED_ShowString(20,2,"HT32F52352",16);
         OLED_ShowString(20,6,"  :  :",16);
    while (1)
    {
        if (gwTimeDisplay == 1)
        {
              Time_Display(RTC_GetCounter() + TimeReg);
              gwTimeDisplay = 0;
                              HT32F_DVB_LEDToggle(HT_LED1);
         }
    }
}

因此可见,RTC的使用还是比较方便的。为了便于时间的调整,可外接一个按键模块来辅助时间参数的设置。

使用特权

评论回复

相关帖子

沙发
sesefadou| | 2022-5-16 10:05 | 只看该作者
HT32F52352 还不错呢。   

使用特权

评论回复
板凳
lzmm| | 2022-5-16 12:11 | 只看该作者
怎么开启RTC中断呢?

使用特权

评论回复
地板
typeof| | 2022-5-16 12:31 | 只看该作者
会不会存在不能保存时间的现象呢

使用特权

评论回复
5
hudi008| | 2022-5-16 15:37 | 只看该作者
有闹钟的功能吗   

使用特权

评论回复
6
linfelix| | 2022-5-16 16:05 | 只看该作者
这个的偏差是多少?  

使用特权

评论回复
7
u1011| | 2022-5-16 17:02 | 只看该作者
lzmm 发表于 2022-5-16 12:11
怎么开启RTC中断呢?

楼主有提到RTC配置函数:RTC_Configuration

开RTC中断简单总结是要有RTC_IntConfig,和NVIC_EnableIRQ(RTC_IRQn);

使用特权

评论回复
8
u1011| | 2022-5-16 17:05 | 只看该作者
typeof 发表于 2022-5-16 12:31
会不会存在不能保存时间的现象呢

时间保存在RAM/寄存器内,只要不断电就没有关系。

使用特权

评论回复
9
u1011| | 2022-5-16 17:07 | 只看该作者
linfelix 发表于 2022-5-16 16:05
这个的偏差是多少?

这个的确是很多人关心的问题,RTC偏差量来自外部32767晶振的精度,普通32768晶振精度可以到5ppm。

使用特权

评论回复
10
jinglixixi|  楼主 | 2022-5-16 17:48 | 只看该作者
typeof 发表于 2022-5-16 12:31
会不会存在不能保存时间的现象呢

肯定会,因为它没有配置后备电池来为RTC供电。

使用特权

评论回复
11
jinglixixi|  楼主 | 2022-5-16 17:51 | 只看该作者
hudi008 发表于 2022-5-16 15:37
有闹钟的功能吗

这个可以有,只不过这里没使用。

使用特权

评论回复
12
asmine| | 2022-5-17 21:26 | 只看该作者
nice,新板子上手好快啊

使用特权

评论回复
13
htmlme| | 2022-5-28 13:43 | 只看该作者
支持闹钟的吗?

使用特权

评论回复
14
uytyu| | 2022-5-28 14:54 | 只看该作者
RTC可以校准吗  

使用特权

评论回复
15
jinglixixi|  楼主 | 2022-5-29 23:42 | 只看该作者

可以

使用特权

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

本版积分规则

472

主题

2812

帖子

38

粉丝