xxkj2010 发表于 2024-7-3 14:12:09

STC-ISP提供的软件延时函数,为什么不采用主频自适应模式?

下面是从STC-ISP中生成的STC8H软件延时程序:

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

        _nop_();
        i = 32;
        j = 40;
        do
        {
                while (--j);
        } while (--i);
}
而在官方例程中,多数都采用频率自适应程序:
STC单片机自适应毫秒级延时函数:
//#define MAIN_Fosc 48000000L      //定义主时钟
//#define MAIN_Fosc 44236800L      //定义主时钟
//#define MAIN_Fosc 40000000L      //定义主时钟
//#define MAIN_Fosc 36864000L      //定义主时钟
//#define MAIN_Fosc 35000000L      //定义主时钟
//#define MAIN_Fosc 33177600L      //定义主时钟
//#define MAIN_Fosc 30000000L      //定义主时钟
//#define MAIN_Fosc 27000000L      //定义主时钟
//#define MAIN_Fosc 24000000L      //定义主时钟
//#define MAIN_Fosc 22118400L      //定义主时钟
//#define MAIN_Fosc 20000000L      //定义主时钟
//#define MAIN_Fosc 18432000L      //定义主时钟
#define MAIN_Fosc 12000000L      //定义主时钟
//#define MAIN_Fosc 11059200L      //定义主时钟
//#define MAIN_Fosc 6000000L      //定义主时钟
//#define MAIN_Fosc 5529600L      //定义主时钟

void delay_ms(unsigned int ms)                //注:ms_max=65536
{
    unsigned int i;
    do
    {
            i=MAIN_Fosc/10000;                //STC8
            while(--i)      ;
            }
    while(--ms);
}总是觉得频率自适应函数用起来比较方便(主频率改了,也不用重新用STC-ISp生成代码),只是从STC-ISP中生成的软件延时程序,为什么不采用这种模式呢?
是不是从STC-ISP中生成的软件延时程序,延时准确度比较高还是其他原因?

_奶咖君_ 发表于 2024-7-3 15:15:04

光主频还不够,,你再加上指令集自适应吧

soma 发表于 2024-7-3 16:11:40

自适应的准确性好像没有这个高

晓飛飛 发表于 2024-7-5 13:02:17

没错,你的最后一句话就是原因,从STC-ISP中生成的软件延时程序,已经精确到了单个指令周期,而自适应的延时程序,误差几十个us都是可能的。不同主频下,单i=MAIN_Fosc/10000这一条指令产生的误差就已经很大了。

xxkj2010 发表于 2024-7-5 13:35:24

有空测试一下,看看误差究竟有多大

lzzasd 发表于 2024-7-5 16:39:26

有不同指令周期的,官方的比较精准,自动算的差点,一般也没问题

xxkj2010 发表于 2024-7-5 18:32:54

lzzasd 发表于 2024-7-5 16:39
有不同指令周期的,官方的比较精准,自动算的差点,一般也没问题
算指令时间,因为是汇编的,所以看不懂,只能借助工具方便。

晓飛飛 发表于 2024-7-5 18:42:07

本帖最后由 晓飛飛 于 2024-7-5 18:44 编辑

xxkj2010 发表于 2024-7-5 18:32
算指令时间,因为是汇编的,所以看不懂,只能借助工具方便。
可以用Keil debug,延时前后放断点,查看运行周期和时间

xxkj2010 发表于 2024-7-8 11:00:50

测试了,延时有稍微的区别,都是微秒级的差异。对于要求不严格的延时完全可以使用。
例如同样47毫秒,自适应延时是47.295,而ISP工具生成的延时程序是49.314。
页: [1]
查看完整版本: STC-ISP提供的软件延时函数,为什么不采用主频自适应模式?