打印
[应用相关]

实在看不下去了,STM32软件精确延时的方法!!!!!!

[复制链接]
楼主: zhonggx
手机看帖
扫描二维码
随时随地手机跟帖
41
jialin123| | 2014-9-27 23:42 | 只看该作者 回帖奖励 |倒序浏览
做技术的不要那么死心眼,又不是导弹的硬实时。

使用特权

评论回复
42
dwdsp| | 2014-9-28 08:31 | 只看该作者
无论什么方法,不影响其它特性而能满足需求就好。毕竟精确延时属于微秒级的,时间够短了

使用特权

评论回复
43
xiaox314| | 2014-9-28 08:53 | 只看该作者
我是来看评论的,一个简单的延时难道是楼主的毕生心血吗?有必要骂别人白痴~

使用特权

评论回复
44
NE5532| | 2014-9-28 08:54 | 只看该作者
楼主偷换了概念,用上定时器了,还不如进中断处理算了。

使用特权

评论回复
45
myxiaonia| | 2014-9-28 12:10 | 只看该作者
xlsbz 发表于 2014-9-27 19:16
大牛,大家争论半天 就等你这个大牛出现

OK  多谢

等个毛啊,这不是和你自己写的一样嘛。。。你原来是想看看有没有和你想法一样的,而不是正确的

使用特权

评论回复
46
huzi2099| | 2014-9-28 12:28 | 只看该作者
zhonggx 发表于 2014-9-27 17:04
请你看另一个贴子吧,很多人要实现软件延时,51那种通过循环方法因为ARM的周期不确定的原因,无法实现比 ...

给你机个建议吧:
1:你的delayus函数无论无何都是死等,因为是for(;;)的结构,条件不成立不会return,除非你在for循环里调用其它函数
2:你只是用了系统中的一个计数变量+ifelse来判断计时时间,结构上并没有大的区别.
3.指令延时不是不可以用,us级的没有必要,用指令延时不准的根本原因是延时代码被系统的各种中断打乱引起的,严格的延时是要关闭全部中断的,固定长的代码执行时间肯定是固定的.
4.到点儿做事不用特别的函数,依据条件进入做事儿的函数就行了,这个条件可以是系统的任何一个与时间相关的变量,但是需要结合需求安排全局量这个比较复杂.
5.不死延时就一定要用一个定时器的理解有偏差,如果定时器自由计数从0~65535,cnt的任何一位都是和时间相关的逻辑,取这个逻辑做判断即可.

使用特权

评论回复
47
zhonggx|  楼主 | 2014-9-28 15:42 | 只看该作者
huzi2099 发表于 2014-9-28 12:28
给你机个建议吧:
1:你的delayus函数无论无何都是死等,因为是for(;;)的结构,条件不成立不会return,除非你 ...

汗,我的程序实现方法就是你第5点提到的,查询SYSTICK的计数器的计数值及重装值来实现的。

使用特权

评论回复
48
huzi2099| | 2014-9-28 17:38 | 只看该作者
本帖最后由 huzi2099 于 2014-9-28 17:49 编辑
zhonggx 发表于 2014-9-28 15:42
汗,我的程序实现方法就是你第5点提到的,查询SYSTICK的计数器的计数值及重装值来实现的。 ...


是的,任何一个时间计时变量都可以用来控制时间点,要注意的是这么几点:
1:计数累加后执行逻辑判断,其他的地方不要,目的是防止条件成立时的重人
2:要区分每X时间执行和延时X时间后执行的区别,前者不需要增加额外存储,而后者是必须要存储一些状态的
3:计数变量的计数周期越小则精度越高,但是开销也越大。
4:程序中的常量尽量使用二进制你就会发现逻辑会变简单。
这里面很难写一两个函数说清楚,会直接影响系统的性能。

使用特权

评论回复
49
huzi2099| | 2014-9-28 17:46 | 只看该作者
我的程序一般是没有delay之类的函数的,一般示例代码会这样写因为比较容易懂,实际应用中再这么写就很菜了。功能能够实现后仔细安排程序是要花些时间的。

使用特权

评论回复
50
huzi2099| | 2014-9-28 17:54 | 只看该作者
本帖最后由 huzi2099 于 2014-9-28 18:02 编辑

给你一个ds18b20,不许你用delay死等方式去驱动他,你试试?
说明一下不死等的目的,其实很简单就是让你程序中的核心的while(1)大循环以最快的速度转动。

使用特权

评论回复
51
原野之浪| | 2014-9-28 18:33 | 只看该作者
huzi2099 发表于 2014-9-28 12:28
给你机个建议吧:
1:你的delayus函数无论无何都是死等,因为是for(;;)的结构,条件不成立不会return,除非你 ...

感觉像教科书。简单问题复杂化,也是本事。建议你写本教材

使用特权

评论回复
52
huzi2099| | 2014-9-28 20:46 | 只看该作者
原野之浪 发表于 2014-9-28 18:33
感觉像教科书。简单问题复杂化,也是本事。建议你写本教材

不是复杂化,程序简单你可以随便来,功能复杂了这个就是必须的了.

使用特权

评论回复
53
原野之浪| | 2014-9-28 20:50 | 只看该作者
huzi2099 发表于 2014-9-28 20:46
不是复杂化,程序简单你可以随便来,功能复杂了这个就是必须的了.

你五笔打字??

使用特权

评论回复
54
huzi2099| | 2014-9-28 22:54 | 只看该作者
原野之浪 发表于 2014-9-28 20:50
你五笔打字??

学过忘光了,什么?

使用特权

评论回复
55
zengqj| | 2014-9-28 23:15 | 只看该作者
我是来看回复的

使用特权

评论回复
56
huzi2099| | 2014-9-29 09:54 | 只看该作者
原野之浪 发表于 2014-9-28 18:33
感觉像教科书。简单问题复杂化,也是本事。建议你写本教材

这也是初学者为什么两个简单的程序却揉不到一起的原因.

使用特权

评论回复
57
pwppwpw| | 2015-6-25 10:53 | 只看该作者
很有激情的讨论。

围观过后还是需要冷静下来自己思考。

使用特权

评论回复
58
奔牛滚滚| | 2015-6-25 11:31 | 只看该作者
楼主的延时也不精确啊,读写判断返回不需要时间么?

使用特权

评论回复
59
643757107| | 2015-6-25 14:00 | 只看该作者

while (uint32_t dwTime)
{
     __IO uint32_t  cnt = SysTick->VAL;;

写的很easy啊,给力。

使用特权

评论回复
60
598330983| | 2015-6-25 14:51 | 只看该作者
楼主应该再用流程图讲解一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则