功能簡介
RTC(real-time clock)為操作系統(tǒng)中的實(shí)時(shí)時(shí)鐘設(shè)備,為操作系統(tǒng)提供精準(zhǔn)的實(shí)時(shí)時(shí)間和定時(shí)報(bào)警功能。當(dāng)設(shè)備下電后,通過外置電池供電,RTC繼續(xù)記錄操作系統(tǒng)時(shí)間;設(shè)備上電后,RTC提供實(shí)時(shí)時(shí)鐘給操作系統(tǒng),確保斷電后系統(tǒng)時(shí)間的連續(xù)性。
運(yùn)作機(jī)制
在HDF框架中,RTC模塊采用獨(dú)立服務(wù)模式,在這種模式下,每一個(gè)設(shè)備對象會獨(dú)立發(fā)布一個(gè)設(shè)備服務(wù)來處理外部訪問,設(shè)備管理器收到API的訪問請求之后,通過提取該請求的參數(shù),達(dá)到調(diào)用實(shí)際設(shè)備對象的相應(yīng)內(nèi)部方法的目的。獨(dú)立服務(wù)模式可以直接借助HDFDeviceManager的服務(wù)管理能力,但需要為每個(gè)設(shè)備單獨(dú)配置設(shè)備節(jié)點(diǎn),若設(shè)備過多會增加內(nèi)存占用。通常,一個(gè)硬件系統(tǒng)中只需要一個(gè)RTC設(shè)備,因此RTC模塊采用獨(dú)立服務(wù)模式較為合適。
獨(dú)立服務(wù)模式下,核心層不會統(tǒng)一發(fā)布一個(gè)服務(wù)供上層使用,因此這種模式下驅(qū)動(dòng)要為每個(gè)控制器發(fā)布一個(gè)服務(wù),具體表現(xiàn)為:
-
驅(qū)動(dòng)適配者需要實(shí)現(xiàn)HdfDriverEntry的Bind鉤子函數(shù)以綁定服務(wù)。
-
device_info.hcs文件中deviceNode的policy字段為1或2,不能為0。
圖 1?RTC獨(dú)立服務(wù)模式結(jié)構(gòu)圖
RTC模塊各分層作用:
-
接口層提供打開RTC設(shè)備、RTC設(shè)備讀取時(shí)間、RTC設(shè)備設(shè)置時(shí)間、RTC設(shè)備讀取警報(bào)時(shí)間、RTC設(shè)備設(shè)置警報(bào)時(shí)間、RTC設(shè)備定時(shí)報(bào)警回調(diào)函數(shù)、RTC設(shè)備設(shè)置定時(shí)報(bào)警中斷使能去使能、RTC設(shè)備設(shè)置RTC外頻、RTC設(shè)備讀取RTC外頻、復(fù)位RTC、設(shè)置RTC自定義寄存器配置,讀取RTC自定義寄存器配置以及關(guān)閉RTC設(shè)備的接口。
-
核心層主要提供RTC控制器的創(chuàng)建、銷毀,通過鉤子函數(shù)與適配層交互。
-
適配層主要是將鉤子函數(shù)的功能實(shí)例化,實(shí)現(xiàn)具體的功能。
使用指導(dǎo)
場景介紹
RTC主要用于提供實(shí)時(shí)時(shí)間和定時(shí)報(bào)警功能。
接口說明
RTC模塊提供的主要接口如表1所示,具體API詳見//drivers/hdf_core/framework/include/platform/rtc_if.h。
表 1?RTC設(shè)備API接口功能介紹
接口名 | 接口描述 |
---|---|
DevHandle RtcOpen(void) | 獲取RTC設(shè)備驅(qū)動(dòng)句柄 |
void RtcClose(DevHandle handle) | 釋放RTC設(shè)備驅(qū)動(dòng)句柄 |
int32_t RtcReadTime(DevHandle handle, struct RtcTime *time) | 讀RTC時(shí)間信息 |
int32_t RtcWriteTime(DevHandle handle, const struct RtcTime *time) | 寫RTC時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒 |
int32_t RtcReadAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime *time) | 讀RTC報(bào)警時(shí)間信息 |
int32_t RtcWriteAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, const struct RtcTime *time) | 寫RTC報(bào)警時(shí)間信息 |
int32_t RtcRegisterAlarmCallback(DevHandle handle, enum RtcAlarmIndex alarmIndex, RtcAlarmCallback cb) | 注冊報(bào)警超時(shí)回調(diào)函數(shù) |
int32_t RtcAlarmInterruptEnable(DevHandle handle, enum RtcAlarmIndex alarmIndex, uint8_t enable) | 使能/去使能RTC報(bào)警中斷 |
int32_t RtcGetFreq(DevHandle handle, uint32_t *freq) | 讀RTC外接晶振頻率 |
int32_t RtcSetFreq(DevHandle handle, uint32_t freq) | 配置RTC外接晶振頻率 |
int32_t RtcReset(DevHandle handle) | RTC復(fù)位 |
int32_t RtcReadReg(DevHandle handle, uint8_t usrDefIndex, uint8_t *value) | 讀用戶自定義寄存器 |
int32_t RtcWriteReg(DevHandle handle, uint8_t usrDefIndex, uint8_t value) | 寫用戶自定義寄存器 |
使用流程
使用RTC設(shè)備的一般流程如圖2所示。
圖 2?RTC設(shè)備使用流程圖
創(chuàng)建RTC設(shè)備句柄
RTC驅(qū)動(dòng)加載成功后,使用驅(qū)動(dòng)框架提供的查詢接口并調(diào)用RTC設(shè)備驅(qū)動(dòng)接口。
說明:
當(dāng)前操作系統(tǒng)僅支持一個(gè)RTC設(shè)備。本文涉及的RTC的所有接口,支持內(nèi)核態(tài)及用戶態(tài)使用。
DevHandle RtcOpen(void);
表 2?RtcOpen參數(shù)和返回值描述
參數(shù) | 描述 |
---|---|
void | NA |
返回值 | 描述 |
handle | 獲取對應(yīng)的RTC設(shè)備句柄成功 |
NULL | 獲取對應(yīng)的RTC設(shè)備句柄成功失敗 |
DevHandle handle = NULL;
// 獲取RTC句柄
handle = RtcOpen();
if (handle == NULL) {
// 錯(cuò)誤處理
HDF_LOGE("open rtc fail!");
return HDF_FAILURE;
}
注冊RTC定時(shí)報(bào)警回調(diào)函數(shù)
系統(tǒng)啟動(dòng)后需要注冊RTC定時(shí)報(bào)警回調(diào)函數(shù),報(bào)警超時(shí)后觸發(fā)回調(diào)函數(shù)。
int32_t RtcRegisterAlarmCallback(DevHandle handle, enum RtcAlarmIndex alarmIndex, RtcAlarmCallback cb);
表 3?RtcRegisterAlarmCallback參數(shù)和返回值描述
參數(shù) | 描述 |
---|---|
handle | DevHandle類型,RTC設(shè)備句柄 |
alarmIndex | 枚舉類型,報(bào)警索引 |
cb | 定時(shí)報(bào)警回調(diào)函數(shù) |
返回值 | 描述 |
HDF_SUCCESS | 操作成功 |
負(fù)數(shù) | 操作失敗 |
注冊RTC_ALARM_INDEX_A的定時(shí)報(bào)警處理函數(shù), 示例如下:
// 用戶注冊RTC定時(shí)報(bào)警回調(diào)函數(shù)的方法
int32_t RtcAlarmACallback(enum RtcAlarmIndex alarmIndex)
{
if (alarmIndex == RTC_ALARM_INDEX_A) {
// 報(bào)警A的處理
HDF_LOGD("RTC Alarm A callback function\n\r");
return HDF_SUCCESS;
} else if (alarmIndex == RTC_ALARM_INDEX_B) {
// 報(bào)警B的處理
HDF_LOGD("RTC Alarm B callback function\n\r");
return HDF_SUCCESS;
} else {
// 錯(cuò)誤處理
HDF_LOGE("RTC Alarm callback function fail!\n");
return HDF_FAILURE;
}
return HDF_SUCCESS;
}
int32_t ret;
// 注冊報(bào)警A的定時(shí)回調(diào)函數(shù)
ret = RtcRegisterAlarmCallback(handle, RTC_ALARM_INDEX_A, RtcAlarmACallback);
if (ret != HDF_SUCCESS) {
// 錯(cuò)誤處理
HDF_LOGE("register alarm callback fail, ret:%d", ret);
return ret;
}
操作RTC
-
讀取RTC時(shí)間。
系統(tǒng)從RTC讀取時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒,則可以通過以下函數(shù)完成:
int32_t RtcReadTime(DevHandle handle, struct RtcTime *time);
表 4?RtcReadTime參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 time 結(jié)構(gòu)體指針類型,RTC讀取時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒 返回值 描述 HDF_SUCCESS 讀取RTC時(shí)間成功 負(fù)數(shù) 讀取RTC時(shí)間失敗 int32_t ret; struct RtcTime tm; // 系統(tǒng)從RTC讀取時(shí)間信息 ret = RtcReadTime(handle, &tm); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("%s:read time fail, ret:%d", __func__, ret); return ret; }
-
設(shè)置RTC時(shí)間
設(shè)置RTC時(shí)間,則可以通過以下函數(shù)完成:
int32_t RtcWriteTime(DevHandle handle, struct RtcTime *time);
表 5?RtcWriteTime參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 time 結(jié)構(gòu)體指針類型,寫RTC時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒 返回值 描述 HDF_SUCCESS 設(shè)置RTC時(shí)間成功 負(fù)數(shù) 設(shè)置RTC時(shí)間失敗 說明:
RTC起始時(shí)間為UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用戶器件手冊要求計(jì)算配置,星期不用配置。int32_t ret; struct RtcTime tm; // 設(shè)置RTC時(shí)間為 UTC 2020/01/01 00:59:00 .000 tm.year = 2020; tm.month = 01; tm.day = 01; tm.hour= 00; tm.minute = 59; tm.second = 00; tm.millisecond = 0; // 寫RTC時(shí)間信息 ret = RtcWriteTime(handle, &tm); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("write time fail, ret:%d", ret); return ret; }
-
讀取RTC報(bào)警時(shí)間
如果需要讀取定時(shí)報(bào)警時(shí)間,則可以通過以下函數(shù)完成:
int32_t RtcReadAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime *time);
表 6?RtcReadAlarm參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 alarmIndex 枚舉類型,報(bào)警索引 time 結(jié)構(gòu)體指針類型,RTC報(bào)警時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒 返回值 描述 HDF_SUCCESS 讀取RTC報(bào)警時(shí)間成功 負(fù)數(shù) 讀取RTC報(bào)警時(shí)間失敗 int32_t ret; struct RtcTime alarmTime; // 讀RTC_ALARM_INDEX_A索引的RTC定時(shí)報(bào)警時(shí)間信息 ret = RtcReadAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("read alarm fail, ret:%d", ret); return ret; }
-
設(shè)置RTC報(bào)警時(shí)間
根據(jù)報(bào)警索引設(shè)置RTC報(bào)警時(shí)間,通過以下函數(shù)完成:
int32_t RtcWriteAlarm(DevHandle handle, enum RtcAlarmIndex alarmIndex, struct RtcTime *time);
表 7?RtcWriteAlarm參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 alarmIndex 枚舉類型,報(bào)警索引 time 結(jié)構(gòu)體指針類型,RTC報(bào)警時(shí)間信息,包括年、月、星期、日、時(shí)、分、秒、毫秒 返回值 描述 HDF_SUCCESS 設(shè)置RTC報(bào)警時(shí)間成功 負(fù)數(shù) 設(shè)置RTC報(bào)警時(shí)間失敗 說明:?RTC起始時(shí)間為UTC 1970/01/01 Thursday 00:00:00,年的最大取值按照用戶器件手冊要求計(jì)算配置,星期不用配置。
int32_t ret; struct RtcTime alarmTime; // 設(shè)置RTC報(bào)警時(shí)間為2020/01/01 00:59:59 .000 alarmTime.year = 2020; alarmTime.month = 01; alarmTime.day = 01; alarmTime.hour = 00; alarmTime.minute = 59; alarmTime.second = 59; alarmTime.millisecond = 0; // 設(shè)置RTC_ALARM_INDEX_A索引的定時(shí)報(bào)警時(shí)間 ret = RtcWriteAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("write alarm fail, ret:%d", ret); return ret; }
-
設(shè)置定時(shí)報(bào)警中斷使能或去使能
在啟動(dòng)報(bào)警操作前,需要先設(shè)置報(bào)警中斷使能,報(bào)警超時(shí)后會觸發(fā)告警回調(diào)函數(shù),可以通過以下函數(shù)完成:
int32_t RtcAlarmInterruptEnable(DevHandle handle, enum RtcAlarmIndex alarmIndex, uint8_t enable);
表 8?RtcAlarmInterruptEnable參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 alarmIndex 枚舉類型,報(bào)警索引 enable uint8_t類型,RTC報(bào)警中斷配置,1:使能,0:去使能 返回值 描述 HDF_SUCCESS 設(shè)置定時(shí)報(bào)警中斷使能或去使能成功 負(fù)數(shù) 設(shè)置定時(shí)報(bào)警中斷使能或去使能失敗 int32_t ret; // 設(shè)置RTC報(bào)警中斷使能 ret = RtcAlarmInterruptEnable(handle, RTC_ALARM_INDEX_A, 1); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("alarm interrupt enable fail, ret:%d", ret); return ret; }
-
讀取RTC外頻
讀取RTC外接晶體振蕩頻率,可以通過以下函數(shù)完成:
int32_t RtcGetFreq(DevHandle handle, uint32_t *freq);
表 9?RtcGetFreq參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 freq uint32_t類型指針,RTC的外接晶體振蕩頻率,單位(HZ) 返回值 描述 HDF_SUCCESS 讀取RTC外頻成功 負(fù)數(shù) 讀取RTC外頻失敗 int32_t ret; uint32_t freq = 0; // 讀取RTC外接晶體振蕩頻率 ret = RtcGetFreq(handle, &freq); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("get freq fail, ret:%d", ret); }
-
配置RTC外頻
配置RTC外接晶體振蕩頻率,可以通過以下函數(shù)完成:
int32_t RtcSetFreq(DevHandle handle, uint32_t freq);
表 10?RtcSetFreq參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 freq uint32_t類型,RTC的外接晶體振蕩頻率,單位(HZ) 返回值 描述 HDF_SUCCESS 配置RTC外頻成功 負(fù)數(shù) 配置RTC外頻失敗 int32_t ret; uint32_t freq = 32768; // 32768 Hz // 設(shè)置RTC外接晶體振蕩頻率,注意按照器件手冊要求配置RTC外頻 ret = RtcSetFreq(handle, freq); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("set freq fail, ret:%d", ret); return ret; }
-
復(fù)位RTC
復(fù)位RTC,復(fù)位RTC后各配置寄存器恢復(fù)默認(rèn)值,可以通過以下函數(shù)完成:
int32_t RtcReset(DevHandle handle);
表 11?RtcReset參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 返回值 描述 HDF_SUCCESS 復(fù)位RTC成功 負(fù)數(shù) 復(fù)位RTC失敗 int32_t ret; // 復(fù)位RTC,各配置寄存器恢復(fù)默認(rèn)值 ret = RtcReset(handle); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("reset fail, ret:%d", ret); return ret; }
-
讀取RTC自定義寄存器配置
按照用戶定義的寄存器索引,讀取對應(yīng)的寄存器配置,一個(gè)索引對應(yīng)一字節(jié)的配置值,通過以下函數(shù)完成:
int32_t RtcReadReg(DevHandle handle, uint8_t usrDefIndex, uint8_t *value);
表 12?RtcReadReg參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 usrDefIndex uint8_t類型,用戶定義的寄存器對應(yīng)索引 value uint8_t類型指針,待讀取寄存器值 返回值 描述 HDF_SUCCESS 讀取RTC自定義寄存器配置成功 負(fù)數(shù) 讀取RTC自定義寄存器配置失敗 int32_t ret; uint8_t usrDefIndex = 0; // 定義0索引對應(yīng)用戶定義的第一個(gè)寄存器 uint8_t value = 0; // 按照用戶定義的寄存器索引,讀取對應(yīng)的寄存器配置,一個(gè)索引對應(yīng)一字節(jié)的配置值 ret = RtcReadReg(handle, usrDefIndex, &value); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("read reg fail, ret:%d", ret); return ret; }
-
設(shè)置RTC自定義寄存器配置
按照用戶定義的寄存器索引,設(shè)置對應(yīng)的寄存器配置,一個(gè)索引對應(yīng)一字節(jié)的配置值,通過以下函數(shù)完成:
int32_t RtcWriteReg(DevHandle handle, uint8_t usrDefIndex, uint8_t value);
表 13?RtcWriteReg參數(shù)和返回值描述
參數(shù) 描述 handle DevHandle類型,RTC設(shè)備句柄 usrDefIndex uint8_t類型,用戶定義的寄存器對應(yīng)索引 value uint8_t類型,寄存器值 返回值 描述 HDF_SUCCESS 設(shè)置RTC自定義寄存器配置成功 負(fù)數(shù) 設(shè)置RTC自定義寄存器配置失敗 int32_t ret; uint8_t usrDefIndex = 0; // 定義0索引對應(yīng)用戶定義第一個(gè)寄存器 uint8_t value = 0x10; // 按照用戶的定義的寄存器索引,設(shè)置對應(yīng)的寄存器配置,一個(gè)索引對應(yīng)一字節(jié)的配置值 ret = RtcWriteReg(handle, usrDefIndex, value); if (ret != HDF_SUCCESS) { // 錯(cuò)誤處理 HDF_LOGE("write reg fail, ret:%d", ret); return ret; }
銷毀RTC設(shè)備句柄
銷毀RTC設(shè)備句柄,系統(tǒng)釋放對應(yīng)的資源。
void RtcClose(DevHandle handle);
表 14?RtcClose參數(shù)描述
參數(shù) | 描述 |
---|---|
handle | DevHandle類型,RTC設(shè)備句柄 |
// 銷毀RTC句柄
RtcClose(handle);
使用實(shí)例
本例基于Hi3516DV300開發(fā)板,提供RTC接口的完整使用流程:
-
系統(tǒng)啟動(dòng),驅(qū)動(dòng)管理模塊會識別系統(tǒng)當(dāng)前的RTC器件;
-
驅(qū)動(dòng)管理模塊完成RTC設(shè)備的初始化和設(shè)備創(chuàng)建;
-
用戶通過不同API,對該RTC設(shè)備進(jìn)行對應(yīng)的操作;
-
關(guān)閉RTC設(shè)備,釋放設(shè)備資源。
示例如下:
#include "hdf_log.h" // 標(biāo)準(zhǔn)日志打印頭文件
#include "osal_time.h" // 標(biāo)準(zhǔn)延遲&睡眠接口頭文件
#include "rtc_if.h"
int32_t RtcAlarmACallback(enum RtcAlarmIndex alarmIndex)
{
if (alarmIndex == RTC_ALARM_INDEX_A) {
// 報(bào)警A的處理
HDF_LOGD("RtcAlarmACallback: RTC Alarm A callback function\n\r");
return HDF_SUCCESS;
} else if (alarmIndex == RTC_ALARM_INDEX_B) {
// 報(bào)警B的處理
HDF_LOGD("RtcAlarmACallback:RTC Alarm B callback function\n\r");
return HDF_SUCCESS;
} else {
// 錯(cuò)誤處理
HDF_LOGE("RtcAlarmACallback:RTC Alarm callback function fail!\n\r");
return HDF_FAILURE;
}
return HDF_SUCCESS;
}
int32_t RtcTestSample(void)
{
int32_t ret;
struct RtcTime tm;
struct RtcTime alarmTime;
uint32_t freq;
uint8_t usrDefIndex = 0;
uint8_t value = 0;
DevHandle handle = NULL;
// 獲取RTC設(shè)備句柄
handle = RtcOpen();
if (handle == NULL) {
HDF_LOGE("RtcTestSample:open rtc fail!");
return HDF_FAILURE;
}
// 注冊報(bào)警A的定時(shí)回調(diào)函數(shù)
ret = RtcRegisterAlarmCallback(handle, RTC_ALARM_INDEX_A, RtcAlarmACallback);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:register alarm callback fail, ret:%d", ret);
goto ERR;
}
// 設(shè)置RTC外接晶體振蕩頻率,注意按照器件手冊要求配置RTC外頻
freq = 32768; // 32768 Hz
ret = RtcSetFreq(handle, freq);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:set freq fail, ret:%d", ret);
goto ERR;
}
freq = 0;
ret = RtcGetFreq(handle, &freq);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:get freq fail, ret:%d", ret);
goto ERR;
}
// 設(shè)置RTC報(bào)警中斷使能
ret = RtcAlarmInterruptEnable(handle, RTC_ALARM_INDEX_A, 1);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:alarm interrupt enable fail, ret:%d", ret);
goto ERR;
}
// 設(shè)置RTC時(shí)間為2020/01/01 00:00:10 .990
tm.year = 2020;
tm.month = 01;
tm.day = 01;
tm.hour= 0;
tm.minute = 0;
tm.second = 10;
tm.millisecond = 990;
// 寫RTC時(shí)間信息
ret = RtcWriteTime(handle, &tm);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:write time fail, ret:%d", ret);
goto ERR;
}
// 設(shè)置RTC報(bào)警時(shí)間為2020/01/01 00:00:30 .100
alarmTime.year = 2020;
alarmTime.month = 01;
alarmTime.day = 01;
alarmTime.hour = 0;
alarmTime.minute = 0;
alarmTime.second = 30;
alarmTime.millisecond = 100;
// 設(shè)置RTC_ALARM_INDEX_A索引定時(shí)報(bào)警時(shí)間信息, 定時(shí)時(shí)間到后會打印"RTC Alarm A callback function"
ret = RtcWriteAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:write alarm fail, ret:%d", ret);
goto ERR;
}
OsalSleep(5);
ret = RtcReadAlarm(handle, RTC_ALARM_INDEX_A, &alarmTime);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample: read alarm fail, ret: %d!", ret);
goto ERR;
}
// 讀取RTC實(shí)時(shí)時(shí)間
ret = RtcReadTime(handle, &tm);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample:read time fail, ret:%d", ret);
goto ERR;
}
ret = RtcWriteReg(handle, usrDefIndex, value);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample: write reg fail, ret: %d!", ret);
return ret;
}
ret = RtcReadReg(handle, usrDefIndex, &value);
if (ret != HDF_SUCCESS) {
HDF_LOGE("RtcTestSample: read reg fail, ret :%d!", ret);
return ret;
}
HDF_LOGD("RtcTestSample: RTC read time:\n\r");
HDF_LOGD("RtcTestSample: year-month-date-weekday hour:minute:second .millisecond %04u-%02u-%02u-%u %02u:%02u:%02u .%03u",
tm.year, tm.month, tm.day, tm.weekday, tm.hour, tm.minute, tm.second, tm.millisecond);
HDF_LOGD("RtcTestSample: all test end.");
ERR:
// 銷毀RTC設(shè)備句柄
RtcClose(handle);
return ret;
}
最后
有很多小伙伴不知道學(xué)習(xí)哪些鴻蒙開發(fā)技術(shù)?不知道需要重點(diǎn)掌握哪些鴻蒙應(yīng)用開發(fā)知識點(diǎn)?而且學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間。所以有一份實(shí)用的鴻蒙(HarmonyOS NEXT)資料用來跟著學(xué)習(xí)是非常有必要的。?
這份鴻蒙(HarmonyOS NEXT)資料包含了鴻蒙開發(fā)必掌握的核心知識要點(diǎn),內(nèi)容包含了(ArkTS、ArkUI開發(fā)組件、Stage模型、多端部署、分布式應(yīng)用開發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)、鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(HarmonyOS NEXT)技術(shù)知識點(diǎn)。
希望這一份鴻蒙學(xué)習(xí)資料能夠給大家?guī)韼椭?,有需要的小伙伴自行領(lǐng)取,限時(shí)開源,先到先得~無套路領(lǐng)取??!
獲取這份完整版高清學(xué)習(xí)路線,請點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
鴻蒙(HarmonyOS NEXT)最新學(xué)習(xí)路線
-
?HarmonOS基礎(chǔ)技能
-
HarmonOS就業(yè)必備技能?
- ?HarmonOS多媒體技術(shù)
- 鴻蒙NaPi組件進(jìn)階
- HarmonOS高級技能
-
初識HarmonOS內(nèi)核?
- 實(shí)戰(zhàn)就業(yè)級設(shè)備開發(fā)
有了路線圖,怎么能沒有學(xué)習(xí)資料呢,小編也準(zhǔn)備了一份聯(lián)合鴻蒙官方發(fā)布筆記整理收納的一套系統(tǒng)性的鴻蒙(OpenHarmony )學(xué)習(xí)手冊(共計(jì)1236頁)與鴻蒙(OpenHarmony )開發(fā)入門教學(xué)視頻,內(nèi)容包含:ArkTS、ArkUI、Web開發(fā)、應(yīng)用模型、資源分類…等知識點(diǎn)。
獲取以上完整版高清學(xué)習(xí)路線,請點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
《鴻蒙 (OpenHarmony)開發(fā)入門教學(xué)視頻》
《鴻蒙生態(tài)應(yīng)用開發(fā)V2.0白皮書》
《鴻蒙 (OpenHarmony)開發(fā)基礎(chǔ)到實(shí)戰(zhàn)手冊》
OpenHarmony北向、南向開發(fā)環(huán)境搭建
?《鴻蒙開發(fā)基礎(chǔ)》
- ArkTS語言
- 安裝DevEco Studio
- 運(yùn)用你的第一個(gè)ArkTS應(yīng)用
- ArkUI聲明式UI開發(fā)
- .……
?《鴻蒙開發(fā)進(jìn)階》
- Stage模型入門
- 網(wǎng)絡(luò)管理
- 數(shù)據(jù)管理
- 電話服務(wù)
- 分布式應(yīng)用開發(fā)
- 通知與窗口管理
- 多媒體技術(shù)
- 安全技能
- 任務(wù)管理
- WebGL
- 國際化開發(fā)
- 應(yīng)用測試
- DFX面向未來設(shè)計(jì)
- 鴻蒙系統(tǒng)移植和裁剪定制
- ……
《鴻蒙進(jìn)階實(shí)戰(zhàn)》
- ArkTS實(shí)踐
- UIAbility應(yīng)用
- 網(wǎng)絡(luò)案例
- ……
?獲取以上完整鴻蒙HarmonyOS學(xué)習(xí)資料,請點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
總結(jié)
總的來說,華為鴻蒙不再兼容安卓,對中年程序員來說是一個(gè)挑戰(zhàn),也是一個(gè)機(jī)會。只有積極應(yīng)對變化,不斷學(xué)習(xí)和提升自己,他們才能在這個(gè)變革的時(shí)代中立于不敗之地。?文章來源:http://www.zghlxwxcb.cn/news/detail-850287.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-850287.html
到了這里,關(guān)于Harmony鴻蒙南向驅(qū)動(dòng)開發(fā)-RTC接口使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!