3回答

1收藏

浅谈软件延时

STMCU STMCU 3737 人阅读 | 3 人回复 | 2015-08-06


很多的单片机的真高手和假高手 都不喜欢用  软件延时 !

我不是高手,所以我还用!!!

我只用过keil编译器 !


KEIL 编译器的优化级别 对我写得下面这些函数是有影响的..

Keil V8.02 中第0-3级   是一个档

           4-5级是  一个档

      6-9级是一个档

===========================

例如下的这些例子在 0-3的级别下还是很精确的


注意:INT8U  你用 unsigned char 替代就可以用了


/*------------------------
    软件延时(单位:秒)   KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
    最长延时时间255秒 晶振12Mhz

        若count=0,实际延时0.000014秒
        若count=1,实际延时1.000024秒
        若count=2,实际延时2.000034秒
        若count=3,实际延时3.000044秒
        若count=n,实际延时n + 0.000014 + (0.00001 * n)秒
//---------------------------------------------
void Delay_Sec(INT8U count)
{
    long int i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 16666; i++) {
            ;
        }
    }
}



/*------------------------
    软件延时(单位:秒)  KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
    最长延时时间255秒 晶振11.0592Mhz

        若count=0,实际延时0.00001519秒
        若count=1,实际延时1.00006945秒
        若count=2,实际延时2.00012369秒
        若count=3,实际延时3.00017795秒

        若count=n,实际延时n + 0.00001519 + (0.0000542 * n)秒
//------------------------
void Delay_Sec(INT8U count)
{
    long int i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 15360; i++) {
            ;
        }
    }
}
-------------------------*/


/*------------------------
    软件延时(单位:秒)   KEIL 优化级别为0-3时

-------------------------*/
/*------------------------
    最长延时时间255秒 晶振22.1184Mhz

        若count=0,实际延时0.00000760秒
        若count=1,实际延时1.00041667秒
        若count=2,实际延时2.00082574秒
        若count=3,实际延时3.00123481秒

        若count=n,实际延时n + 0.00000760 + (0.00040907 * n)秒
//---------------------------------
void Delay_Sec(INT8U count)
{
    INT16U i;
    INT8U  j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 47275; i++) {
            ;
        }
    }
}
-------------------------*/

==========================================================

========================

==========================

/*------------------------
    软件延时(单位:毫秒)  KEIL  v8.02  优化级别 0-3好用
-------------------------*/
/*------------------------
    最长延时时间255毫秒 晶振22.1184Mhz

        若count=0,实际延时0.00760毫秒
        若count=1,实际延时1.00966毫秒
        若count=2,实际延时2.01172毫秒
        若count=3,实际延时3.01378毫秒

        若count=n,实际延时n + 0.00760 + (0.00206 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 229; i++) {
            ;
        }
    }
}


/*------------------------
    软件延时(单位:毫秒)  keil V8.02 优化级别 0-3好用
-------------------------*/
/*------------------------
    最长延时时间255毫秒 晶振11.0592Mhz

        若count=0,实际延时0.01519毫秒
        若count=1,实际延时1.02105毫秒
        若count=2,实际延时2.02691毫秒
        若count=3,实际延时3.03277毫秒

        若count=n,实际延时n + 0.01519 + (0.00586 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 114; i++) {
            ;
        }
    }
}
-------------------------*/


/*------------------------
    最长延时时间255毫秒     晶振12Mhz  (优化级别 0-3好用)

    软件延时(单位:毫秒)    (若count=0,实际延时0.014毫秒
       若count=1,实际延时1.021毫秒
       若count=2,实际延时2.028毫秒
       若count=3,实际延时3.035毫秒
       若count=4,实际延时4.042毫秒
       若count=5,实际延时5.049毫秒)
             若count=n,实际延时n + 0.014 + (0.007 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
    INT8U i;
    INT8U j;
    for (j = 0; j < count; j++) {
        for (i = 0; i < 124; i++) {
            ;
        }
    }
}
-------------------------*/

以上 这些函数 如果你将keil 优化级别设置为  4 或者是5 也是 可以用的  ,不过  就不是很精确了 !!

就是说我那些 计算 延时的公式 就不是非常非常准确了,不过也可以凑合着用  !! 就是那些 若 Count  =    ,,, 实际延时 是  ...........的 那些公式。


如果优化级别是6-9那么这些公式就非常不准确了!!!至于为什么不准确,你看看优化级别的说明就清楚了!!

=========================

再次强调  这些公式都是我自己推推导出来的 所以很有可能存在问题  
这些公式的推导 (在优化级别0-3时 ) 考虑的是 count =0 到 255的这256种情况下的准确性 。而不仅仅是其中的一种情况。


======================================================

那么在所有的优化级别下的通用的 延时函数应该怎么写呢?

应该是用那个 _nop_(); 吧  这样编译器就不会优化掉这些_nop_();了。调用那个叫 strings。h ,差不多是这个名字。这个你肯定比我清楚 !

评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

分享到:
回复

使用道具 举报

回答|共 3 个

倒序浏览

沙发

#define

发表于 2015-8-6 14:39:20 | 只看该作者

在这里发技术类贴    好像没什么人看哈    但还是发了    充实下STM32的论坛
板凳

woshizz

发表于 2015-8-6 15:50:06 | 只看该作者

软件延时和时钟有关的,楼主要小心
地板

党国特派员

发表于 2015-8-10 16:05:14 | 只看该作者

感谢分享。。。
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条