ZigBee_CC2530_0EH_關(guān)于協(xié)議棧下星狀網(wǎng)絡(luò)粗同步
對于網(wǎng)址為:https://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/63050.aspx的TI論壇中TI官方員工VV大神的回復(fù),在ZStack協(xié)議棧中不提供beacon模式,而beacon模式是同步模式:
所以我打算在應(yīng)用層通過函數(shù)對星狀網(wǎng)絡(luò)實現(xiàn)粗同步,其步驟如下:
在終端節(jié)點接受到來自協(xié)調(diào)器的數(shù)據(jù)包時,該數(shù)據(jù)包中包含協(xié)調(diào)器發(fā)出該數(shù)據(jù)包的時間信息timetmp。通過讀取該參數(shù)并對我們的定時器2的溢出寄存器和累計時間進行修改來實現(xiàn)時間的粗同步(即忽略數(shù)據(jù)包的傳輸和傳播時延、終端接收時間以及定時器2的計數(shù)器T2M0和T2M1的值修改)。
首先為了保證在終端中的我們使用的軟件定時器事件不會產(chǎn)生大的時間差錯,我們需要在函數(shù)中首先調(diào)用osalTimeUpdate()函數(shù)來更新定時器列表的timeout值,然后再使用我們自己定義的函數(shù)來修改accumulatedOverflowCount。
1.osalTimeUpdate_M( uint32 count )
位于OSAL_Clock.c中,其中
void?osalTimeUpdate_M(?uint32?count?) { ??halIntState_t?intState; ??uint32?tmp; ??uint32?ticks320us; ??uint32?elapsedMSec?=?0; ??remUsTicks?=?0?; ??HAL_ENTER_CRITICAL_SECTION(intState); ??//?Get?the?free-running?count?of?320us?timer?ticks ??tmp?=?macMcuTimer2OverflowSetTime_M(count); ??HAL_EXIT_CRITICAL_SECTION(intState); ?? ??ticks320us?=?tmp?; ??previousMacTimerTick?=?tmp; ??elapsedMSec?=?((ticks320us?*?320?)?/?1000?);??????//uint?1ms ??remUsTicks?=?((ticks320us?*?320)?%?1000)?*?25?;???//uint:40us ??//?Update?OSAL?Clock?and?Timers ??if?(?elapsedMSec?) ??{ ????timeMSec?=?elapsedMSec?%?1000; ????OSAL_timeSeconds?=?elapsedMSec?/?1000; ????osalTimerUpdate_M(?elapsedMSec?); ??} }
該函數(shù)由于是修改,所以不需要過多的操作直接殘暴的修改即可,因為remUsTicks參數(shù)、previousMacTimerTick參數(shù)、timeMSec參數(shù)和OSAL_timeSeconds參數(shù)均為該文件中的靜態(tài)參數(shù)。
2. osalTimerUpdate_M( uint32 updateTime )
void?osalTimerUpdate_M(?uint32?updateTime?) { ??//?Update?the?system?time ??osal_systemClock?=?updateTime; }
直接修改osal_systemClock。
3. macMcuTimer2OverflowSetTime_M(uint32 count)
void?macMcuTimer2OverflowSetTime_M(uint32?count) { ??uint32??overflowCount?=?0; ??//make?the?T2MOVFx??to?be?0 ??macMcuOverflowSetCount(?0x00000000?); ??prevoverflowCount?=?0; ??accumulatedOverflowCount?=?count; ??prevAccumulatedOverflowCount?=?accumulatedOverflowCount; ??overflowCount?=?accumulatedOverflowCount; ??return(overflowCount);? }
該函數(shù)首先通過調(diào)用macMcuOverFlowSetCount()函數(shù)修改定時器2的溢出計數(shù)器的值為0,然后通過設(shè)置prevoverflowCount參數(shù)、accumulatedOverflowCount參數(shù)、preAccumulatedOverflowCount參數(shù)和overflowCount參數(shù)來修改時間。
最后, 該方法還沒有進行驗證,后續(xù) 進行……