查看: 2148|回复: 1

[其他] us延时的实现方式

[复制链接]
  • TA的每日心情
    开心
    2018-6-15 16:35
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    50

    主题

    159

    帖子

    0

    高级会员

    Rank: 4

    积分
    549
    最后登录
    2023-3-11
    发表于 2016-3-7 13:43:51 | 显示全部楼层 |阅读模式
    本帖最后由 yinyue01 于 2016-3-7 13:45 编辑

    ARM Cortex-M系列MCU中us延时的实现方式:
    1.软件延时
    void delay_us(uint32_t value)
    {
    uint32_t i;
    i = value * xx;
    while(i--);
    }
    根据CPU频率和指令周期调节xx,可以实现us延时,不够精确但实现简单,可能会被中断打断。

    2.Systick计数
    比较常用,如超核固件库中实现:
    ……省略DelayInit();
    void SYSTICK_DelayUs(uint32_t us)
    {
        uint32_t temp;
        SysTick->LOAD = us * fac_us;
        SysTick->VAL = 0;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
        do
        {
            temp = SysTick->CTRL;
        }
        while((temp & SysTick_CTRL_ENABLE_Msk) && !(temp & SysTick_CTRL_COUNTFLAG_Msk));
    }
    但操作系统会用到Systick,此时需做一些处理,可参考正点原子的实现。

    3.定时器中断方式
    实现较复杂,另外定时器us级频繁中断可能导致CPU来不及处理,在STM32上尝试过,最短能实现10us左右的延时,再短的话程序卡死。NXP MCU上未尝试过。

    4.采用Cortex-M3/4内核中的跟踪组件DWT的时钟周期计数CYCCNT实现
    #define  DWT_CR      *(volatile u32 *)0xE0001000
    #define  DWT_CYCCNT  *(volatile u32 *)0xE0001004
    #define  DEM_CR      *(volatile u32 *)0xE000EDFC
    #define  DEM_CR_TRCENA                   (1 << 24)
    #define  DWT_CR_CYCCNTENA                (1 <<  0)
    static uint32_t cpuclkfeq;
    void delay_init(uint32_t clk)
    {
        cpuclkfeq = clk;
        DEM_CR |= DEM_CR_TRCENA;
    //    DWT_CYCCNT      = 0u;
        DWT_CR |= DWT_CR_CYCCNTENA;
    }
    void delay_us(uint32_t us)
    {
        uint32_t temp;
        temp= DWT_CYCCNT;
        us *=  SystemCoreClock/1000000;
        while((uint32_t)( DWT_CYCCNT - temp)< us);
    }
    该方式与Systick方式类似,但Cortex-M0内核中无CYCCNT,不能通过该方式实现。


    欢迎讨论~~~~




    我知道答案 目前已有1人回答
    回复

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2016-3-7 13:58:38 | 显示全部楼层
    楼主你好!
    如果要精确延时,建议你使用定时器,你可以使用PIT,LPTMR,SYSTICK,FTM等等,不会出现10us延时卡住。
    只要你的系统时钟比较高!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-23 13:33 , Processed in 0.089459 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表