打印
[STM8]

关于STM8S精确延时问题

[复制链接]
7854|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l217914|  楼主 | 2014-4-29 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
贴程序先:
void Sent0_0(void)
{
         PD_ODR_bit.ODR2=0;   

        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();

        PD_ODR_bit.ODR2=1;

   
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();        
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
        __no_operation();
}

void main()
{
    SCLK_Config();
    IO_init();
    Sent0_0();
    Sent0_0();
    Sent0_0();
    Sent0_0();
    Sent0_0();
    Sent0_0();
    Sent0_0();
}

我想问的是:为什么同样的延时函数,像上面那样叠加起来用,在示波器上看到的波形(注:不是看负脉宽,负脉宽没问题)——正脉宽有些不一样。比如调用第一个延时:6.60us,第二个是:6.60us,第三个是6.5us,第四个是6.2us。为什么会这样?
虽然st芯片程序是流水线设计,一个CALL指令就要6个周期,一个RET就要4个周期,但是我按照汇编指令条数数了,就是延时不对呀。求大神不吝赐教。。。。。
本人做的延时是us+ns级别,晶振13.56M。
沙发
mmuuss586| | 2014-4-29 15:10 | 只看该作者
全都放在MAIN函数里测试下,不要调用延时函数。
或者你把正负脉冲的指令位置换下;

可能函数返回的时候所占用的机器周期不一样吧;

使用特权

评论回复
板凳
l217914|  楼主 | 2014-4-29 16:46 | 只看该作者
mmuuss586 发表于 2014-4-29 15:10
全都放在MAIN函数里测试下,不要调用延时函数。
或者你把正负脉冲的指令位置换下;

感谢你的回答。
一:正负脉宽是功能要求的,而且这只是应功能调试观察,不影响。
二:全部函数放在main里面,但我程序上要调用类似这种时序的延时好多个,上面只是其中一个,所以治标不治本呀。
三:我也怀疑是函数返回所占用的机器周期不一样,但我调试的时候对应汇编指令寄存器,机器周期数目都一样呀。
所以郁闷啊。。。。

使用特权

评论回复
地板
wx85105157| | 2014-5-7 21:11 | 只看该作者
三级流水线被打断了时间就不定了

使用特权

评论回复
5
desertsailor| | 2014-5-8 13:51 | 只看该作者
流水线的原因,这个是你不能控制的,不是简单的算汇编指令周期就可以得出的

使用特权

评论回复
6
desertsailor| | 2014-5-8 13:53 | 只看该作者
在这一点上,AVR要好得多,可以明确得出延时的周期数。

使用特权

评论回复
7
aydf369| | 2014-8-5 16:53 | 只看该作者
好象和函数地址对齐有关

使用特权

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

本版积分规则

10

主题

61

帖子

1

粉丝