蓝牙BLE芯片PHY6222之设置时间戳
个人建议使用外部32K作为RTC的时钟源,精度相对6222内部32K高很多,内部32K看官方资料是±500ppm的时钟精度
驱动
在app_datetime.c中加以下驱动
#if(time_test)
UTCTime appUTC_time;
UTCTimeStruct appUTC_timeStruct;
#define UNIX_2000 946656000
UTCTimeStruct user_get_utc(void);
void user_set_utc(UTCTimeStruct *m_UtcStr);
void my_dump_byte_reverse(uint8_t* pData, int dlen);
void app_set_time(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minutes, uint8 seconds)
{
UTCTimeStruct test_time;
test_time.year = year;
test_time.month = month - 1;
test_time.day = day - 1;
test_time.hour = hour;
test_time.minutes = minutes;
test_time.seconds = seconds;
user_set_utc(&test_time);
}
void get_current_systerm_time(datetime_t * rtc_time)
{
UTCTimeStruct convet_timestamp_unit;
UTCTimeStruct cnt;
UTCTime utc_timecnt;
cnt = user_get_utc();
rtc_time->year = cnt.year;
rtc_time->month = cnt.month;
rtc_time->day = cnt.day;
rtc_time->hour = cnt.hour;
rtc_time->minutes = cnt.minutes;
rtc_time->seconds = cnt.seconds;
convet_timestamp_unit.year = cnt.year;
convet_timestamp_unit.month = cnt.month - 1;
convet_timestamp_unit.day = cnt.day - 1;
convet_timestamp_unit.hour = cnt.hour;
convet_timestamp_unit.minutes = cnt.minutes;
convet_timestamp_unit.seconds = cnt.seconds;
utc_timecnt = osal_ConvertUTCSecs(&convet_timestamp_unit) + 94665600;
LOG("#timestamp=%d\r\n", utc_timecnt);
LOG("#%4d:%02d:%02d--%02d:%02d:%02d\r\n", rtc_time->year, rtc_time->month, rtc_time->day,
rtc_time->hour, rtc_time->minutes, rtc_time->seconds);
}
void user_set_utc(UTCTimeStruct *m_UtcStr)
{
appUTC_time = osal_ConvertUTCSecs(m_UtcStr);
osal_setClock(appUTC_time - UNIX_2000);
}
void timestamp_get_time(datetime_t * rtc_time)
{
UTCTimeStruct cnt;
cnt = user_get_utc();
rtc_time->year = cnt.year;
rtc_time->month = cnt.month;
rtc_time->day = cnt.day;
rtc_time->hour = cnt.hour;
rtc_time->minutes = cnt.minutes;
rtc_time->seconds = cnt.seconds;
LOG("#%4d:%02d:%02d--%02d:%02d:%02d\r\n", rtc_time->year, rtc_time->month, rtc_time->day,
rtc_time->hour, rtc_time->minutes, rtc_time->seconds);
}
void user_set_utc_timestamp_set_time(UTCTime utc_timecnt)
{
osal_setClock(utc_timecnt - UNIX_2000);
}
UTCTimeStruct user_get_utc(void)
{
UTCTimeStruct tmp_utcStr;
appUTC_time = osal_getClock();
appUTC_time += UNIX_2000;
osal_ConvertUTCTime(&appUTC_timeStruct, appUTC_time);
tmp_utcStr = appUTC_timeStruct;
tmp_utcStr.day += 1;
tmp_utcStr.month += 1;
return tmp_utcStr;
}
#endif
在app_datetime.h中加入以下声明
#define time_test 1
#if(time_test)
#include "OSAL_Clock.h"
#include "comdef.h"
#include "OSAL.h"
#define time_set_timestamp 0 //使用时间设置时间戳
#define timestamp_set_time 1 //使用timestamp设置时间
void timestamp_get_time(datetime_t * rtc_time);
void user_set_utc_timestamp_set_time(UTCTime utc_timecnt);
void app_set_time(uint16 year, uint8 month, uint8 day, uint8 hour, uint8 minutes, uint8 seconds);
void get_current_systerm_time(datetime_t * rtc_time);
#endif
初始化
#if(time_test)
if(time_set_timestamp)
{
app_set_time(2024, 4, 2, 13, 55, 56);
}
else if(timestamp_set_time){
user_set_utc_timestamp_set_time(1712038396);
}
osal_start_reload_timer(simpleBLEPeripheral_TaskID, SBP_ADD_RL_EVT, 5000);
#endif
定时5s获取时间
if ( events & SBP_ADD_RL_EVT )
{
#if(time_test)
datetime_t ttdatetime;
if(time_set_timestamp){
get_current_systerm_time(&ttdatetime);
}
else if(timestamp_set_time)
{
timestamp_get_time(&ttdatetime);
}
#endif
return ( events ^ SBP_ADD_RL_EVT );
}
PS:个人学习笔记demo传送门提取码:j4ny