找回密码
 立即注册
查看: 1137|回复: 6

新手关于STC8H的官方Delay函数 疑问

[复制链接]

该用户从未签到

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2023-2-19 23:55:11 | 显示全部楼层 |阅读模式
对于STC8H开天斧的官方软件延时函数有些疑问,请大家帮忙看看


如下是官方的Delay函数

void delay_ms(unsigned char ms)
{
        unsigned int i;
        do{
                i = MAIN_Fosc / 10000;
                while(--i);
        }while(--ms);
}


#define MAIN_Fosc                24000000L        //定义主时钟

我对(/10000)这个操作有疑问,因为当这个板子工作在24MHZ主频时 一微秒计算24次,MAIN_Fosc / 10000  等于 2400,则100微秒就完成了循环

我认为应该是 /1000 才能达到延时1毫秒,不知道是否有错?

回复 送花

使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 15:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    5

    回帖

    108

    积分

    注册会员

    积分
    108
    发表于 2023-2-20 14:15:15 | 显示全部楼层
    我就直接用了,我是没去深算,个人看法是:要了解时钟周期  机器周期  指令周期。 算时间得要看执行的指令周期,你这样的算法只是简单的时钟周期。Y1和Y6系列执行的指令周期就相差10多倍

    该用户从未签到

    1

    主题

    1

    回帖

    9

    积分

    新手上路

    积分
    9
     楼主| 发表于 2023-2-20 18:15:01 | 显示全部楼层
    zyj1739 发表于 2023-2-20 14:15
    我就直接用了,我是没去深算,个人看法是:要了解时钟周期  机器周期  指令周期。 算时间得要看执行的指令 ...

    感谢回答,但我认为这个计算应该差不多,因为我用STC ISP的软件延时程序设定24MHZ主频,Y6指令的情况下,一毫秒的延时程序如下,大概是一毫秒做一千二百多次减法,还没到差距一个数量级的程度

    void Delay1ms()                //@24.000MHz
    {
            unsigned char i, j;

            _nop_();
            i = 32;
            j = 40;
            do
            {
                    while (--j);
            } while (--i);
    }
  • TA的每日心情
    奋斗
    昨天 08:53
  • 签到天数: 118 天

    [LV.6]常住居民II

    26

    主题

    1226

    回帖

    3837

    积分

    论坛元老

    积分
    3837
    发表于 2023-2-20 18:32:11 | 显示全部楼层
    例程的延时函数是自适应的,MAIN_Fosc 是主时钟的定义,只要根据用户的主时钟进行设置就能产生正确的延时时间。
    通过汇编代码可以比较直观的看出,一次循环需要10个指令周期,“MAIN_Fosc / 10000”就是延时1ms需要循环的次数。
    1.png
    C语言也差不多,可以通过keil的汇编窗口查看编译出来的代码所需要的指令周期:
    2.png
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 15:45
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    5

    回帖

    108

    积分

    注册会员

    积分
    108
    发表于 2023-2-21 09:47:46 | 显示全部楼层
    指令代码差不多,比对了下以前的如 DEC A,    Y1 Y5 Y6 执行周期,同一指令:12T  2T  1T   所以减次数是一样的,但周期相差很大
  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 79 天

    [LV.6]常住居民II

    3

    主题

    28

    回帖

    265

    积分

    中级会员

    积分
    265
    发表于 2023-3-18 22:20:17 | 显示全部楼层
    "一微秒计算24次"  这句话不准确,应该是1微秒24个时钟,
    4楼已经解释,这个循环用了10的时钟。

    该用户从未签到

    45

    主题

    2847

    回帖

    6402

    积分

    超级版主

    积分
    6402
    发表于 2023-3-19 10:54:33 | 显示全部楼层
    本帖最后由 梁工 于 2023-3-19 10:59 编辑

    楼主,这样的程序,从2002年开始的STC89C51系列,我们都用了超过20年,不用怀疑。
    估计楼主没有实际测试过,就直接怀疑了,做技术的应该先花几分钟测试,发现问题才去怀疑。
    楼主至少可以像楼上的贴那样,看下反汇编,数一数循坏内的指令周期数,就不会有此问了。

    “因为当这个板子工作在24MHZ主频时 一微秒计算24次”,那就是一次循环1个时钟周期,不知道楼主是如何想的,对一个16位的无符号整型变量(双字节)做减1操作,并判断是否为0,非0则继续循环,这怎么可能在1个周期内完成?M4都做不到,何况8位MCU,一条短跳转指令就要3个时钟了。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-20 03:15 , Processed in 0.062335 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表