找回密码
 立即注册
查看: 542|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 2024-7-3 14:12:09 | 显示全部楼层 |阅读模式
下面是从STC-ISP中生成的STC8H软件延时程序:

  1. void Delay1ms(void)        //STC8H@24.000MHz
  2. {
  3.         unsigned char data i, j;
  4.         _nop_();
  5.         i = 32;
  6.         j = 40;
  7.         do
  8.         {
  9.                 while (--j);
  10.         } while (--i);
  11. }
复制代码
而在官方例程中,多数都采用频率自适应程序:
  1. STC单片机自适应毫秒级延时函数:
  2. //#define MAIN_Fosc 48000000L        //定义主时钟
  3. //#define MAIN_Fosc 44236800L        //定义主时钟
  4. //#define MAIN_Fosc 40000000L        //定义主时钟
  5. //#define MAIN_Fosc 36864000L        //定义主时钟
  6. //#define MAIN_Fosc 35000000L        //定义主时钟
  7. //#define MAIN_Fosc 33177600L        //定义主时钟
  8. //#define MAIN_Fosc 30000000L        //定义主时钟
  9. //#define MAIN_Fosc 27000000L        //定义主时钟
  10. //#define MAIN_Fosc 24000000L        //定义主时钟
  11. //#define MAIN_Fosc 22118400L        //定义主时钟
  12. //#define MAIN_Fosc 20000000L        //定义主时钟
  13. //#define MAIN_Fosc 18432000L        //定义主时钟
  14. #define MAIN_Fosc 12000000L        //定义主时钟
  15. //#define MAIN_Fosc 11059200L        //定义主时钟
  16. //#define MAIN_Fosc 6000000L        //定义主时钟
  17. //#define MAIN_Fosc 5529600L        //定义主时钟
  18. void delay_ms(unsigned int ms)                //注:ms_max=65536
  19. {
  20.     unsigned int i;
  21.     do
  22.     {
  23.             i=MAIN_Fosc/10000;                //STC8
  24.             while(--i)        ;
  25.             }
  26.     while(--ms);
  27. }
复制代码
总是觉得频率自适应函数用起来比较方便(主频率改了,也不用重新用STC-ISp生成代码),只是从STC-ISP中生成的软件延时程序,为什么不采用这种模式呢?
是不是从STC-ISP中生成的软件延时程序,延时准确度比较高还是其他原因?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-7-3 15:15:04 | 显示全部楼层
光主频还不够,,你再加上指令集自适应吧
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-04 00:16:27
已绑定手机

19

主题

3191

回帖

4930

积分

论坛元老

积分
4930
发表于 2024-7-3 16:11:40 来自手机 | 显示全部楼层
自适应的准确性好像没有这个高
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-05-04 00:25:16
已绑定手机

34

主题

2096

回帖

2210

积分

荣誉版主

积分
2210
发表于 2024-7-5 13:02:17 | 显示全部楼层
没错,你的最后一句话就是原因,从STC-ISP中生成的软件延时程序,已经精确到了单个指令周期,而自适应的延时程序,误差几十个us都是可能的。不同主频下,单i=MAIN_Fosc/10000这一条指令产生的误差就已经很大了。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 2024-7-5 13:35:24 | 显示全部楼层
有空测试一下,看看误差究竟有多大
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:373
  • 最近打卡:2025-05-03 20:58:18

12

主题

125

回帖

1689

积分

金牌会员

积分
1689
发表于 2024-7-5 16:39:26 | 显示全部楼层
有不同指令周期的,官方的比较精准,自动算的差点,一般也没问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 2024-7-5 18:32:54 | 显示全部楼层
lzz*** 发表于 2024-7-5 16:39
有不同指令周期的,官方的比较精准,自动算的差点,一般也没问题

算指令时间,因为是汇编的,所以看不懂,只能借助工具方便。

点评

可以用Keil debug,延时前后放短点,查看运行周期和时间  详情 回复 发表于 2024-7-5 18:42
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-05-04 00:25:16
已绑定手机

34

主题

2096

回帖

2210

积分

荣誉版主

积分
2210
发表于 2024-7-5 18:42:07 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-7-5 18:44 编辑
xxkj*** 发表于 2024-7-5 18:32
算指令时间,因为是汇编的,所以看不懂,只能借助工具方便。

可以用Keil debug,延时前后放断点,查看运行周期和时间
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 2024-7-8 11:00:50 | 显示全部楼层
测试了,延时有稍微的区别,都是微秒级的差异。对于要求不严格的延时完全可以使用。
例如同样47毫秒,自适应延时是47.295,而ISP工具生成的延时程序是49.314。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-4 10:06 , Processed in 0.144269 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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