一.DWT简介
所有的Cortex-M系列内核都带有一个DWT的作为调试用的定时器,所以本方法可以用在所有以ARM Cortex-M系列为内核的MCU中。
以STM32为例,DWT的时基为SystemCoreClock,需要调用SystemCoreClockUpdate函数更新一下,否则该值不一定正确!
二、初始化代码
根据权威指南所述,使用DWT需要先简单配置一下:
然后清零CYCCNT并且使能它,对应初始化代码很简单如下:
void DWTInit(void) {
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
}
三、延时微秒代码
//ms以上的就没必要用这种方法了,所以参数uint16_t足够
void DWTDelayus(const uint16_t x) {
const uint32_t start = DWT->CYCCNT;
const uint32_t ticks = x * (SystemCoreClock / 1000000);
for(uint32_t i = DWT->CYCCNT - start; i < cnt; i = DWT->CYCCNT - start);
}