ERTC接口简介
ERTC计数逻辑位于电池供电域,只要电池供电域有电,ERTC便会一直运行,不受系统复位以及VDD掉电影响,ERTC主要具有以下功能:
― 日历功能:年、月、日、时、分、秒
― 闹钟功能:闹钟A、闹钟B
― 周期性唤醒功能
― 入侵检测功能
― 校准功能:精密校准、粗略校准
图1. ERTC框图
ERTC功能
各型号ERTC功能差异
各型号ERTC基本功能相同,只是各个型号之间,可能去掉了一些更高级的功能,所有保留的功能程序兼容。
表1. 各型号ERTC差异
√:表示支持该功能,且功能相同。
×:表示不支持该功能。
寄存器访问
寄存器写保护
上电复位后ERTC寄存器处于写保护状态,需要先解除写保护,才能写配置ERTC寄存器。
需要注意的是ERTC_STS[14:8]、ERTC_TAMP和ERTC_BPRx寄存器不受写保护。
解锁步骤:
1) 使能PWC接口时钟
2) 解锁电池供电域写保护
3) 依次向ERTC_WP寄存器写入0xCA,0x53,解锁写保护
若向ERTC_WP寄存器写入错误的值,将重新激活写保护
4) 配置ERTC寄存器
下表列举了ERTC寄存器受写保护状态,以及写入的条件:
表2. ERTC寄存器
寄存器复位
ERTC寄存器处于电池供电域,可以CRM_BPDC的BPDRST进行电池供电域复位,也可以由提供的库函数对每个寄存器写默认值进行复位。
ERTC复位相关函数:
电池供电域复位
将ERTC所有寄存器恢复成默认值
时钟设置
时钟源选择
ERTC时钟源经过选择后输入到分频器A和分频器B,最终得到1Hz的时钟用来更新日历。
图2. ERTC时钟结构
ERTC的时钟源共有3种可以选择:
― LEXT:外部低速晶振,通常为32.768kHz
― LICK:内部低速晶振,通常典型值为40kHz范围(30~60kHz),详情请见各型号的datasheet
― HEXT_DIV:外部高速晶振分频后得到的时钟,不同的型号下,分频值不一样,请见表3
表3. 各型号HEXT的预分频值
表4. 各时钟源优缺点对比
ERTC时钟源设置相关函数:
选择对应时钟使能
选择ERTC时钟
使能ERTC时钟
预分频器设置
通过预分频器A和预分频器B将获得1Hz时钟,计算公式如下:
推荐在应用中将预分频器A设置成最大值(127)这样可以最大程度降低功耗。
表5. 分频设置举例
设置ERTC预分频器
ERTC时钟初始化举例:
日历
ERTC日历格式如下图所示,包含有年、月、日、星期、时、分、秒、亚秒。
图3. 日历格式
时间格式设置
时间格式可以选择24小时或者12小时格式,如果为24小时格式时,AM/PM字段无意义,在初始化日历之前,应该首先选择时间格式。
时间格式设置函数:
例如设置日历格式为24小时模式
日历初始化
通过配置ERTC_DATE和ERTC_TIME寄存器可以设置日历时间:
日历值设置函数:
例如设置时间为2020-05-01 1200星期六
日历读取
通过读取ERTC_DATE、ERTC_TIME和ERTC_SBS寄存器可以读取日历时间,日历读取有两种模式分别为同步读取(DREN=0)和异步读取(DREN=1)。
― 同步读取:ERTC每两个ERTC_CLK周期,将日历值同步到影子寄存器ERTC_DATE、ERTC_TIME和ERTC_SBS,同步完成后UPDF将置1。读取低阶寄存器时会将高阶寄存器值锁定,直到读取ERTC_DATE寄存器,这保证读取的ERTC_SBS、ERTC_TIME、ERTC_DATE寄存器值来自同一时刻。
例如读取ERTC_SBS,会将ERTC_TIME、ERTC_DATE寄存器值锁定。
― 异步读取:ERTC直接读取电池供电域的ERTC时钟和日历值,这样避免了由于同步时间带来的误差。异步读取时,UPDF标志将由硬件清0。为保证异步读取时钟和日历值来自同一时刻,软件必须连续两次读取时钟和日历值,并比较两次结果是否一致,如果不一致应该再读,直到两次结果一致。
在大多数应用下,都推荐使用同步读取模式,因为这样可以简化程序。
等待同步函数(等待UPDF置1)
读取模式设置函数
例如设置读取模式为同步读取
日历读取函数:
结构体ertc_time_type里面参数含义如下:
― year:年
― month:月
― day:日
― hour:时
― min:分
― sec:秒
― week:星期几
― ampm:上午/下午(只有在12小时制时,数据有效)
亚秒读取
亚秒值为预分频器DIV_B的计数值,预分频器DIV_B是一个递减计数器,例如当DIV_B=255时,1个亚秒值代表的时间为1/(255+1)秒。
亚秒读取函数:
闹钟
ERTC包含两个完全相同的闹钟A、闹钟B,闹钟值由ERTC_ALASBS/ERTC_ALA(ERTC_ALBSBS/ERTC_ALB)设定,开启闹钟后,当设定的闹钟值匹配日历值时ALAF/ALBF置1,发生闹钟事件。通过MASKx位,可选择性的屏蔽日历字段,被屏蔽的字段不参与闹钟匹配。
图4. 日闹钟匹配
因为闹钟A和闹钟B完全一样,所以后面的举例都用闹钟A举例
闹钟格式选择:
― ERTC_ALA的WKSEL=0时:日期、时、分、秒、亚秒
― ERTC_ALA的WKSEL=1时:星期、时、分、秒、亚秒
闹钟的各个字段日期/星期、时、分、秒、亚秒均可通过MASK位屏蔽,使闹钟的产生更加的灵活
― MASK4=1:闹钟和日/星期无关
― MASK3=1:闹钟和小时无关
― MASK2=1:闹钟和分钟无关
― MASK1=1:闹钟和秒钟无关
例如在WKSEL=0时,将闹钟设置为15号1210
表6. 屏蔽设置举例
通过设置ERTC_ALASBS的SBSMSK可以对亚秒进行屏蔽:
― SBSMSK=0:不匹配亚秒,闹钟与亚秒无关;
― SBSMSK=1:只匹配SBS[0];
― SBSMSK=2:只匹配SBS[1:0];
― SBSMSK=3:只匹配SBS[2:0];
― ...
― SBSMSK=14:只匹配SBS[13:0];
― SBSMSK=15:匹配SBS[14:0]。
―例如在DIV_A=127,DIV_B=255(亚秒)时,只考虑亚秒的触发闹钟
表7. 亚秒屏蔽设置举例
闹钟相关函数
日期/星期、时、分、秒屏蔽
选择日期或者星期格式
设置闹钟值:日期/星期、时、分、秒、AM/PM
设置闹钟亚秒值以及屏蔽
闹钟中断使能
获取当前配置的闹钟值
获取当前配置的闹钟亚秒值
周期性自动唤醒
周期性唤醒功能用于周期性自动唤醒低功耗模式,唤醒周期由VAL[15:0]设定。当唤醒计数器值由VAL值递减至0时,WATF标志置1,产生唤醒事件,同时唤醒计数器值重载VAL值。
可以根据需要选择不同的时钟源,通过寄存器WATCLK[2:0]配置
― 000:ERTC_CLK/16;
― 001:ERTC_CLK/8;
― 010:ERTC_CLK/4;
― 011:ERTC_CLK/2;
― 10x:1Hz;
― 11x:1Hz,唤醒计数值增加216,唤醒时间=WAT+216+1。
图5. 唤醒定时器时钟选择
当WATCLK[2:0]=11x时,如果日历时钟为1Hz,可获得最长的唤醒时间=65535+216+1=131072秒。
如果日历时钟调整为<1Hz(增大预分频器DIV_B的值),还可以获得更长的唤醒时间。
周期自动唤醒相关函数
唤醒计数器时钟源选择
设置唤醒计数器值
获取唤醒计数器值
唤醒定时器使能
入侵检测
ERTC提供了两组入侵检测TAMP1和TAMP2,当在发生入侵事件时,将自动清除ERTC电池供电数据寄存器(ERTC_BPRx)的值,也支持发生入侵事件时产生事件戳。
图6. 入侵检测
入侵检测1引脚可以选择
― ERTC_MUX1:引脚1,通常为PC13
― ERTC_MUX2:引脚2,通常为PA0
入侵检测2引脚为固定ERTC_MUX2(通常为PA0)
入侵检测模式分为边沿检测和电平检测
― 边沿检测:当检测到了有效的边沿触发入侵检测,分为上升沿触发、下降沿触发
― 电平检测:当有效电平长度达到了设定的时间,触发发入侵检测,分为高电平触发、低电平触发。
其中边沿检测比较简单,只需要配置有效边沿并使能就行了,电平检测需要配置的参数会比较多,需要配置以下参数:
采样频率
通过配置TPFREQ寄存器,可以配置的入侵检测频率为
― ERTC_CLK/32768;
― ERTC_CLK/16384;
― ERTC_CLK/8192;
― ERTC_CLK/4096;
― ERTC_CLK/2048;
― ERTC_CLK/1024;
― ERTC_CLK/512;
― ERTC_CLK/256。
例如当ERTC_CLK=32768Hz时,配置检测频率为ERTC_CLK/256时,此时入侵检测频率为32768/256=128Hz
入侵上拉
通过TPPU配置可以打开或者关闭入侵上拉功能,当使能了入侵上拉电阻时,可以通过TPPR设置在入侵检测前的上拉预充电时间,时间可配置为如下:
― 1个ERTC_CLK;
― 2个ERTC_CLK;
― 4个ERTC_CLK;
― 8个ERTC_CLK。
图7. 预充电时间为4个ERTC CLK示意图
入侵滤波
通过TPFLT设置入侵检测的滤波时间,可以配置下面4种模式
― 无滤波,当1次采样有效,判定入侵事件发生;
― 连续2次采样有效,判定入侵事件发生;
― 连续4次采样有效,判定入侵事件发生;
― 连续8次采样有效,判定入侵事件发生。
入侵检测相关函数
入侵检测1引脚选择
入侵检测上拉使能配置
上拉预充电时间设置
滤波时间设置
入侵检测频率设置
入侵检测有效边沿设置
发生入侵事件时,保存时间戳
入侵检测使能
时间戳
时间戳功能用于在发生时间戳事件时(入侵引脚检测到有效边沿),将当前的日历值保存到时间戳寄存器中。
图8. 时间戳检测
时间戳使用
― 单独使用:可以选择引脚进行检测
ERTC_MUX1:引脚1,通常为PC13
ERTC_MUX2:引脚2,通常为PA0
― 在发生入侵事件时保存时间戳,在这种模式下,需要先将入侵检测功能正确配置好
时间戳在单独使用时可以配置为上升沿检测或者下降沿检测,在入侵检测触发时,取决于入侵检测的配置
时间戳溢出
当发生时间戳时,TSF位置1,此时若再次发生时间戳事件,TSOF标志位将置1,但时间戳寄存器并不会更新,仍保留第一次触发的值。
时间戳相关函数
时间戳引脚选择
检测边沿设置
时间戳使能
获得时间戳时间
获得时间戳亚秒
参考时钟检测
为保证日历长时间运行的精确性,ERTC提供了时钟同步功能(低功耗模式不可用),用精度更高的参考时钟(一般用50Hz或者60Hz的市电)校准更新日历的1Hz时钟。
图9. 参考时钟检测
参考时钟检测功能开启后,在每次更新日历值的前7个ck_a周期检测参考时钟边沿,若检测到边沿,将使用此边沿更新日历值(更新秒钟),后续采用3个ck_a周期检测参考时钟边沿。每一次检测到参考时钟边沿时,都会将分频器A的值进行重载,这会使得内部1Hz的日历时钟与参考时钟边沿刚好对齐,当内部1Hz时钟出现微小偏移时,利用更精确的参考时钟,将1Hz时钟微调至与参考时钟边沿对齐。当没有检测到参考时钟边沿时,ERTC会利用原来的时钟源更新日历。
需要注意的是,使能参考时钟功能后,需要将DIVA、DIVB设置为复位值(0x7F、0xFF),并且时钟同步功能不能与粗校准功能同时开启。
参考时钟检测使能函数
校准
ERTC提供了两种校准方法:粗略校准和精密校准。但两种校准方法不能同时使用。
粗略校准
粗略数字校准通过增加或减少ck_a周期值来实现提前或推迟更新日历值的功能。
图10. 粗略校准
正校准时(CALDIR=0):在64分钟的前2xCALVAL分钟时间内,每分钟(约15360个ck_a周期)插入2个ck_a周期,相当于提前更新日历。
负校准时(CALDIR=1):在64分钟前的2xCALVAL分钟时间内,每分钟(约15360个ck_a周期)忽略1个ck_a周期,相当于推迟更新日历。
注:粗略数字校准至少要将DIVA值设置为6。
精密校准
区别于粗略数字校准,精密校准的校准效果更好且校准更加均匀。开启精密校准校准功能后,将均匀增加或减少ERTC_CLK来达到校准的目的。
图11. 精密校准
当ERTC_CLK为32.768kHz时,精密校准周期约为220个ERTC_CLK(32秒)。DEC[8:0]值指定了220个ERTC_CLK中忽略的脉冲数,最多可忽略511个脉冲;将ADD置1,可在220个ERTC_CLK中插入512个脉冲。两者搭配使用,可在220个ERTC_CLK周期进行-511~+512的调整。
有效校准频率FSCAL:
当分频器A值小于3时,会按照ADD等于0校准。此时应降低分频器B值来实现每秒增加8个ERTC_CLK,也就是32秒增加256个ERTC_CLK搭配DEC[8:0]位,可在220个ERTC_CLK周期进行-255~+256的调整。此时有效校准频率FSCAL:
精密数字校准的校准周期还可选择8秒或16秒(由CAL8和CAL16配置),8秒校准周期的优先级更高,同时使能8秒和16秒校准周期,将优先选择8秒校准周期。
校准相关函数
精密校准配置并使能
粗略校准配置
粗略校准使能
事件输出功能
ERTC提供了一组复用功能输出,可以输出以下事件:
― 校准输出:512Hz、1Hz
― 事件输出:闹钟A、闹钟B、唤醒事件
图12. 事件输出
通常ERTC MUX1引脚为PC13
当输出模式为事件输出时(闹钟A、闹钟B、唤醒事件),可以通过OUTTYPE选择输出类型为开漏或是推挽,通过OUTP配置输出极性。
事件输出相关函数
事件输出设置(闹钟A、闹钟B、唤醒事件)
校准输出选择(512Hz、1Hz)
校准输出使能
电池供电数据寄存器
ERTC一共提供了20个32位电池供电数据寄存器,可以在只由电池供电下保存数据,不会被系统复位所复位,只能通过电池供电域复位或入侵事件进行复位
相关函数
写电池供电数据寄存器
读电池供电数据寄存器
中断
当发生闹钟A、闹钟B、周期性唤醒事件时,ERTC可产生中断。要使能ERTC中断可按以下操作配置:
― 将ERTC对应中断的EXINT线配置为中断模式并使能,有效沿选择上升沿。
― 使能ERTC中断对应的NVIC通道。
― 使能对应的ERTC中断控制位。
下表说明了ERTC时钟源、事件以及中断对唤醒低功耗模式的影响:
表8. ERTC唤醒低功耗模式
表9. 中断控制
表10. 各型号中断对应EXINT线
表11. 各型号中断对应中断向量号
表12. 中断向量对应中断函数
中断、事件相关函数
事件中断使能
获取相应中断是否使能
标志获取
标志清除
中断配置示例:以AT32F435的闹钟A为例
案例 读写电池供电数据寄存器
功能简介
对电池供电数据寄存器(ERTC_BPRx)进行读写访问。
资源准备
1) 硬件环境:
对应产品型号的AT-START BOARD
2) 软件环境
projectat_start_f4xxexamplesertcpr_domain
注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考
AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
开启PWC时钟
使能电池供电域写保护
检查电池供电域数据是否正确,如果正确就跳过初始化,如果不正确就初始化ERTC并向电池供电域写上数据
2) 代码介绍
main函数代码描述
实验效果
如果寄存器里数据正确打印bpr reg=>none reset。
如果寄存器里数据正确打印bpr reg=>reset。
主函数里每秒打印一次日历信息。
案例 使用日历以及闹钟功能
功能简介
演示日历功能、闹钟功能的使用。
资源准备
1) 硬件环境:对应产品型号的 AT-START BOARD2) 软件环境projectat_start_f4xxexamplesertccalendar注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
开启PWC时钟
使能电池供电域写保护
检查日历是否已经初始化,如果正确就跳过初始化,如果不正确就初始化日历以及闹钟
主函数里每秒打印一次日历信息
在21-05-01 1210时刻发生闹钟。
2) 代码介绍
main函数代码描述
ERTC初始化ertc_config函数代码描述
闹钟中断函数代码描述
实验效果
信息通过串口打印出来,在电脑上通过串口助手观看打印信息。
主函数里每秒打印一次日历信息。
在21-05-01 1210时刻发生闹钟。
案例 使用LICK时钟并校准
功能简介
使用LICK时钟作为ERTC时钟,并通过定时器测量出LICK时钟频率,通过得到的频率值,调整ERTC分频,达到在一定范围内校准时间的效果
资源准备
1) 硬件环境:对应产品型号的AT-START BOARD2) 软件环境projectat_start_f4xxexamplesertclick_calibration注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
ERTC初始化
配置测量LICK频率定时器
根据测量到的频率重新配置ERTC分频
2) 代码介绍
main函数代码描述
实验效果
信息通过串口打印出来,在电脑上通过串口助手观看打印信息。
通串口打印出当前测量出的LICK的频率以及DIV_A、DIV_B的值。
每秒钟打印一次日历。
案例 入侵检测
功能简介
演示入侵检测功能使用,PC13脚当检测到一个上升沿后将触发入侵检测,当入侵事件发生时,电池供电数据寄存器将会被清除。
资源准备
1) 硬件环境:对应产品型号的AT-START BOARD2) 软件环境projectat_start_f4xxexamplesertc amper注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
ERTC初始化
初始化入侵检测
初始化电池供电寄存器
2) 代码介绍
main函数代码描述
入侵检测中断处理函数代码描述
实验效果
信息通过串口打印出来,在电脑上通过串口助手观看打印信息。
当发生入侵事件时(PC13出现上升沿),在入侵中断函数里打印电池供电寄存器被清除的信息。
案例 时间戳
功能简介
演示时间戳功能使用,PC13脚当检测到一个上升沿后将触发时间戳,在时间戳中断里打印发生事件的时刻。
资源准备
1) 硬件环境:对应产品型号的AT-START BOARD2) 软件环境projectat_start_f4xxexamplesertc ime_stamp注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行简单修改即可。
软件设计
1) 配置流程
ERTC初始化
初始化时间戳
2) 代码介绍
main函数代码描述
时间戳中断处理函数代码描述
实验效果
信息通过串口打印出来,在电脑上通过串口助手观看打印信息。
当发生时间戳事件时(PC13出现上升沿),在中断里打印当前保存的时间戳。
案例 周期唤醒定时器
功能简介
演示周期唤醒定时器功能使用。
资源准备
1) 硬件环境:对应产品型号的AT-START BOARD2) 软件环境projectat_start_f4xxexamplesertcwakeup_timer注:所有project都是基于keil 5而建立,若用户需要在其他编译环境上使用,请参考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各种编译环境(例如IAR6/7,keil 4/5)进行 简单修改即可。
软件设计
1) 配置流程
ERTC初始化
初始化周期唤醒定时器
2) 代码介绍
main函数代码描述
周期唤醒中断处理函数代码描述
实验效果
信息通过串口打印出来,在电脑上通过串口助手观看打印信息。
每个5秒发生一次周期性唤醒事件,在中断里打印出信息。
每秒钟打印一次日历。
审核编辑:汤梓红
-
mcu
+关注
关注
146文章
16254浏览量
345649 -
寄存器
+关注
关注
30文章
5186浏览量
118460 -
接口
+关注
关注
33文章
7982浏览量
149281
原文标题:AT32讲堂022 | AT32 MCU ERTC的基本功能
文章出处:【微信号:AT32 MCU 雅特力科技,微信公众号:AT32 MCU 雅特力科技】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论