[经验] stm32不占用定时器和Systick的us级延时函数

dql2016   2017-6-5 18:59 楼主

来自国外TM大神的函数库,不占用定时器和Systick的延时函数,利用了DWT,十分巧妙,不占用任何定时器或者systick即可实现精确的微秒级延时

uint32_t TM_DELAY_Init(void) {
#if !defined(STM32F0xx)
        uint32_t c;

    /* Enable TRC */
    CoreDebug->DEMCR &= ~0x01000000;
    CoreDebug->DEMCR |=  0x01000000;

    /* Enable counter */
    DWT->CTRL &= ~0x00000001;
    DWT->CTRL |=  0x00000001;

    /* Reset counter */
    DWT->CYCCNT = 0;

        /* Check if DWT has started */
        c = DWT->CYCCNT;

        /* 2 dummys */
        __ASM volatile ("NOP");
        __ASM volatile ("NOP");

        /* Return difference, if result is zero, DWT has not started */
        return (DWT->CYCCNT - c);
#else
        /* Return OK */
        return 1;
#endif
}
__STATIC_INLINE void Delay(__IO uint32_t micros) {
#if !defined(STM32F0xx)
        uint32_t start = DWT->CYCCNT;

        /* Go to number of cycles for system */
        micros *= (HAL_RCC_GetHCLKFreq() / 1000000);

        /* Delay till end */
        while ((DWT->CYCCNT - start) < micros);
#else
        /* Go to clock cycles */
        micros *= (SystemCoreClock / 1000000) / 5;

        /* Wait till done */
        while (micros--);
#endif
}
200747m009sql308hqfqzq.png


回复评论 (2)

DWT延时代码好几年前就看过,很巧妙,但是也有缺点
点赞  2017-6-5 20:31
systick用作delay确实很浪费,毕竟在大的项目中,定时器资源是很宝贵的
DWT替换掉systick就很美滋滋~
写寄存器,简单,方便。
物致DIY 欢迎你的加入~ QQ群:646461928 公众号:智物知心致成 小店
点赞  2017-6-6 09:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复