1635|2

6450

帖子

9

TA的资源

版主

楼主
 

【AT32WB415测评】05 RTC测试+添加电子时钟界面 [复制链接]

前言

        为了丰富测试内容,进一步了解雅特力开发板,本章节主要熟悉了解RTC的内容,并增加测试界面;

目标

        熟悉RTC的基本配置和基本操作;

        增加RTC测试界面;

 

实现

1、了解解雅特力开发板的RTC功能

        雅特力开发板的RTC又名ERTC,其作用是提供日历管理,因为其计数逻辑作用在电池供电域,因此只要电池供电域有电,ERTC 就不会受到系统复位以及VDD掉电影响。

        ERTC的ck_b用于更新日历,开发板包含外部32.768kHz时钟,首选通过LEXT经过分频器A 和分频器B获得,ck_b=LEXT/(divA+1)/(divB+1),例如32.768K的时钟通过A分频器127、B分频器255,获得1Hz频率。

        上电复位后所有ERTC 寄存器都处于写保护状态,在进行擦写前一定要先解除写保护,这部分和多数MCU的配置过程基本是相同的,解除写保护——写配置——写保护,部分寄存器需要进入初始化模式才能更改。

        ERTC的时间寄存器和日期寄存器就是需要经常访问的寄存器,更新日历就是直接更新这两个寄存器,这一点与GD的单片机略有不同,GD实际上是一个64位的寄存器,只存一个自增数,具体的时间设定还需要自己去进行设计,这里可以直接访问时间相关寄存器,更像一个外部的实时时钟模式,直接获取年月日时分秒,不过ERTC的可统计时间范围没有给出,润年机制方面也没有什么介绍,寄存器中的年份只有十位和各位。

2、ERTC初始化

        结合技术手册和demo,设计ERTC初始化程序:

void ertc_config(void)
{
  /* allow access to ertc */
  pwc_battery_powered_domain_access(TRUE);
  /* reset ertc domain */
  crm_battery_powered_domain_reset(TRUE);
  crm_battery_powered_domain_reset(FALSE);
  /* enable the lext osc */
  crm_clock_source_enable(CRM_CLOCK_SOURCE_LEXT, TRUE);
  /* wait till lext is ready */
  while(crm_flag_get(CRM_LEXT_STABLE_FLAG) == RESET)
  {
  }
  /* select the ertc clock source */
  crm_ertc_clock_select(CRM_ERTC_CLOCK_LEXT);
  /* enable the ertc clock */
  crm_ertc_clock_enable(TRUE);

  /* deinitializes the ertc registers */
  ertc_reset();
  /* wait for ertc apb registers update */
  ertc_wait_update();
  
  /* configure the ertc divider */
  /* ertc second(1hz) = ertc_clk / (div_a + 1) * (div_b + 1) */
  ertc_divider_set(127, 255);
  /* configure the ertc hour mode */
  ertc_hour_mode_set(ERTC_HOUR_MODE_24);

  eRTC_set.year     = 22;
  eRTC_set.month    = 8;
  eRTC_set.day      = 18;
  eRTC_set.hour     = 8;
  eRTC_set.min      = 0;
  eRTC_set.sec      = 0;
  eRTC_set.week     = 4;
  Set_Time(&eRTC_set);
}

void Set_Time(ertc_time_type* time)
{
  /* set date  */
  ertc_date_set(time->year,time->month,time->day,time->week);
  /* set time*/
  ertc_time_set(time->hour,time->min,time->sec,ERTC_AM);
}

uint32_t bpr_reg_get(uint8_t index)
{
  if(index >= ERTC_BPR_DT_NUMBER)
  {
    index = 0;
  }
  return ertc_bpr_data_read(bpr_addr_tab[index]);
}

void bpr_reg_write(uint8_t index,uint32_t DT_data)
{
  ertc_bpr_data_write(bpr_addr_tab[index],DT_data);
}

        初始化应用在每次电池域复位后,可以利用电池供电数据寄存器(RTC_BPRx)存储识别码,说句手册中介绍该寄存器总共有76个,不过demo中只有20个,也足够用了,该数据寄存器复位后为0x00000000,如果不为自定义的识别码就说明出现了异常,有必要进行ERTC初始化。

检查程序代码如下:

void port_RTC_init(void)
{
  /* enable the pwc clock interface */
  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  /* allow access to bpr domain */
  pwc_battery_powered_domain_access(TRUE);
  /* check data from bpr dt register */
  if(bpr_reg_get(0) != ERTC_BPR_DT1)
  {
    /* ertc configuration */
    ertc_config();
    /* write to ertc bpr data registers */
    bpr_reg_write(0,ERTC_BPR_DT1);
  }
  else
  {
    /* wait for ertc registers update */
    ertc_wait_update();
  }
  
}

 

3、界面设计

        主菜单中加入"RTC测试",在"RTC测试"界面下初步添加"RTC显示"、"电子秒表(预留)"、"时间设置",不过由于按键受限,"时间设置"实现比较困难,暂不进行,待串口通信测试时通过串口命令设定;而电子秒表是依托RTC合适还是依托定时器实现合适,作为扩展暂不进行,最终只设计了"RTC显示"界面,其他功能预留。

 

最终效果如下:

WeChat_20220822215951

 

此帖出自RF/无线论坛

最新回复

 雅特力开发板的RTC又名ERTC,其作用是提供日历管理,因为其计数逻辑作用在电池供电域,因此只要电池供电域有电,ERTC 就不会受到系统复位以及VDD掉电影响。 作为日常时间管理够用了。   详情 回复 发表于 2022-8-23 11:22
点赞 关注
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 

 雅特力开发板的RTC又名ERTC,其作用是提供日历管理,因为其计数逻辑作用在电池供电域,因此只要电池供电域有电,ERTC 就不会受到系统复位以及VDD掉电影响。

作为日常时间管理够用了。

此帖出自RF/无线论坛

点评

互相努力  详情 回复 发表于 2022-8-23 15:39
 
 

回复

6450

帖子

9

TA的资源

版主

板凳
 
lugl4313820 发表于 2022-8-23 11:22  雅特力开发板的RTC又名ERTC,其作用是提供日历管理,因为其计数逻辑作用在电池供电域,因此只要电池 ...

互相努力

此帖出自RF/无线论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表