因爲要檢測不同的波形,所以對時間要求很高,但是發現Zstack本身提供的微秒級的延時其實有誤差。
因此特地寫了測試函數,然後用示波器觀察了時間。詳細如下:
先說CC2530與普通8051單片機時鐘的不同,CC2530的每個指令是一個時鐘,而標準的8051的指令週期是12個時鐘。
若選用32MHZ的時鐘頻率,那麼時鐘週期是1/32 us,一個指令也就是1/32us.
然後我們需要確定ZStack中使用的時鐘頻率,找到ZMain.c文件中的 int main (void)函數,在
HAL_BOARD_INIT();
中可以看到選擇的是32MHZ的時鐘頻率。同時也可以讀取CLKCONCMD中第6位的值,如果爲0則爲32MHZ。
ZStack中大多使用的延時函數如下:
void Delay_us(uint16 value){
while (value--)
{
asm("NOP"); //一個指令週期佔用一個時鐘週期
asm("NOP");
asm("NOP");
}
}
用示波器測試的不同的參數,其時間值如下表:
參數值 | 時間值 |
75 | 100us |
130 | 170us |
100 | 130us |
這個時間經過實際檢測是準確的。
但是我還是想弄明白其中的原因,Delay_us()函數中,一次循環+3個Nop指令的彙編代碼如下圖:
每條指令都用紅色標記表明其需要的時鐘週期,也就是一次循環需要21個時鐘週期,如果按照一個時鐘1/32us的話,當參數值爲75時,時間長爲75X21/32=49.2us.
這與實際測試時不符合的,實際爲100us.
我暫時猜測爲在ZStack在不同功能處理下也許時鐘週期不同,或者有中斷等的干擾(實際上我使用延時時關閉了所有的中斷),以後有時間再做具體研究。但如果時鐘爲16MHZ的話,那計算時間和實際測試時間則是一致的。
另一位博主也記錄了其他人的測試,有同樣的問題:
http://blog.csdn.net/geek_monkey/article/details/52171537