APP RTC驱动
宏定义
CFG_LPCLK_INTERNAL_EN
| 描述 | 值 |
|---|---|
| 是否使用芯片内部低速时钟源(RNG2时钟) |
|
如果使能芯片内部低速时钟源,需要检查SDK_Folder\build\config\custom_config.h文件中PMU_CALIBRATION_ENABLE宏是否使能,不使能的情况下时钟源可能不准。
详细信息请参考文件:SDK_Folder\build\config\custom_config.h。
APP_RTC_ALARM_DISABLE_DATE
| 描述 | 值 |
|---|---|
| 不使能RTC的时间定时 |
CALENDAR_ALARM_DISABLE_DATE |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rtc.h。
APP_RTC_ALARM_DISABLE_TICK
| 描述 | 值 |
|---|---|
| 不使能RTC的TICK定时 |
CALENDAR_ALARM_DISABLE_TICK |
详细信息请参考文件: SDK_Folder\drivers\inc\app_rtc.h。
APP_RTC_ALARM_DISABLE_ALL
| 描述 | 值 |
|---|---|
| 不使能RTC的TICK定时和时间定时 |
CALENDAR_ALARM_DISABLE_ALL |
详细信息请参考文件: SDK_Folder\drivers\inc\app_rtc.h。
结构体
app_rtc_time_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint8_t sec |
Calendar日历秒 |
取值范围:0 ~ 59 |
| uint8_t min |
Calendar日历分钟 |
取值范围:0 ~ 59 |
| uint8_t hour |
Calendar日历小时 |
取值范围:0 ~ 23 |
| uint8_t date |
Calendar日历日期 |
取值范围:1 ~ 31 |
| uint8_t mon |
Calendar日历月份 |
取值范围:1 ~ 12 |
| uint8_t year |
Calendar日历年 |
取值范围:0 ~ 99 |
| uint8_t week |
Calendar日历周 |
取值范围:0 ~ 6 |
| uint16_t ms |
Calendar日历毫秒 |
取值范围:0 ~ 999 |
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_calendar.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_calendar.h
- GR5405:SDK_Folder\hal_drv\include\hal_calendar.h
app_rtc_alarm_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint8_t min |
Calendar alarm分钟 |
取值范围:0 ~ 59 |
| uint8_t hour |
Calendar alarm小时 |
取值范围:0 ~ 23 |
| uint8_t alarm_sel |
Calendar alarm按周报警还是按月报警 |
取值范围:
|
| uint16_t alarm_date_week_mask |
Calendar alarm具体值,依赖于alarm_sel的值 |
例如选择星期一和星期二进行报警,设置参数如下: CALENDAR_ALARM_WEEKDAY_MON|CALENDAR_ALARM_WEEKDAY_TUE |
- GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_calendar.h
- GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_calendar.h
- GR5405:SDK_Folder\hal_drv\include\hal_calendar.h
app_rtc_evt_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_rtc_evt_type_t type |
RTC事件类型 |
该参数的取值可以是下列值中的任意一个:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_rtc.h。
枚举
app_rtc_evt_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_RTC_EVT_DATE_ALARM = 0 |
RTC ALARM中断 |
| APP_RTC_EVT_TICK_ALARM = 1 |
RTC TICK中断 |
| APP_RTC_EVT_OVERFLOW = 2 | RTC溢出中断 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_rtc.h。
app_rtc_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_RTC_INVALID = 0 |
RTC不可用 |
| APP_RTC_ACTIVITY = 1 |
RTC激活 |
详细信息请参考文件:SDK_Folder\drivers\src\app_rtc.c。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_rtc_init |
Y |
Y |
Y |
Y |
Y |
| app_rtc_deinit |
Y |
Y |
Y |
Y |
Y |
| app_rtc_init_time |
Y |
Y |
Y |
Y |
Y |
| app_rtc_get_time |
Y |
Y |
Y |
Y |
Y |
| app_rtc_setup_alarm |
Y |
Y |
Y |
Y |
Y |
| app_rtc_setup_tick |
Y |
Y |
Y |
Y |
Y |
| app_rtc_disable_event |
Y |
Y |
Y |
Y |
Y |
| app_rtc_time_sync |
N |
Y |
Y |
Y |
Y |
app_rtc_init
| 函数原型 | uint16_t app_rtc_init(app_rtc_evt_handler_t evt_handler) |
|---|---|
| 功能说明 | 初始化RTC |
| 输入参数 | evt_handler:用户自己实现的中断回调函数 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_rtc_evt_handler_t)(app_rtc_evt_t *p_evt); HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理,回调函数根据返回事件类型进行相应的处理即可。 使用芯片内部低速时钟源时,该接口无意义。 |
app_rtc_deinit
| 函数原型 | uint16_t app_rtc_deinit(void) |
|---|---|
| 功能说明 | 反初始化RTC |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 使用芯片内部低速时钟源,该接口无意义 |
app_rtc_init_time
| 函数原型 | uint16_t app_rtc_init_time(app_rtc_time_t *p_time) |
|---|---|
| 功能说明 | 初始化RTC时间 |
| 输入参数 | p_time:初始时间结构体 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_rtc_get_time
| 函数原型 | uint16_t app_rtc_get_time(app_rtc_time_t *p_time) |
|---|---|
| 功能说明 | 获取RTC时间 |
| 输入参数 | p_time:存放时间的结构体 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_rtc_setup_alarm
| 函数原型 | uint16_t app_rtc_setup_alarm(app_rtc_alarm_t *p_alarm) |
|---|---|
| 功能说明 | 设置RTC alarm中断 |
| 输入参数 | p_alarm:Alarm中断的配置参数 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 使用芯片内部低速时钟源,该接口无意义 |
app_rtc_setup_tick
| 函数原型 | uint16_t app_rtc_setup_tick(uint32_t interval) |
|---|---|
| 功能说明 | 设置RTC TICK中断 |
| 输入参数 | interval:RTC TICK值(单位:ms) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 使用芯片内部低速时钟源,该接口无意义 |
app_rtc_disable_event
| 函数原型 | uint16_t app_rtc_disable_event(uint32_t disable_mode) |
|---|---|
| 功能说明 | 禁用RTC中断 |
| 输入参数 | disable_mode:可取值APP_RTC_ALARM_DISABLE_DATE、APP_RTC_ALARM_DISABLE_TICK、APP_RTC_ALARM_DISABLE_ALL |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_rtc_time_sync
| 函数原型 | void app_rtc_time_sync(uint16_t SlowClockFreq) |
|---|---|
| 功能说明 | 同步RTC时间 |
| 输入参数 | SlowClockFreq:校准后的慢速时钟 |
| 返回值 | |
| 备注 | 适用于GR5526、GR5x25、GR533x和GR5405 |
示例工程
RTC
示例工程通过RTC实现闹钟功能,工程目录:SDK_Folder\projects\peripheral\rtc\app_rtc。
流程图
示例工程首先初始化RTC并注册回调函数,设置RTC时间,RTC开始计时,并通过接口获取当前的时间并打印,验证RTC已经正常计时。其次,设置闹钟,并启动RTC TICK中断,每10tick产生一次中断,每1000 tick打印日志,与此同时当到达闹钟定时时间8:01时,产生闹钟定时中断,并输出相应日志。
初始化参数
- 初始日期设置:2019年5月20日8点0分0秒
app_rtc_time_t time; time.year = 19; time.mon = 5; time.date = 20; time.hour = 8; time.min = 0; time.sec = 0; time.week = 0; app_rtc_init_time(&time); -
设置alarm为每周的上午8点01分。此函数必须在每次设置系统时间后重新调用。代码如下:
app_rtc_alarm_t alarm; alarm.alarm_sel = CALENDAR_ALARM_SEL_WEEKDAY; alarm.alarm_date_week_mask = 0xFF; alarm.hour = 8; alarm.min = 1; app_rtc_setup_alarm(&alarm)- alarm_sel:选择按周或月报警,此处选择CALENDAR_ALARM_SEL_WEEKDAY(按周报警)。
- alarm_date_week_mask:每周具体哪天或者几天报警,0xFF表示每周每一天都报警。
重要函数
- 初始化RTC并注册回调函数
app_rtc_init(app_rtc_evt_handler) -
设置初始时间
app_rtc_init_time(&time) -
获取当前时间
app_rtc_get_time(&time) -
设置闹钟
app_rtc_setup_alarm(&alarm) -
设置RTC TICK中断
app_rtc_setup_tick(10)每10 tick产生一次中断
测试验证
连接开发板到PC端,打开串口助手,连接串口,查看串口日志。App current time为获取当前时间并打印的日志,Tick alarm为RTC TICK中断打印的日志,设置闹钟8:01 am,在8:01 am时中断打印Date alarm。
每秒串口打印当前时间,并设置date alarm为8:01am:
[18:02:59.277] App current time: 05.20.19 Mon 08:00:01
[18:03:00.281] App current time: 05.20.19 Mon 08:00:02
[18:03:01.286] App current time: 05.20.19 Mon 08:00:03
[18:03:02.290] App current time: 05.20.19 Mon 08:00:04
[18:03:03.294] App current time: 05.20.19 Mon 08:00:05
Set an date alarm every day at 8.01 am.
设置tick定时,每计数1000 tick,打印一次当前时间:
Set an tick alarm every 10 ms.
[18:03:16.362] Tick alarm, 05.20.19 Mon 08:00:18, 100.
[18:03:17.366] Tick alarm, 05.20.19 Mon 08:00:19, 200.
[18:03:18.368] Tick alarm, 05.20.19 Mon 08:00:20, 300.
[18:03:19.373] Tick alarm, 05.20.19 Mon 08:00:21, 400.
定时闹钟时间到:
[18:03:57.519] Tick alarm, 05.20.19 Mon 08:00:59, 4200.
[18:03:58.331] Date alarm.
[18:03:58.503] Tick alarm, 05.20.19 Mon 08:01:00, 4300.