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ò)實(shí)現(xiàn)粗同步,其步驟如下:
在終端節(jié)點(diǎn)接受到來自協(xié)調(diào)器的數(shù)據(jù)包時(shí),該數(shù)據(jù)包中包含協(xié)調(diào)器發(fā)出該數(shù)據(jù)包的時(shí)間信息timetmp。通過讀取該參數(shù)并對我們的定時(shí)器2的溢出寄存器和累計(jì)時(shí)間進(jìn)行修改來實(shí)現(xiàn)時(shí)間的粗同步(即忽略數(shù)據(jù)包的傳輸和傳播時(shí)延、終端接收時(shí)間以及定時(shí)器2的計(jì)數(shù)器T2M0和T2M1的值修改)。
首先為了保證在終端中的我們使用的軟件定時(shí)器事件不會產(chǎn)生大的時(shí)間差錯(cuò),我們需要在函數(shù)中首先調(diào)用osalTimeUpdate()函數(shù)來更新定時(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ù)由于是修改,所以不需要過多的操作直接殘暴的修改即可,因?yàn)閞emUsTicks參數(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ù)修改定時(shí)器2的溢出計(jì)數(shù)器的值為0,然后通過設(shè)置prevoverflowCount參數(shù)、accumulatedOverflowCount參數(shù)、preAccumulatedOverflowCount參數(shù)和overflowCount參數(shù)來修改時(shí)間。
最后, 該方法還沒有進(jìn)行驗(yàn)證,后續(xù) 進(jìn)行……





