背景:BlueNRG系列带硬件RTC,但很不幸,在睡眠的时候,这部分是关掉的。如果此时使用会造成时间不准。
但是很多时候,我们又需要计时功能。怎么解决呢?
方案1:
使用HAL_VTimerTimeoutCallback,不断轮询。(一定程度上可以解决计时问题,但是如果不清楚会容易造成时间不准,误差。)
因为VTime 接口uint32_t HAL_VTimerAcc_sysT32_ms(uint32_t sysTime, int32_t msTime) 本身就不是精确的,有省去一些tick。
方案2:
使用我原创的RTC代码计时(代码见附件),下面可能凑合着一些英文,大家凑合着看。
说说重点哈:VTime时钟是32K时钟x分频和y倍频得到的, (x可能是25,y可能是2, 或者x=50,y=4),并且睡眠也在计时。
The RTC Demo can accurate timing. Features: 1. It include RTC time and Unix timestamp(Number of seconds passed since 1970-01-01 00:00:00 GMT). a. uint32_t get_unix_timestamp(void); b. sysTime_t get_date(void); 2. It base on VTimer(internal time), so sleep do not effect timing. 3. It can sync system time by RTC time and by Unix timestamp. a. bool sync_time_by_sec(uint32_t timestamp); b. bool sync_time_by_rtc(uint16_t year,uint8_t month,uint8_t day, uint8_t hour,uint8_t minute,uint8_t second); E[url=]xplain[/url]: internal time units is about 2.4114us (1000000/409600) 409600 ticks is 1s(Relatively accurate) internal time will overflow [url=]per[/url] 5242879 ms[87 min]). Use caution: It must be called periodically in a period of internal time tick (called period < internal time tick period [87 min]) Usage examples: while(1) { /* BlueNRG-1 stack tick */ refresh_sys_time();// or get_unix_timestamp(); BTLE_StackTick(); BlueNRG_Sleep(SLEEPMODE_WAKETIMER, wakeup_source, wakeup_level); }
改天我有时间,再发布带软件定时器功能(结合睡眠),消息队列,批量数据透传参考设计。。。。。。敬请关注! 代码仅供参考,目前我测试了一天多,感觉还是挺准的。
|