打印
[STM32F1]

在stm32上做一个10us的延时函数,怎么实现比较好?

[复制链接]
5488|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bear1|  楼主 | 2014-9-24 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bear1 于 2014-9-24 11:26 编辑

要求:  
1,不用系统滴答定时器
2,尽量简单的实现。
3,同时避免汇编。

谢谢!
沙发
想做大牛的小马| | 2014-9-24 11:28 | 只看该作者
官方例程都是用systick做的~

使用特权

评论回复
板凳
bear1|  楼主 | 2014-9-24 11:32 | 只看该作者
想做大牛的小马 发表于 2014-9-24 11:28
官方例程都是用systick做的~

系统滴答定时器主要作用就是做us延时吗?还有其他用处吗?

谢谢!

使用特权

评论回复
地板
bear1|  楼主 | 2014-9-24 11:36 | 只看该作者
单独用一个定时器实现,总总感觉有点浪费。

使用特权

评论回复
5
diweo| | 2014-9-24 12:51 | 只看该作者
以 STM32F103VCT6为例,有高级定时器下x2 + 通用定时器x4 + 普通定时器x2;
以 STM30F030F4P6为例,有高级定时器下x1 + 通用定时器x4;
这么多定时器你项目里都用得掉?
该用的时候不用才是浪费。

使用特权

评论回复
6
想做大牛的小马| | 2014-9-24 13:25 | 只看该作者
bear1 发表于 2014-9-24 11:32
系统滴答定时器主要作用就是做us延时吗?还有其他用处吗?

谢谢!

os调度可以用~当timer随你怎么用啊。。。

使用特权

评论回复
7
bear1|  楼主 | 2014-9-24 13:37 | 只看该作者
diweo 发表于 2014-9-24 12:51
以 STM32F103VCT6为例,有高级定时器下x2 + 通用定时器x4 + 普通定时器x2;
以 STM30F030F4P6为例,有高级 ...

用定时器的话,10us进一次中断是不是有点过于频繁?

使用特权

评论回复
8
songchenping| | 2014-9-24 13:44 | 只看该作者
nop 空操作啊。

使用特权

评论回复
9
diweo| | 2014-9-24 15:10 | 只看该作者
bear1 发表于 2014-9-24 13:37
用定时器的话,10us进一次中断是不是有点过于频繁?

如果没有更好的实现办法,那么只能频繁一点。
总得先把功能实现出来再慢慢改进吧。

使用特权

评论回复
10
ticomi| | 2014-9-24 15:41 | 只看该作者
精确定时、延时,也只有定时器比较好!!那么多的定时器,为什么不使用呢?很奇怪!!

使用特权

评论回复
11
bear1|  楼主 | 2014-9-24 16:45 | 只看该作者
songchenping 发表于 2014-9-24 13:44
nop 空操作啊。

nop在IAR环境下用c语言怎么实现?

使用特权

评论回复
12
sxhhhjicbb| | 2014-9-24 16:46 | 只看该作者
10us,主频如果是36M的,也就360年指令,要确确定时,只能是汇编跑空指令。
不要求很精确的话,一般的定时器,坐等定时到。

使用特权

评论回复
13
lichuanfa| | 2014-9-24 17:14 | 只看该作者
定时器不可开启中断,类似于延时函数

使用特权

评论回复
14
dongranmengming| | 2014-9-24 18:37 | 只看该作者
楼上说的,定时器不开中断一直查询,或者空指令延时

使用特权

评论回复
15
songchenping| | 2014-9-24 18:47 | 只看该作者
bear1 发表于 2014-9-24 16:45
nop在IAR环境下用c语言怎么实现?

void Delayus(uint n)
{
   for(;n>0;n--)
   {
      _nop_();_nop_();_nop_();_nop_();_nop_();
      _nop_();_nop_();_nop_();_nop_();_nop_();
   }
}

使用特权

评论回复
16
mmuuss586| | 2014-9-24 21:16 | 只看该作者
不用定时器那只能用软件延时了

使用特权

评论回复
17
bear1|  楼主 | 2014-9-24 21:42 | 只看该作者
本帖最后由 bear1 于 2014-9-24 21:43 编辑
songchenping 发表于 2014-9-24 18:47
void Delayus(uint n)
{
   for(;n>0;n--)


在IAR下编译不能通过,奇怪。
似乎 _nop_() 有点问题。

使用特权

评论回复
18
ybluleezp| | 2014-9-24 23:34 | 只看该作者
。。。。。。。。

使用特权

评论回复
19
eydj2008| | 2014-9-25 09:28 | 只看该作者
搞不明白几个NOP的事情! 还来问! 但有一个问题是只能大于10US 这10US里面还有可能有其它中断。

使用特权

评论回复
20
lmluomin| | 2014-9-25 09:41 | 只看该作者
原来在STM32下实现一个延时这么难办。
在英飞凌的XMC4k/1k下,一共有1个32位的系统定时器,多至16个16位定时器。
同时针对你们说的1us定时的功能,有个校准计时器,每次写入后可以产生最大1us左右的延时,设定好值,只要软件不断polling就好了。

使用特权

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

本版积分规则

151

主题

964

帖子

1

粉丝