找回密码
 立即注册
查看: 894|回复: 7

delay_ms()函数 软件延时 时间不对 求解答

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 2023-8-2 11:23:39 | 显示全部楼层 |阅读模式
本帖最后由 泰勒soc 于 2023-12-16 09:07 编辑

先上代码
#define MAIN_Fosc 24000000UL

void delay_ms(u16 ms)
{//Fosc24M
     u16 i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);//
     }while(--ms);
}

这个函数是毫秒定时函数,我的计算方法是:周期 * 次数
周期 = 1 / 24M
次数 = 24M / 1000
这样计算的时间理论上是1ms
但是,用示波器测量不对,次数改为24M / 10000,示波器测量的时间就是1ms。
求解答,是我的计算方法不对,还是其他问题?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-8-2 18:28:28 | 显示全部楼层
软件延时时间受编译器优化等级影响,需要使用默认优化等级
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 2023-8-2 22:48:47 | 显示全部楼层
乘风*** 发表于 2023-8-2 18:28
软件延时时间受编译器优化等级影响,需要使用默认优化等级

设置默认优化等级时,总会自动回到7级
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 2023-8-3 08:09:54 | 显示全部楼层
本帖最后由 泰勒soc 于 2023-8-3 08:11 编辑

难受,还是没解决
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-8-3 13:17:16 | 显示全部楼层
泰勒*** 发表于 2023-8-3 08:09
难受,还是没解决

把你的测试项目打包发出来我试试看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 2023-8-4 08:34:11 | 显示全部楼层
乘风*** 发表于 2023-8-3 13:17
把你的测试项目打包发出来我试试看

使用的是视频教程上的例程,改了的

7.定时器0.zip

92.71 KB, 下载次数: 70

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-8-4 09:19:30 | 显示全部楼层
本帖最后由 乘风飞扬 于 2023-8-4 09:21 编辑
泰勒*** 发表于 2023-8-4 08:34
使用的是视频教程上的例程,改了的
我用你的例程烧到板子上测试,用示波器测量延时时间非常准确。如果在你的板子上测量还是不对的话,检查一下P1.6脚位上是不是并了电容。
周期2ms,高电平1ms,低电平1ms:
1.png
使用这个延时函数的话,烧录时IRC主频设置12MHz:
  1. void Delay1ms()                //@12.000MHz
  2. {
  3.         unsigned long edata i;
  4.         _nop_();
  5.         _nop_();
  6.         _nop_();
  7.         i = 2998UL;
  8.         while (i) i--;
  9. }
复制代码
使用这个延时函数的话,烧录时IRC主频设置24MHz:
  1. void Delay1ms()                //@24.000MHz
  2. {
  3.         unsigned long edata i;
  4.         _nop_();
  5.         _nop_();
  6.         _nop_();
  7.         i = 5998UL;
  8.         while(i) i--;
  9. }
复制代码
结果是一样的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 2023-8-4 11:29:37 | 显示全部楼层
这个例程里面有一个FOSC的延时函数,这个延时函数里面fosc/6000是怎么计算出来的,fosc是24M
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:09 , Processed in 0.163383 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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