大家使用什么操作做为短时间延时啊?
大家使用什么操作做为短时间延时啊?我想有10us的延时时间片。
我觉得使用中断的timer来处理,有点浪费。
本来主频都不高!
再使用中断,进出中断的消耗就快等于中断的延时时间了。
这么短的延迟时间就直接nop吧!
启动一个自由运行的定时器,需要延时的时候读cnt的值出来判断 10US用中断,那就太频繁了,用NOP就好。 可以仅唤醒不响应中断。 如果精度要求高就用定时器,如果精度要求不高直接用软延时 delay**好 用 systick 计时器,阻塞等待,见 delay_us 函数:
https://github.com/dukelec/cdnet/blob/master/arch/stm32/arch_wrapper.c 看你用的什么单片机了,频率低精度要求不高的当然nop,频率高对延时有精度要求的那就用定时器。 就是使用nop命令,不过要注意不要被编译器给优化掉 这取决于主频,比如标准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); 通过编写空的 for 或 while 循环来消耗时间。 短时间延时常用两种操作:1. 软件延时,写空循环(for/while),按 CPU 指令周期算循环次数,比如中颖 MCU 可写 “for (i=0;i<100;i++);” 实现微秒 / 毫秒级延时,简单但受主频影响;2. 定时器延时,配置定时器定时中断或查询计数标志,精度高、不占 CPU,适合对延时精度要求高的场景,中颖 MCU 的 Timer 模块可轻松实现。
短时间延时常用操作:利用 MCU 定时器生成精确延时,配置定时中断或查询计数溢出;或用空循环,通过指令执行周期估算延时,需结合主频计算;也可调用库函数的延时接口。空循环简单但受编译器优化影响,定时器更精准,适合微秒到毫秒级短延时。
中颖 MCU 短时间延时常用三种操作:1. 空指令循环,写 for 循环执行 NOP 指令,适合微秒级延时,简单但受主频影响;2. 定时器延时,配置 Timer 定时中断或查询标志位,精准稳定,不占用 CPU;3. 利用系统滴答定时器(SysTick),适合毫秒级延时,适配 32 位 MCU,方便移植,按需选即可。 短时间延时常用两种操作:软件层面用空循环,通过计算指令周期确定循环次数(如 51 单片机 12MHz 下,单周期指令循环 12 次约 1μs);硬件层面用定时器,配置计数初值让其快速溢出触发中断,精度更高且不占用 CPU。需根据延时精度需求选择,微秒级常用循环,毫秒级优先定时器。
可以考虑使用DWT(Data Watchpoint and Trace)单元的CYCCNT寄存器来实现精确的延时,这不需要额外的中断开销。
页:
[1]