[家电应用] 大家使用什么操作做为短时间延时啊?

[复制链接]
5630|14
 楼主| jobszheng 发表于 2025-3-8 17:34 | 显示全部楼层 |阅读模式
大家使用什么操作做为短时间延时啊?
我想有10us的延时时间片。

我觉得使用中断的timer来处理,有点浪费。
本来主频都不高!
再使用中断,进出中断的消耗就快等于中断的延时时间了。


OceanGaze 发表于 2025-3-8 18:00 | 显示全部楼层
这么短的延迟时间就直接nop吧!
zchong 发表于 2025-3-9 13:11 | 显示全部楼层
启动一个自由运行的定时器,需要延时的时候读cnt的值出来判断
钓鱼大师 发表于 2025-3-9 16:20 | 显示全部楼层
10US用中断,那就太频繁了,用NOP就好。
xch 发表于 2025-3-10 07:49 | 显示全部楼层
可以仅唤醒不响应中断。
weifeng90 发表于 2025-3-10 08:19 来自手机 | 显示全部楼层
如果精度要求高就用定时器,如果精度要求不高直接用软延时
xionghaoyun 发表于 2025-3-10 08:46 | 显示全部楼层
delay**好
dukedz 发表于 2025-3-10 14:27 | 显示全部楼层
用 systick 计时器,阻塞等待,见 delay_us 函数:
https://github.com/dukelec/cdnet/blob/master/arch/stm32/arch_wrapper.c
alienmiller 发表于 2025-3-10 17:49 | 显示全部楼层
看你用的什么单片机了,频率低精度要求不高的当然nop,频率高对延时有精度要求的那就用定时器。
SpiritSong 发表于 2025-3-10 23:13 | 显示全部楼层
就是使用nop命令,不过要注意不要被编译器给优化掉
ayb_ice 发表于 2025-3-11 09:55 | 显示全部楼层
这取决于主频,比如标准51就是10个NOP,如果是单周期51,又跑的比较快,可以用定时器方式2,不开中断,直接读取两次计数值,相减大于等于10即可

//假设单周期51,跑12M
#define us        *12
void delay_xus(u8 x)
{
        volatile u8 ucBase = TH0;
       
        while ((u8)(TH0 - ucBase) < x)
        {
                //__nop();
        }
}

        delay_xus(10us);
自动化陈稳 发表于 2025-5-25 18:19 | 显示全部楼层
通过编写空的 for 或 while 循环来消耗时间。
水星限定 发表于 2025-11-12 16:22 | 显示全部楼层
短时间延时常用两种操作:1. 软件延时,写空循环(for/while),按 CPU 指令周期算循环次数,比如中颖 MCU 可写 “for (i=0;i<100;i++);” 实现微秒 / 毫秒级延时,简单但受主频影响;2. 定时器延时,配置定时器定时中断或查询计数标志,精度高、不占 CPU,适合对延时精度要求高的场景,中颖 MCU 的 Timer 模块可轻松实现。
抱素 发表于 2025-11-13 16:03 | 显示全部楼层
短时间延时常用操作:利用 MCU 定时器生成精确延时,配置定时中断或查询计数溢出;或用空循环,通过指令执行周期估算延时,需结合主频计算;也可调用库函数的延时接口。空循环简单但受编译器优化影响,定时器更精准,适合微秒到毫秒级短延时。
抱素 发表于 2025-11-14 19:21 | 显示全部楼层
中颖 MCU 短时间延时常用三种操作:1. 空指令循环,写 for 循环执行 NOP 指令,适合微秒级延时,简单但受主频影响;2. 定时器延时,配置 Timer 定时中断或查询标志位,精准稳定,不占用 CPU;3. 利用系统滴答定时器(SysTick),适合毫秒级延时,适配 32 位 MCU,方便移植,按需选即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:热爱开源,乐于分享。在嵌入式技术领域里面,主攻通讯协议,Modbus,TCP/IP以及虚拟化和RTOS

32

主题

781

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部