参考网友 Knut Knusper代码: /** @brief DWT延时初始化* @return DWT计数器状态* 1:DWT计数器未启动(错误)* 0:DWT计数器启动(正常)* */uint32_tDWT_Delay_Init(void){/* Disable TRC */CoreDebug->DEMCR&=~CoreDebug_DEMCR_TRCENA_Msk;// ~0x01000000;/* Enable TRC */CoreDebug->DEMCR|=CoreDebug...
DelayNms(1000); LedOff(LED0); // DelayNms(1000); } } 我最开始是在主循环中用这个代码去看闪烁现象的。结果出现的情况是LED灯一直亮它不灭,我把代码改了一下。 int main(void) { DrvInit(); AppInit(); while(1) { LedOff(LED0); DelayNms(1000); LedOn(LED0); // DelayNms(1000); } ...
void delay_us(u32 in_xus) {u32 init_tick = REG_DWT_CYCCNTR; u32 num_tick = (SystemCoreClock / 1000000) *in_xus; while((REG_DWT_CYCCNTR - init_tick) < num_tick); } void delay_ms(u32 in_xms) {for(u32 i = 0; i < in_xms; i++) {delay_us(1000); } } 延时性能:当M...
//使用DWT延时time_ms毫秒voidDWT_Delay_Ms(uint32_ttime_ms){uint32_told_counter,current_counter;uint32_tdelay_ms;old_counter=DWT_TS_GET();current_counter=DWT_TS_GET();delay_ms=0;while(delay_msold_counter)delay_ms=(current_counter-old_counter)/(SystemCoreClock/1000);elsedelay_ms=(current...
void DelayInit(u32 clk){ cpuclkfeq = clk;//打开CYCCNT功能,并把计数器清零,最后打开计数器对cpu...
DWT 初始化函数 void dwt_delay_init(void); DWT 微秒延时函数 void dwt_delay_us(uint32_...
(); // 计算需要的循环次数 uint32_t cycles = delay * cpu_clock / 1000000; // 将延时转换为CPU周期数 // 等待直到计数器达到指定值 while (DWT->CYCCNT < cycles); // 停止并重置性能计数器 DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; } int main(void) { HAL_Init(); // ...
delay_ms(300);//延时300mstime_ms=DTW_Time_Difference_ms(); 如下图,可以精确测量代码运行时间,没有问题。 05、后记 本文使用DWT代替了定时器部分功能,它的优缺点如下: 1、优点是:方便移植,经过测试在M3、M4、M7内核的MCU上都可以使用。 2、缺点是:和定时器一样,都有一个延时的最大时间,测量代码运行时...
_Mode=GPIO_Mode_OUT;/* 复用模式 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);}while(1){GPIOC->BSRR=(uint32_t)GPIO_Pin_0;bsp_delay_us(1);GPIOC->BSRR=(uint32_t)GPIO_Pin_0<<16;bsp_delay_us(1);}...
void PLATFORM_InitDelay(void){ DCB->DEMCR &= ~DCB_DEMCR_TRCENA_Msk;DWT->CTRL &= ~DWT_...