#include extern uint32_t SystemCoreClock; //定义需使能位 #define DEM_CR_TRCENA (1u<<24) #define DWT_CR_CYCCNTENA (1u<<0) //DWT init void DWT_Init(void) { DEM_CR |= (uint32_t)DEM_CR_TRCENA; DWT_CYCCNT = (uint32_t)0u; DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA; } void DWT_DelayUs(uint32_t us) { uint32_t start = DWT_CYCCNT; uint32_t cycles = us * (SystemCoreClock / 1000000); uint32_t elapsed; while (1) { uint32_t current = DWT_CYCCNT; if (current >= start) { elapsed = current - start; } else { elapsed = (0xFFFFFFFFu - start) + current; // 处理溢出 } if (elapsed >= cycles) break; } } void DWT_DelayMs(uint32_t ms) { for (uint32_t i = 0; i < ms; i++) { DWT_DelayUs(1000); } } //使用DWT测量函数运行时间 float DTW_Time_DiffMs(volatile uint32_t start, volatile uint32_t stop) { uint32_t diff; if(stop > start) diff = stop - start; else diff = stop + 0XFFFFFFFFu - start; return (diff / (SystemCoreClock/1000)); } float DTW_Time_DiffUs(volatile uint32_t start, volatile uint32_t stop) { uint32_t diff; if(stop > start) diff = stop - start; else diff = stop + 0XFFFFFFFFu - start; return (diff / (SystemCoreClock/1000000)); }