2.8. RTC 时间
Overview
提供 RTC 系统时间应用示例、配置介绍和常见问题。
2.8.1. 应用实例
示例演示:
设置和获取系统的 RTC 时间
获取系统 NTP 时间
获取系统运行时间
闹钟响铃
时间字符串格式化方法
gettimeofday() 使用方法
time_lapse() 使用方法
example: 具体示例代码详见 apps/common/example/peripheral/rtc/main.c
,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h
中开启宏 USE_RTC_TEST_DEMO
。
Important
测试例程rtc默认是本地sdk编译时间
用户若要自己设置rtc时间,则还需要开启宏
USER_SET_RTC_TIME
,并在user_set_rtc_time()函数中设置时间参数在user_set_rtc_time()函数中设置的时间一定要比当前编译的时间偏后,否则rtc会按当前编译时间计时间
RTC介绍 79系列RCT支持内部RC200k走时和外部32.768k时钟走时,支持外部供电和内部供电两种方式。支持闹钟响铃唤醒,能提供年月日时分秒以及星期等信息。 使用外部32.768K时钟能更精确的走时,内部RC会产生走时误差。 需要注意的是当使用内部供电的时候需要将HSB配置为2,LSB配置为5以降低IC于RTC模块通信时钟,即外设时钟不能超20M,其次休眠后VDDIO(TCFG_LOWPOWER_VDDIOW_LEVEL)档位需要配置为3.2V.
2.8.2. 常见问题
如何添加 RTC 设备并进行 RTC 初始化? 答:在 board.c 中添加 RTC 设备并进行 RTC 初始化:
//设备列表 device_table 添加RTC设备,默认demo_hello和demo_wifi已经添加,例如demo_hello的board.c如下。 REGISTER_DEVICES(device_table) = { {"rtc", &rtc_dev_ops, NULL},//添加RTC设备 }; //添加RTC初始化函数,系统上电会调用(有wifi功能的在board_init()函数检查有没有rtc_early_init(),没有就需要加上该函数),如demo_hello的board.c void board_init() { rtc_set_power_inside();//7913 7915需要配置 设置内置电源 如果RTCVDDIO有外部供电就不需要 还有一种是内部已经接了RTCVDDIO于VDDIO连在一起的 rtc_early_init(0); } void board_init() { rtc_early_init(1);//使用外置RTC }
- 如何获取内部RTC电压值
u8 rtc_vdd_value; int get_rtc_vddio(); rtc_vdd_value = get_rtc_vddio();
- 当使用内部RTC时如何使用外部PR0, PR1引脚用做GPIO,用法与其余GPIO一样
u8 time=0; time = ++time % 2; if(time){ gpio_direction_output(IO_PORT_PR_00, 1); gpio_direction_output(IO_PORT_PR_01, 1); }else{ gpio_direction_output(IO_PORT_PR_00, 0); gpio_direction_output(IO_PORT_PR_01, 0); }
- 当使用内部电源时需要注意关机后的电压需要配置到3.2v不然会存在关机不走时
#define TCFG_LOWPOWER_VDDIOW_LEVEL VDDIOW_VOL_32V //弱VDDIO电压档位
Note
- 注意事项:
rtc_early_init()
RTC内部系统有一个SDK发布时间作为默认时间:当应用层重定义set_rtc_default_time原函数时(例如上述测试例子 的set_rtc_default_time函数定义),则设置默认时间为该函数设置的时间。
当没有定义set_rtc_default_time函数则是系统默认时间为SDK发布时间,RTC设置时间不能小于默认时间。
外部晶振接芯片的PR0和PR1引脚,当在某些封装中PR口可能会和其他IO内绑在一块,此时在board_init()函数首先需要把其他IO关闭上下拉并设置输入模式,才能调用rtc_early_init初始化RTC。
外部晶振已经接了,为什么RTC不走时?
答:① 先查看外部晶振是否震荡起来,如果不震荡,确定晶振是否已坏,同时晶振引脚需要接电容到地。② 检查芯片封装是否有内部IO和晶振的PR口内绑在一起,有则设置IO关闭上下拉并设置输入模式。
2.8.3. API参考
rtc 的 API 接口说明如下:
Functions
-
void *dev_open(const char *name, void *arg)
dev_open:用于打开一个设备
- Parameters
name – 设备名称
arg – 控制参数,一般为NULL
-
int dev_read(void *device, void *buf, u32 len)
dev_read:用于设备数据的接收。
- Parameters
device – 设备句柄
buf – 要读入的 buffer 缓冲区
len – 要读入的长度
-
int dev_write(void *device, void *buf, u32 len)
dev_write:用于设备数据的发送。
- Parameters
device – 设备句柄
buf – 要写入的 buffer 缓冲区
len – 要写入的长度
-
int dev_ioctl(void *device, int cmd, u32 arg)
dev_ioctl:用于对设备进行控制和参数的修改
- Parameters
device – 设备句柄
cmd – 设备控制命令
arg – 控制参数
-
int dev_close(void *device)
dev_close:用于关闭一个设备
- Parameters
device – 设备句柄