Nuvoton(新唐科技)如何產生精確的延遲時間?

假如使用者想要產生精確的延遲時間,建議使用__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

3. 設定Linker

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;

}




★博文內容參考自 網站,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論