import
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
#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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user