[单片机芯片]

使用 CH32V203 freeRTOS 系统时的微妙延时函数

[复制链接]
788|7
手机看帖
扫描二维码
随时随地手机跟帖
ap0405209|  楼主 | 2023-2-7 21:25 | 显示全部楼层 |阅读模式
本帖最后由 ap0405209 于 2023-2-7 22:37 编辑

使用CH32V203芯片做项目有段时间了,今日遇到过微妙延时问题,在这个发出来给大家参透下,借鉴了STMXX的方法,代码如下,若有问题,大家可以在这讨论

void delay_us(us32 us){
    us32 ticks;
    us32 told,tnow,reload,tcnt=0;

    reload = SysTick->CMP;                      //获取比较值寄存器的值
    ticks = us * (SystemCoreClock / 1000000);   //计数时间值   括号里的代表1us秒嘀嗒定时器的value会向上升或下降多少值
    told=SysTick->CNT;                          //获取当前数值寄存器值(开始时数值)

    while(1){
        tnow=SysTick->CNT;          //获取当前数值寄存器值
        if(tnow!=told)              //当前值不等于开始值说明已在计数
        {
            // 由于 freertos 中 systick配置为向上计数 --> 具体看vPortSetupTimerInterrupt() 函数说明
            if(tnow > told){
                //当前值大于开始数值,说明未计到比较值,计数值=当前值-开始值
                tcnt += tnow-told;
            }
            else{
                //当前值小于开始数值,说明已计算到比较值后并重新计数,计数值=比较值-开始值+当前值
                tcnt += reload-told+tnow;
            }

            told = tnow;   //更新开始值
            if(tcnt >= ticks) break; // 时间超过/等于要延迟的时间,则退出
        }
    }
}

使用特权

评论回复
weifeng90| | 2023-2-8 07:50 | 显示全部楼层
学习了,get一项新技能。

使用特权

评论回复
tpgf| | 2023-3-7 15:15 | 显示全部楼层
微秒延时函数的话 系统自带的头文件里边没有吗

使用特权

评论回复
wakayi| | 2023-3-7 15:33 | 显示全部楼层
通过这种计算得到的微妙延时 会不会因为程序结构复杂导致计时不准呢

使用特权

评论回复
wowu| | 2023-3-7 15:48 | 显示全部楼层
wakayi 发表于 2023-3-7 15:33
通过这种计算得到的微妙延时 会不会因为程序结构复杂导致计时不准呢

感觉确实有一定的可能 不过如果调高优先级会不会好点呢

使用特权

评论回复
xiaoqizi| | 2023-3-7 16:00 | 显示全部楼层
执行完成一轮while语句大概需要多少个周期呢

使用特权

评论回复
木木guainv| | 2023-3-7 16:27 | 显示全部楼层
为什么我看到有些系统自带的延时函数没有这么复杂的判断呢

使用特权

评论回复
磨砂| | 2023-3-7 16:39 | 显示全部楼层
木木guainv 发表于 2023-3-7 16:27
为什么我看到有些系统自带的延时函数没有这么复杂的判断呢

是不是因为系统自带的都是毫秒级别的延时函数啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

37

帖子

1

粉丝