打印
[STM8]

stm8单片机延时问题

[复制链接]
5289|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小孩飞啊飞|  楼主 | 2011-9-9 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晶振16M,请问执行一个for循环所用的时间大概是多久?如何计算?
void delay(unsigned int x)
{
  unsigned int i,j;
   for(i=x;i>0;i--)
      for(j=300;j>0;j--);
}
这个程序大概延时多久?谢谢各位了
沙发
Ryanhsiung| | 2011-9-9 17:03 | 只看该作者
本帖最后由 Ryanhsiung 于 2011-9-9 17:04 编辑

授人以鱼不如授人以渔,其实我也不太会算!
方法1: 实测
     例 :void main(void)
            {//关掉所有中断,及可以会影响的外设及模块
               delay(200);  GPIOx_XXXX =1;   
                delay(200);  GPIOx_XXXX =0;
            } //用示波器实测I O口的频率
       优点:方便快捷
       缺点:没有考虑进出棧,delay(1)  g与delay(200)/200,可以偏差较在
方法2: 计算
    你可以查看汇编代码(LIST文件 MAP文件中自己找)
    查看指令表,根据频率及指令来确定时间
    优点:这个是最准的
     缺点:这个会比较费时,并要具有一定汇编基础
  我一般用第一种方法,有些程序对时间要要比较准的话我就会用第二种

使用特权

评论回复
板凳
小孩飞啊飞|  楼主 | 2011-9-13 10:41 | 只看该作者
上面语句是做了两重循环,所以它的延时时间应该是300乘上X再乘以指令周期。现在上面每次循环后都是空操作(相当于NOP指令),查下STM8的指令手册,NOP指令是单周期指令,所以对于16M时钟晶振,其指令周期应该是1/16M秒,即为0.0625us,所以这程序的总延时时间应该是300乘上X再乘上0.0625us.

使用特权

评论回复
地板
Ryanhsiung| | 2011-9-13 12:18 | 只看该作者
3# 小孩飞啊飞 不是这么简单,FOR语句执行也是要指令、要时间的哦!还是看反汇编出来的代码吧

使用特权

评论回复
5
小孩飞啊飞|  楼主 | 2011-9-14 14:47 | 只看该作者
谢谢大家了,这个delay毕竟不精确,最后我用了定时器了

使用特权

评论回复
6
guanggaoren| | 2011-9-14 20:30 | 只看该作者
MARK

使用特权

评论回复
7
mlj1775| | 2015-9-1 09:11 | 只看该作者
请问各位大神,最终这个延时的是多少时间的啊

使用特权

评论回复
8
mzhboy| | 2015-9-1 10:09 | 只看该作者
mlj1775 发表于 2015-9-1 09:11
请问各位大神,最终这个延时的是多少时间的啊

自己用IAR模拟器跑

现在用这种延时的可不多见

我一般用tim4生成心跳

使用特权

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

本版积分规则

0

主题

44

帖子

1

粉丝