找回密码
 立即注册
查看: 454|回复: 15

老师们,us级的延时函数咋写,能够自动适应时钟频率的

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2024-11-25 11:18:03 | 显示全部楼层 |阅读模式
老师们,微秒级的延时函数咋写,能够自动适应时钟频率的,找了半天没找到这个函数库。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-11-25 11:29:20 来自手机 | 显示全部楼层
us级的感觉还是几条nop指令和晶振频率匹配就好了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-25 11:39:57 | 显示全部楼层
延时函数受中断影响,一般不可用于精确延时
us级延时函数少则几个机器周期,受指令执行时间影响很大,直接用nop即可

点评

有精确延时需求的话,可以在延时函数里关掉中断(但是会影响中断实时性)  发表于 2024-11-25 19:14
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-04-12 15:58:13

24

主题

70

回帖

644

积分

高级会员

积分
644
发表于 2024-11-25 11:56:39 | 显示全部楼层
Debu*** 发表于 2024-11-25 11:39
延时函数受中断影响,一般不可用于精确延时
us级延时函数少则几个机器周期,受指令执行时间影响很大,直接 ...

我自己写了个自动适应时钟的,,误差几十us,将就用了。

点评

想要准确可以看示波器调nop个数  详情 回复 发表于 2024-11-25 12:00
非要写只能这样了,误差很大的  详情 回复 发表于 2024-11-25 11:59
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-25 11:59:45 | 显示全部楼层
耀*** 发表于 2024-11-25 11:56
我自己写了个自动适应时钟的,,误差几十us,将就用了。

非要写只能这样了,误差很大的
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-25 12:00:35 | 显示全部楼层
耀*** 发表于 2024-11-25 11:56
我自己写了个自动适应时钟的,,误差几十us,将就用了。

想要准确可以看示波器调nop个数

点评

也可以精确计算出来,具体要看生成的汇编  详情 回复 发表于 2024-11-25 12:01
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-25 12:01:25 | 显示全部楼层
Debu*** 发表于 2024-11-25 12:00
想要准确可以看示波器调nop个数

也可以精确计算出来,具体要看生成的汇编,对照着指令时钟数计算
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-25 12:20:28 | 显示全部楼层
us级的延迟,建议直接用NOP做成宏定义吧,或者调用官方头文件里面的NOP(x)好了,这样比较准确一点,封装成函数就误差很大了,因为调用跳转和返回都需要额外的时钟周期。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-01 06:58:22

5

主题

184

回帖

1331

积分

金牌会员

积分
1331
发表于 2024-11-25 12:48:16 | 显示全部楼层
Do you mean compile-time adapt to the clock, or run-time adapt to the clock.

Run-time adapt means you need to pass a clock parameter to the inner loop, and it will have some granularity.
If you really want 1.0 us LSB, the DJNZ opcode is 3 cycles, so a 24~40MHz SYSCLK can only match that within ~ 10%
A 24~40MHz clock and inner DJNZ can more naturally give 10-25us LSB and for that range, you can adjust to within ~1%

It is a pity the 8051 did not implement a WAIT Rn opcode, that would be 1 SYSCLK granular.

There is opcode space to support a WAIT opcode, should STC decide to add one.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-11-25 13:22:22 | 显示全部楼层
ms级自适应函数也有一定的误差。us级时间误差更大,无法做到自适应吧
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:31 , Processed in 0.191171 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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