CC2530單片機延時函數實際測試

    因爲要檢測不同的波形,所以對時間要求很高,但是發現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



   


     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章