打印
[STM32F1]

stm32死延时,不用定时器,到底有没有靠谱的方法?st公司能给个办法不?

[复制链接]
楼主: xlsbz
手机看帖
扫描二维码
随时随地手机跟帖
21
diweo| | 2014-9-26 08:45 | 只看该作者 回帖奖励 |倒序浏览
xlsbz 发表于 2014-9-26 08:42
改变时基主要为了降低负载,比如需要采高频速度

鱼和熊掌不可兼得,具体怎么决定还是需要仔细权衡,不是一句两句话说的清楚的。

使用特权

评论回复
22
bear1| | 2014-9-26 09:39 | 只看该作者
diweo 发表于 2014-9-26 08:26
有1个定时器,就等于有了无数个定时器。
有了systick,你可以同时实现1ms,10ms,100ms,1000ms任意个时基的组 ...

时基 跟 延时 是一个概念吗?

使用特权

评论回复
23
NE5532| | 2014-9-26 10:57 | 只看该作者
ARM的内核跟存储器是分离的,延时确实有不确定性,而且编译器优化还可能影响,我们用软延时,肯定都是要求不严格的地方,而且把优化关掉。

使用特权

评论回复
24
mmuuss586| | 2014-9-26 12:54 | 只看该作者

楼主应该去参加ST的研讨会,去听听;
STM32的性能并不差,比西门子低端或一般PLC功能强多了;
研讨会专门讲到这个;
你买德国的软件,硬件你可以自己设计,或买厂家的板子,做个一般的PLC还是比较容易的。还有认证;

使用特权

评论回复
25
bear1| | 2014-9-26 13:15 | 只看该作者
mmuuss586 发表于 2014-9-26 12:54
楼主应该去参加ST的研讨会,去听听;
STM32的性能并不差,比西门子低端或一般PLC功能强多了;
研讨 ...

西门子有那么强?

使用特权

评论回复
26
zhonggx| | 2014-9-26 14:14 | 只看该作者
典型的51思维!!

使用特权

评论回复
27
zhonggx| | 2014-9-26 14:15 | 只看该作者
xlsbz 发表于 2014-9-26 08:12
Systick是做时基没错。但是时基是可以让用户设置的。西门子PLC有1ms 10ms100ms。
现在若用户设置10ms。那 ...

汗一个……

使用特权

评论回复
28
zhonggx| | 2014-9-26 14:17 | 只看该作者
xlsbz 发表于 2014-9-26 08:34
你说的我明白。准确讲是时基的整数倍都能实现。

若我得用户把时基设置成10ms,怎么实现1ms???

你为什么认为不能小时1MS呢?你的定时器只能到周期计数?看来51教科书式的DELAY真是毒害了不少人。

使用特权

评论回复
29
zhonggx| | 2014-9-26 14:19 | 只看该作者
xlsbz 发表于 2014-9-26 08:12
Systick是做时基没错。但是时基是可以让用户设置的。西门子PLC有1ms 10ms100ms。
现在若用户设置10ms。那 ...

算了,懒得说了,你不会通过查询SYSTICK计数器来计时吗?轻松实现任意微秒级的软件延时。

使用特权

评论回复
30
snyvel| | 2014-9-26 14:47 | 只看该作者
ARM都这样,和ST无关

使用特权

评论回复
31
Ketose| | 2014-9-26 14:50 | 只看该作者
本帖最后由 Ketose 于 2014-9-26 14:52 编辑

Systick时基定为1ms,在Systick_IRQHandler里对一个全局的tick++,然后想延时多少毫秒,就延时多少毫秒。
下面是代码:
static __IO uint32_t uwTick;
__weak void HAL_IncTick(void)
{
  uwTick++;
}

__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}
延时函数(单位:你的systick时基)
__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay);
}

这应该是非常精确的延时了吧!

使用特权

评论回复
32
grant_jx| | 2014-9-26 16:06 | 只看该作者
最好的办法就是用硬件去产生时基,做衍生出几个需要的时间单元。
至于软件延时的办法,这个与ST没啥关系,内核和指令集的问题,要去找ARM。

使用特权

评论回复
33
bear1| | 2014-9-26 16:14 | 只看该作者
Ketose 发表于 2014-9-26 14:50
Systick时基定为1ms,在Systick_IRQHandler里对一个全局的tick++,然后想延时多少毫秒,就延时多少毫秒。
下 ...

这个也要死等吧?

使用特权

评论回复
34
xlsbz|  楼主 | 2014-9-26 16:28 | 只看该作者
mmuuss586 发表于 2014-9-26 12:54
楼主应该去参加ST的研讨会,去听听;
STM32的性能并不差,比西门子低端或一般PLC功能强多了;
研讨 ...

嗯 西门子好像也是买的壳。
我们买一方梯队的

使用特权

评论回复
35
huangqi412| | 2014-9-26 16:47 | 只看该作者
该吃药了

使用特权

评论回复
36
yhn1973| | 2014-9-26 18:10 | 只看该作者
这么高级的CPU就别指望软件延时能准确了,经测试,没有任何跳转指令的一段程序执行时间也不固定

使用特权

评论回复
37
原野之浪| | 2014-9-26 18:17 | 只看该作者
huangqi412 发表于 2014-9-26 16:47
该吃药了

傻叉

使用特权

评论回复
38
mmuuss586| | 2014-9-26 19:01 | 只看该作者
bear1 发表于 2014-9-26 13:15
西门子有那么强?

:)
难道西门子不强啊?
我说的是STM32比有些西门子中低端的PLC性能要求,比如执行一个循环指令响应速度要快;

使用特权

评论回复
39
shuangjf| | 2014-9-26 21:00 | 只看该作者
换平台了,编程方法也要跟着改变。

使用特权

评论回复
40
bear1| | 2014-9-26 22:40 | 只看该作者
shuangjf 发表于 2014-9-26 21:00
换平台了,编程方法也要跟着改变。

是的,赞同。

使用特权

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

本版积分规则