发现我的stm8s单片机,不能用for做软件延时
时间:10-02
整理:3721RD
点击:
当时做测试的时候就发现for(i=0;i++;i<1024)这样延时完全没效果。又用while(!i)(i--)这样试了下,还是不行。
只能用定时器做延时。
然后用for(;;);做死循环也是不行。while(1);可以。
就是这个情况,不知道有碰到过这种的吗?
只能用定时器做延时。
然后用for(;;);做死循环也是不行。while(1);可以。
就是这个情况,不知道有碰到过这种的吗?
我不知道是你打错了还是啥,你之前写的两个延时从语法上本来就不具备延时。
for(i=0;i++;i<1024)->for(i=0;i<1024;i++);
while(!i)(i--) ->while(i)(i--);
另外,延时太小以致没法判断是否有延时也是一个情况。
对于你说的for(;;);死循环无法实现,估计是你的编译器优化问题。一般死循环用while(1);个人不喜欢用for(;;)实现。
你好!当时脑子晕了,现在还晕着。以上,还是不行。然后我又写了个这样的while(1){i++;
if(i>=40000) {PC_ODR_ODR6=0;}
}
那个数字,20000以下的数值,上电瞬间就亮灯,但是改成40000就永远不亮。觉得好奇怪。
另外,我也习惯用while(1),因为各种教程上都是用这个。但是好像记得什么地方说for的比while的逻辑上更准确。
怀疑是芯片坏了,虽然定时器管用,于是换了个新的芯片,还是一样的情况。但是这种软件延时的方法之前用别的单片机就没有问题的。
很给力的解释啊
我在AVR单片机曾经遇到过这样的情况 用while(x) x--;没有延时效果 后来发现用while(x){asm("nop"),x--}就有效果了,可能有的编译器会自动加上nop命令,而有的则不会,希望对你有帮助
嗯!是IAR编译器的问题,for循环没有干活儿,于是就给优化掉了。谢谢您!