前言
为了丰富测试内容,进一步了解雅特力开发板,本章节主要熟悉了解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