OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9000|回复: 14

stm32f407 如何设置延时到纳秒(ns)级别的?

[复制链接]

16

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-5-4
在线时间
2 小时
发表于 2016-7-5 14:14:23 | 显示全部楼层 |阅读模式
请教各位大师,原子哥的程序都是延时us和ms的 请问延时ns的如何写?多谢各位大师们 不吝赐教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

112

帖子

0

精华

高级会员

Rank: 4

积分
818
金钱
818
注册时间
2014-10-22
在线时间
589 小时
发表于 2016-7-5 16:49:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-3-10
在线时间
18 小时
发表于 2016-7-17 02:18:29 | 显示全部楼层
同求延时ns的函数
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-7-27
在线时间
3 小时
发表于 2016-9-12 14:01:32 | 显示全部楼层
同求延时ns程序,谢谢!
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2016-9-12 14:17:19 | 显示全部楼层
最快也达不到1ns,主频又不是上G的。计算一下,执行一条汇编指令的时间6 / (168 * 1.25) = 1 / 35us,差不多28.6ns。所以你可以封这么个函数
delay_29ns(uint32_t ns)
{
    while(ns--);
}
态度决定一切
回复 支持 反对

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-9-12 15:21:42 | 显示全部楼层
冰封嗜魔 发表于 2016-9-12 14:17
最快也达不到1ns,主频又不是上G的。计算一下,执行一条汇编指令的时间6 / (168 * 1.25) = 1 / 35us,差不多 ...

你的这个while(ns--)包含了对ns数值的判断以及对ns减一的操作,绝对不是一条汇编指令能完成的。
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2016-9-12 16:16:38 | 显示全部楼层
特朗姆斯 发表于 2016-9-12 15:21
你的这个while(ns--)包含了对ns数值的判断以及对ns减一的操作,绝对不是一条汇编指令能完成的。

自己可以仿真看汇编指令,就是一条简单的NOP指令,自己不试一下怎么能下结论呢。
态度决定一切
回复 支持 反对

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-9-12 16:31:59 | 显示全部楼层
楼主能否透露一下,什么产品需要延时纳秒?鄙人还从未有遇到过
回复 支持 反对

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-9-12 17:28:37 | 显示全部楼层
本帖最后由 特朗姆斯 于 2016-9-12 17:46 编辑
冰封嗜魔 发表于 2016-9-12 16:16
自己可以仿真看汇编指令,就是一条简单的NOP指令,自己不试一下怎么能下结论呢。

从delay_29ns(1)这个函数到cnt++这句话,PC指针从0x0800026C跳到0x08000272,你确定这等同于一条简单的NOP指令?



然后,把你封装的函数去掉,省去跳转函数所需的语句,直接仿真while(cnt--)可以很清楚的看到要执行多少条汇编语句。
444.jpg


最后,我想说你确定你仿真过你的这个延迟函数?

333.jpg
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2016-9-13 08:24:30 | 显示全部楼层
特朗姆斯 发表于 2016-9-12 17:28
从delay_29ns(1)这个函数到cnt++这句话,PC指针从0x0800026C跳到0x08000272,你确定这等同于一条简单的NO ...

我仿真的时候只看了那一条NOP,后面还是有其他指令的,确实不止一条。
态度决定一切
回复 支持 反对

使用道具 举报

10

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2014-3-8
在线时间
11 小时
发表于 2016-9-13 08:53:55 | 显示全部楼层
肯定啊,光cnt++这个就不止一条了,起码也要用个++cnt。
回复 支持 反对

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-9-13 09:04:16 | 显示全部楼层
冰封嗜魔 发表于 2016-9-13 08:24
我仿真的时候只看了那一条NOP,后面还是有其他指令的,确实不止一条。

我觉得你的这个思路有一定可行性。

其实不用这么麻烦,直接用若干条汇编NOP语句实现29ns的倍数的延迟即可。这种方式的缺点会导致程序的简洁性较差。
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2016-9-13 10:15:23 | 显示全部楼层
特朗姆斯 发表于 2016-9-13 09:04
我觉得你的这个思路有一定可行性。

其实不用这么麻烦,直接用若干条汇编NOP语句实现29ns的倍数的延迟 ...

恩恩,是的,其实我最想说的是那个延时达不到1ns的精度嘛。
态度决定一切
回复 支持 反对

使用道具 举报

4

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2016-8-2
在线时间
13 小时
发表于 2016-9-14 23:17:32 | 显示全部楼层
使用软件的方法与编译器的优化程度有关,确实有这方面的需求的话,应该要使用一个硬件定时器,将定时器的步长设为1ns,当需要1ns精度的延时的时候,启动定时器,然后循环读取计数值,发生变化即表示产生了1ns延时。不能使用中断,原因可以自己分析
回复 支持 反对

使用道具 举报

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2016-8-15
在线时间
52 小时
发表于 2016-9-15 12:20:52 | 显示全部楼层
用高级定时器吧,频率可以到168M
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 13:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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