Files

62 lines
1.5 KiB
C

#include "DWT.h"
// 寄存器基地址
#define DWT_CR (*(uint32_t *)0xE0001000)
#define DWT_CYCCNT (*(uint32_t *)0xE0001004)
#define DEM_CR (*(uint32_t *)0xE000EDFC)
// 定义需使能位
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 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;
}
// get DWT count
uint32_t DWT_TS_GET(void)
{
return ((uint32_t)DWT_CYCCNT);
}
// 使用DWT延时time_us微秒
void DWT_delay_us(uint32_t time_us)
{
uint32_t old_counter, current_counter;
uint32_t delay_us;
old_counter = DWT_TS_GET();
current_counter = DWT_TS_GET();
delay_us = 0;
while (delay_us < time_us)
{
current_counter = DWT_TS_GET();
if (current_counter > old_counter)
delay_us = (current_counter - old_counter) / (SystemCoreClock / 1000000);
else
delay_us = (current_counter + 0XFFFFFFFF - old_counter) / (SystemCoreClock / 1000000);
}
}
// 使用DWT延时time_ms毫秒
void DWT_delay_ms(uint32_t time_ms)
{
uint32_t old_counter, current_counter;
uint32_t delay_ms;
old_counter = DWT_TS_GET();
current_counter = DWT_TS_GET();
delay_ms = 0;
while (delay_ms < time_ms)
{
current_counter = DWT_TS_GET();
if (current_counter > old_counter)
delay_ms = (current_counter - old_counter) / (SystemCoreClock / 1000);
else
delay_ms = (current_counter + 0XFFFFFFFF - old_counter) / (SystemCoreClock / 1000);
}
}