FAQ

常見問答

如何產生精確的延遲時間?  日期:2020-02-07

假如使用者想要產生精確的延遲時間,建議使用__nop()函數來組合達成。__nop() 函數能夠產生 1 個精確的 CPU 時脈週期延遲時間。然而,由於 flash 的速度低於 CPU 的時脈速度,在 CPU 內部有快取優化的技術,編譯器也會自動針對程式做優化,造成 __nop() 函數組合出來的時間會與預期的時間不同。因此,建議將程式碼放置於 SRAM 中執行,以避免優化造成的非預期延遲時間問題。

 

以產生 2 us 的延遲時間為例:

(1) CPU 時脈= 32MHz => 1 CPU 時脈週期花費 1/32000000 sec = 31.25 ns

(2) 2 us 延遲時間 = 2000 ns / 31.25 ns = 64 次 CPU 時脈週期

1. 於 KEIL 的專案中加入一個新的 .c 檔案

2. 將檔案位置指定至 SRAM

283-1

283-2

3. 設定Linker

283-3

4. 撰寫產生延遲的程式碼

 

由於執行一次 for 迴圈需要花費 5 個 CPU 時脈週期的時間,因此可以使用以下的方式達到 2 us 的時間延遲

 

(1) 執行一次 for 迴圈需要 5 個 CPU 時脈週期

(2) 執行一次 __NOP() 指令需要 1 個 CPU 時脈週期

(3) 64 個 CPU 時脈週期 = 8 ( 5 ( for 迴圈 ) + 3 * 1 ( __NOP() ) )

 

void Delay_Test_Function(void)

{

    for ( i = 0; i < 8 ; i++)     /* Delay for 2 micro seconds. */

    {

        __NOP();

        __NOP();

        __NOP();

    }

}

5. 測試

使用者可以利用下列程式碼進行延遲時間的測試,透過示波器量測 I/O toggle 的時間,以觀察延遲函數是否精準。由於 CPU 需要下指令讓 I/O 轉態,因此觀察到的時間中需要增加轉態的指令時間 (PA0 = 0)。

 

執行一次 PA = 0 需花費 11 CPU 指令週期,這意味著 I/O 會持續 (64+11) * 31.25 ns = 2343.75 ns 的時間才進行轉態。

 

void Delay_Test_Function(void)

{

    uint32_t i, DelayCNTofCPUClock = 8;

    PA0 = 1;

    for( i = 0; i < DelayCNTofCPUClock ; i++)     /* Delay for 2 micro seconds. */

    {

        __NOP();

        __NOP();

        __NOP();

    }

    PA0 = 0;

}

283-4

產品: 微控制器 ,8 位元 8051 微控制器 ,Arm Cortex-M0 微控制器 ,Arm Cortex-M23 微控制器 ,Arm Cortex-M4 微控制器
應用:
功能:
This website uses cookies to ensure you get the best experience on our website. Learn more