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
软件延时时间受编译器优化等级影响,需要使用默认优化等级
设置默认优化等级时,总会自动回到7级 本帖最后由 泰勒soc 于 2023-8-3 08:11 编辑
难受,还是没解决 泰勒soc 发表于 2023-8-3 08:09
难受,还是没解决
把你的测试项目打包发出来我试试看 乘风飞扬 发表于 2023-8-3 13:17
把你的测试项目打包发出来我试试看
使用的是视频教程上的例程,改了的
本帖最后由 乘风飞扬 于 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--;
}结果是一样的。
这个例程里面有一个FOSC的延时函数,这个延时函数里面fosc/6000是怎么计算出来的,fosc是24M
页:
[1]