Files
RTOS/CPU/ARM_Cortex_M3/dwt_delay.c
T

64 lines
1.3 KiB
C
Raw Normal View History

2026-05-19 11:49:22 +08:00
#include <dwt_delay.h>
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));
}