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,方便移植,按需选即可。

海边浪漫幻象 发表于 2025-11-19 17:59

短时间延时常用两种操作:软件层面用空循环,通过计算指令周期确定循环次数(如 51 单片机 12MHz 下,单周期指令循环 12 次约 1μs);硬件层面用定时器,配置计数初值让其快速溢出触发中断,精度更高且不占用 CPU。需根据延时精度需求选择,微秒级常用循环,毫秒级优先定时器。

暖茶轻语 发表于 2025-11-20 20:14

可以考虑使用DWT(Data Watchpoint and Trace)单元的CYCCNT寄存器来实现精确的延时,这不需要额外的中断开销。
页: [1]
查看完整版本: 大家使用什么操作做为短时间延时啊?