利用DWT實現微秒級延時

2021-10-23 20:23:49 字數 1377 閱讀 3063

dwt,全稱是the debug watchpoint and trace (dwt) unit,用於系統除錯及跟蹤,詳細的介紹可以參考arm官方文件:armv7-m architecture reference manual。本文將使它來實現乙個系統的延時功能。

2. 延時函式標頭檔案

#ifndef dwtdelay_h

#define dwtdelay_h

// 根據mcu做修改

#define my_mcu_sysclk (72000000)

void dwt_init(int sys_clk);

// 微秒延時

void dwt_delay_us(int usec);

#define dwt_delay_ms(msec) dwt_delay_us( msec*1000 )

#endif // dwtdelay_h

延時程式編寫

#include 「dwtdelay.h」

// 0xe000edfc demcr rw debug exception and monitor control register.

#define demcr ( *(unsigned int *)0xe000edfc )

#define trcena ( 0x01 << 24) // demcr的dwt使能位

// 0xe0001000 dwt_ctrl rw the debug watchpoint and trace (dwt) unit

#define dwt_ctrl ( *(unsigned int *)0xe0001000 )

#define cyccntena ( 0x01 << 0 ) // dwt的syccnt使能位

// 0xe0001004 dwt_cyccnt rw cycle count register,

#define dwt_cyccnt ( *(unsigned int *)0xe0001004) // 顯示或設定處理器的週期計數值

//#define dwt_delay_ms(msec) dwt_delay_us(msec*1000)

void dwt_init(int sys_clk)

// 微秒延時

void dwt_delay_us(int usec)

else // 計數溢位,翻轉

}

Windows下用MFC實現微秒級延時

一幫情況可以使用sleep 函式來實現延時,但windows不是實時的,是作業系統來分配處理器給多個執行緒的,而不會執行緒一直擁有處理器的使用權。比如延時50ms,不論採用什麼方式來延時,50ms以後,作業系統未必就正好把處理器分配給這個執行緒使用。使用乙個sleep 50 這下這個執行緒就暫停了,...

STM32微秒級別延時實現

hal庫函式中有延時函式hal delay 進行毫秒級別的延時,但是在實際的開發中編寫時序時有時需要進行較為準確的微秒級別延時像ssi協議介面等,本文章採用乙個通用定時器的方式實現微秒級別的延時,而不採用滴答定時器是由於hal庫函式中很多地方需要使用滴答定時器進行超時判斷,更改滴答配置恐引發意外,另...

C 微秒級計時器實現

在windows平台上,用來統計微秒級別耗時資訊,需要用到兩個windows api bool winapi queryperformancefrequency out large integer lpfrequency bool winapi queryperformancecounter out...