[STM32F1] for循环延时的疑问

[复制链接]
1804|34
 楼主| chuxh 发表于 2023-2-12 12:18 | 显示全部楼层 |阅读模式
写芯片驱动时序时,使用for循环语句进行简单的延时,代码如下。用示波器测试了过该函数延时为1.04us。当调用delay_us(10)的时候,示波器测试为7us多,delay_us(100)才70us多。研究了很久不知所以然,按道理说delay_us(100)应该大于100us才对啊,为什么反而还小呢?
void delay_us(u32 nTime)
{
    u32 i,j;
    for(i=0;i<nTime;i++)
   {
       for(j=6;j>0;j--);
   }
}
bqyj 发表于 2023-2-12 12:20 | 显示全部楼层
运行过程可能被其他时序打乱
tian111 发表于 2023-2-12 12:26 | 显示全部楼层
而且本身就是不精确延时
yufe 发表于 2023-2-12 12:28 | 显示全部楼层
第一  你该测试1000ms延时,以此时的延时为准
dingy 发表于 2023-2-12 12:31 | 显示全部楼层
第二  测试延时的时候你要关中断
lium 发表于 2023-2-12 12:32 | 显示全部楼层

void delay_us(u32 nTime)
{
    u32 i,j;
    for(i=0;i<nTime;i++)
   {
       for(j=6;j>0;j--);
   }
}

没理解你那个1.04us  是怎么测出来的  
 楼主| chuxh 发表于 2023-2-12 12:33 | 显示全部楼层
是的,这种延时有可能会被中断打乱的,不精确。
supernan 发表于 2023-2-12 12:35 | 显示全部楼层
以1000ms延时为基准,能分析一下为什么么?
 楼主| chuxh 发表于 2023-2-12 12:45 | 显示全部楼层
我测试1us没有关中断,实际用的时候也不可能关掉中断延时吧?
xxrs 发表于 2023-2-12 12:46 | 显示全部楼层
用置高置低电平测试出来的?
happy_10 发表于 2023-2-12 12:48 | 显示全部楼层
怀疑是置电平语句占了一定的时间
dengdc 发表于 2023-2-12 12:52 | 显示全部楼层
嗯,导致for延时不足1us
wuhany 发表于 2023-2-12 13:12 | 显示全部楼层
然后调用delay_us(1000)时误差就被放大了。
 楼主| chuxh 发表于 2023-2-12 13:14 | 显示全部楼层
我是用置高置低电平测试出来的,现在我怀疑是置电平语句占了一定的时间,导致for延时不足1us,然后调用delay_us(1000)时误差就被放大了。
lizye 发表于 2023-2-12 13:17 | 显示全部楼层
主要是进出函数,需要一定的时间,10次循环也是进出一次函数,100次循环也是进出一次函数
shimx 发表于 2023-2-12 13:20 | 显示全部楼层
你第一次测得时间剔除进出函数的时间,才是循环体真正的执行时间。
jiaxw 发表于 2023-2-12 13:21 | 显示全部楼层
楼上正解,入栈出栈及跳转要时间,但这个时间并不随你的延时时间变化而变化。
spark周 发表于 2023-2-12 13:22 | 显示全部楼层
这种延时函数,在延时时间很短时,进出函数的指令会占很大比例,时间长的时候,进出函数的时间还是固定的,但是比例就小很多了。
liliang9554 发表于 2023-2-12 13:24 | 显示全部楼层
你示波器所测的1.04US是(进出delay函数时间+IO输出函数时间+你想要的for(+1))的时间总和,实际for语句+1的时间应该等于1/晶振频率,而你示波器测的delay(100)同样是(进出delay函数时间+IO输出函数时间+你想要的for(+100))的时间总和,而并不是1.04*100us。  
午夜粪车 发表于 2023-2-12 13:25 | 显示全部楼层
还有,如果你需要精准的延时,请用定时器。如果你的产品对实时性要求很高,也不要用delay软件延时
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部