64 lines
1.3 KiB
C
64 lines
1.3 KiB
C
#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));
|
||
|
|
}
|
||
|
|
|