泰勒soc 发表于 2023-8-2 11:23:39

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

本帖最后由 泰勒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。
求解答,是我的计算方法不对,还是其他问题?

乘风飞扬 发表于 2023-8-2 18:28:28

软件延时时间受编译器优化等级影响,需要使用默认优化等级

泰勒soc 发表于 2023-8-2 22:48:47

乘风飞扬 发表于 2023-8-2 18:28
软件延时时间受编译器优化等级影响,需要使用默认优化等级

设置默认优化等级时,总会自动回到7级

泰勒soc 发表于 2023-8-3 08:09:54

本帖最后由 泰勒soc 于 2023-8-3 08:11 编辑

难受,还是没解决

乘风飞扬 发表于 2023-8-3 13:17:16

泰勒soc 发表于 2023-8-3 08:09
难受,还是没解决

把你的测试项目打包发出来我试试看

泰勒soc 发表于 2023-8-4 08:34:11

乘风飞扬 发表于 2023-8-3 13:17
把你的测试项目打包发出来我试试看

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

乘风飞扬 发表于 2023-8-4 09:19:30

本帖最后由 乘风飞扬 于 2023-8-4 09:21 编辑

泰勒soc 发表于 2023-8-4 08:34
使用的是视频教程上的例程,改了的我用你的例程烧到板子上测试,用示波器测量延时时间非常准确。如果在你的板子上测量还是不对的话,检查一下P1.6脚位上是不是并了电容。
周期2ms,高电平1ms,低电平1ms:

使用这个延时函数的话,烧录时IRC主频设置12MHz:
void Delay1ms()                //@12.000MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 2998UL;
      while (i) i--;
}
使用这个延时函数的话,烧录时IRC主频设置24MHz:
void Delay1ms()                //@24.000MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 5998UL;
      while(i) i--;
}结果是一样的。

泰勒soc 发表于 2023-8-4 11:29:37

这个例程里面有一个FOSC的延时函数,这个延时函数里面fosc/6000是怎么计算出来的,fosc是24M
页: [1]
查看完整版本: delay_ms()函数 软件延时 时间不对 求解答