S32K3平台RTC应用笔记
- Real Time Clock(RTC)概述
S32K3xx 有一个 RTC 和 API(自主周期中断)定时器,都能执行 32 位的比较。
1.1 RTC 资源和配置
RTC 始终处于 ON 域,因此在 RUN 模式和 STANDBY 模式下都可用。 RTC 和 API 计
时器可以产生中断以及从低功耗模式唤醒。
RTC 在高速的内部时钟下支持 1us 的分辨率(1/48MHz*48 计数)。
该芯片通过时钟源 SIRC 和 SXOSC 支持功能复位期间的无缝 RTC 操作。
API 可以不用停止定时器的情况下改变定时器的比较值。
API 还能和比较器模块结合使用,在待机模式下,API 被配置产生一个 START/NEXT 类
型信号去通知比较器这个比较必须被捕捉。
S32K3xx MCU 的 RTC 硬件资源介绍如表 1.1 所示。
表 1.1 S32K3 系列 RTC 资源
1.2 RTC 介绍
RTC 是用于时间保持应用的不同步计数器,RTC 可以被配置为预定义的时间间隔生成
中断,而与操作模式(运行模式或低功耗模式)无关。如果处于低功耗模式,到达 RTC 间
隔,则 RTC 首先产生唤醒,然后断言中断请求。RTC 还支持 API 功能,用于生成定期唤醒
请求以退出低功耗模式或中断请求。
RTC 的时钟源,如图 1.1 所示。
1.3 RTC 特性
RTC 有以下特性:
32 位计数器
可选的计数器时钟源 0/1/2/3
可选 512 预分频和 32 预分频用于运行计数器
RTC 中断
计数器运行在所有操作模式下
当软件失能计数器或者 RTC 复位,RTC 计数器将会复位
API 支持以下内容:
–32 位比较值支持间隔/中断的范围
–RTC 正在运行,API 也能改变比较值
–API 中断
–运行在所有模式
–RTC 运行中,API 比较值能够被修改
可选择的中断:RTC 匹配,API 匹配和 RTC 溢出
1.5 操作模式
1.5.1 功能模式
正常模式:所有 RTC 寄存器能被读写,RTC/API 和对应中断能选择使能。
低功耗模式:总线失能,如果进入低功耗模式之前 RTC 和 API 是使能的,则保持
使能。
1.5.2 Debug 模式
进入 Debug 模式时,如果 FRZEN,RTC 计数器冻结最后的有效值。退出后,计数器解
除冻结,继续在冻结值的基础上继续运行。
3. Real Time Clock(RTC)配置说明
3.1 版本说明
本次配套例程所使用的 SDK 包版本为 4.0.0。
3.2 SDK 配置详解
3.2.1 配置时钟
参考图 3.1 配置时钟,配置如图 3.2 所示,红色框处为四个 RTC 时钟源。
3.2.2 配置 RTC
点击如图 3.3 所示红色部分进入到如图 3.3 所示 RTC 相关配置界面。
下面将对如何对 RTC 配置进行详解。
其中对与 RTC 模块的配置如下图 3.4 和图 3.5 所示红色部分,根据需求对其进行相应配
置即可。
配置完成后即生成代码,生成的配置代码结构体部分如程序清单 3.1 所示。结构中的成
员就是上面的 SDK 配置参数。
程序清单 3.1 配置代码结构体
Rtc_Ip_ConfigType RTC_0_InitConfig_PB =
{
/** @brief RTC Freeze Enable /
(boolean)(FALSE),
/* @brief DivBy512 Prescaler enable /
(boolean)(FALSE),
/* @brief DivBy32 Prescaler enable /
(boolean)(FALSE),
/* @brief RTC Clock Source /
RTC_IP_CLOCK_SOURCE_0,
/* @brief RTC callback name /
&RtcNotification,
/* @brief RTC callbackparam /
(uint8)0
};
4. 例程程序解读
4.1 例程 1:RTC-IRQ
例程说明:本例程使用立功科技开发板基于 SDK v4.0.0 进行 RTC 配置,程序实现 RTC
获取真实时间,并触发中断,指示灯根据定时周期翻转。
配置 SDK,时钟根据 3.2.1 配置,PIT 通道配置如图 4.1 所示,PIT 硬件配置如图 4.2 所
示。
系统时钟初始化、指示灯引脚初始化之后,初始化 RTC 以及各通道在指定计数周期内
触发中断,这部分代码如程序清单 4.1 所示。
程序清单 4.1 RTC 部分程序
/ 系统时钟初始化 /
Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);
/ 失能和清除 API 中断,否则上电启动进入中断 /
Rtc_Ip_DisableInterrupt(RTC_INST, RTC_IP_API_INTERRUPT);
/ 指示灯引脚初始化 /
Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);
/ 中断初始化 /
IntCtrl_Ip_Init(&IntCtrlConfig_0);
IntCtrl_Ip_ConfigIrqRouting(&intRouteConfig);
/ 初始化 RTC /
Rtc_Ip_Init(RTC_INST,&RTC_0_InitConfig_PB);
/ 配置中断 /
Rtc_Ip_EnableInterrupt(RTC_INST);
/ 定时器启动 /
Rtc_Ip_StartTimer(RTC_INST,RTC_PERIOD);
while (1)
{
/ RTC 获取当前时间 /
Rtc_Ip_GetTimeDate(RTC_INST, &nowtime);
/ 对比时间,判断时间是否更新 /
if(memcmp(&lasttime, &nowtime, sizeof(Rtc_Ip_TimedateType)))
{
printf(“%d-%d-%d %d:%d:%d\r\n”,nowtime.year, nowtime.month, nowtime.day,
nowtime.hour, nowtime.minutes, nowtime.seconds);
}
/ 记录值用于比较 /
lasttime = nowtime;
}
接下来就是 RTC 的中断服务函数实现 LED 标志位成立,主函数实现指示灯状态翻转,
根据 LED 电平可测试出定时的时间周期,具体程序如程序清单 4.2 错误!未找到引用源。所
示。
程序清单 4.2 中断服务函数
/*
- @brief Rtc notification called by the configured channel periodically
- @details RTC API 比较值匹配回调函数
/
void RtcNotification(void)
{
Siul2_Dio_Ip_TogglePins(CH0_MAP_PORT, 1 << CH0_MAP_PIN);
}
/* - @details RTC Alarm 回调函数,RTC 比较值匹配触发
/
void Rtc_AlarmCallback(uint8 channel)
{
switch (channel) {
/ alarm 0 */
case 0:
Siul2_Dio_Ip_TogglePins(CH1_MAP_PORT, 1 << CH1_MAP_PIN);
break;
default:
break;
}
}