[MCU] 【AT-START-F425测评】+ ERTC与电子时钟的实现

jinglixixi   2022-4-5 00:55 楼主

在AT32 F425内部配有RTC计时器,用它与相应函数相配合可实现RTC计时和定时功能,其运行效果见图1所示。

image-20220405005055-1.png  

图1 运行效果

若将RTC与OLED屏结合起来,则可以轻松地实现电子时钟的功能。

以前面介绍的OLED屏显示驱动为基础,实现图2计时效果的主程序为:

int main(void)
{
  exint_init_type exint_init_struct;
  ertc_time_type time;
  uint32_t temp = 0;
  system_clock_config();
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  at32_board_init();
  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  pwc_battery_powered_domain_access(TRUE);
  if (ertc_bpr_data_read(ERTC_DT1) != 0x1234)
  {
    ertc_config();   // 设置时间值函数,添加按键参数设置功能!
  }
  else
  {
    ertc_wait_update();
    ertc_flag_clear(ERTC_ALAF_FLAG);
    exint_flag_clear(EXINT_LINE_17);
  }
  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable   = TRUE;
  exint_init_struct.line_mode     = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select   = EXINT_LINE_17;
  exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  exint_init(&exint_init_struct);
  nvic_irq_enable(ERTC_IRQn, 0, 1);
  app_oled_init();
  app_oled_init();
  OLED_Init();
  OLED_Clear();
  OLED_ShowString(8,0,"AT32F425",16);
  OLED_ShowString(8,2,"OLED & RTC",16);
  while(1)
  {
    ertc_calendar_get(&time);
    if(temp != time.sec)
    {
      temp = time.sec;
      sprintf(da_buf,"20%02d-%02d-%02d ",time.year, time.month, time.day);
      OLED_ShowString(8,4,da_buf,16);
      sprintf(da_buf,"%02d:%02d:%02d",time.hour, time.min, time.sec);
      OLED_ShowString(8,6,da_buf,16);
    }
  }
}

该程序的处理流程为:

首先进行RTC初始化,然后识别标志变量,若未设置初始计时值,则读取程序中的初始值来计时。否则,就在已有的计时值基础上进行计时处理。

image-20220405005055-2.png  

图2 显示效果

其中RTC的初始值是在函数ertc_config中设置的,其内容为:

hh =12;
nn=0;
ss=0;
void ertc_config(void)
{
  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  pwc_battery_powered_domain_access(TRUE);
  crm_battery_powered_domain_reset(TRUE);
  crm_battery_powered_domain_reset(FALSE);
#if defined (ERTC_CLOCK_SOURCE_LICK)
  crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE);
  while(crm_flag_get(CRM_LICK_STABLE_FLAG) == RESET)
  {
  }
  crm_ertc_clock_select(CRM_ERTC_CLOCK_LICK);
  ertc_clk_div_b = 255;
  ertc_clk_div_a = 127;
#elif defined (ERTC_CLOCK_SOURCE_LEXT)
  crm_clock_source_enable(CRM_CLOCK_SOURCE_LEXT, TRUE);
  while(crm_flag_get(CRM_LEXT_STABLE_FLAG) == RESET)
  {
  }
  crm_ertc_clock_select(CRM_ERTC_CLOCK_LEXT);
  ertc_clk_div_b = 255;
  ertc_clk_div_a = 127;
#endif
  crm_ertc_clock_enable(TRUE);
  ertc_reset();
  ertc_wait_update();
  ertc_divider_set(ertc_clk_div_a, ertc_clk_div_b);
  ertc_hour_mode_set(ERTC_HOUR_MODE_24);
  ertc_date_set(22, 3, 2, 3);
  ertc_time_set(hh ,nn ,ss, ERTC_AM);
  ertc_alarm_mask_set(ERTC_ALA, ERTC_ALARM_MASK_DATE_WEEK);
  ertc_alarm_week_date_select(ERTC_ALA, ERTC_SLECT_DATE);
  ertc_flag_clear(ERTC_ALAF_FLAG);
  ertc_bpr_data_write(ERTC_DT1, 0x1234);
}

 

为便于校时处理,可以为它添加一个按键处理函数来进行参数设置。

由于开发板上只有一个用户键,不便于参数设置,故为它配置了一个薄膜按键,并使用其中的3个键即可。其中“1”键用于-1,“2”键用于+1,“3”键用于确认。

按键与开发板的连接关系为:

key1---PB5

key2---PB3

key3---PA10

GND---PB10

image-20220405005055-3.png  

图3  Arduino接口

 

#define  key1   gpio_input_data_bit_read(GPIOB, GPIO_PINS_5)

#define  key2   gpio_input_data_bit_read(GPIOB, GPIO_PINS_4)

#define  key3   gpio_input_data_bit_read(GPIOA, GPIO_PINS_10)

相应的时间设置函数为:

void  time_set(void)
{
    int8_t i=0,n;
    n=hh;
    i=0;
    while (i<3)
    {
       if(key1==0)
       {
           n--;
       }
       if(key2==0)
       {
           n++;
       }
       if(key3==0)
       {
          if(i==0)
          {
               n=mm;
          }
          if(i==1)
          {
               n=ss;
          }
          i++;
          while(key3==0);
       }
       if(i==0)
       {
           hh=n;
           OLED_ShowNum(8,6,hh,2,16);
       }
       if(i==1)
       {
           mm=n;
           OLED_ShowNum(32,6,mm,2,16);
       }
       if(i==2)
       {
           ss=n;
           OLED_ShowNum(56,6,ss,2,16);
       }
       delay_ms(200);
    }
}

其中,变量hh存放的是时间值,变量mm存放的是分钟值,变量ss存放的是秒钟值。

日期的设置函数,仿此即可。

回复评论 (4)

ERTC是内部RTC?

点赞  2022-4-6 16:02
引用: wangerxian 发表于 2022-4-6 16:02 ERTC是内部RTC?

点赞  2022-4-7 00:10

这个E,总感觉是外部的

点赞  2022-4-7 09:35
引用: wangerxian 发表于 2022-4-7 09:35 这个E,总感觉是外部的

有道理,但可能是为了区别现在的所谓软RTC吧!

点赞  2022-4-7 11:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复