我正在使用STM32 F030 R8 T6和HAL库。我使用STM32 CubeMX进行所有初始化代码。
当我在无限循环中使用“if”语句时,它不起作用。Eg.
while (1) {
if ((Seconds - oldSec) >= 10) {
printf("Entramos 10sec\r\n");
oldSec = Seconds;
}
}
但是如果使用HAL_Delay()函数,它可以工作,例如。
while (1) {
HAL_Delay(1);
if ((Seconds - oldSec) >= 10) {
printf("Entramos 10sec\r\n");
oldSec = Seconds;
}
}
我不知道,有什么问题?
我使用arm-gcc编译器和makefile。
2条答案
按热度按时间yv5phkfx1#
CubeMX默认提供3级优化,如果变量不是volatile而是在上下文之外更改(如中断),则会导致问题。
解决方案是将
Seconds
和oldSeconds
作为volatile
,并确保Seconds
在SysTick_IRQHandler
或HAL_SYSTICK_Callback
函数中增加。解决方案也是将优化设置为0级。但是,正如你所看到的,如果你不遵循
volatile
规则,会发生什么,最好停留在第3级。3htmauhk2#
我有这个问题很多次,然后我意识到,如果有一个if子句在while循环中发生问题。我在Keil上将优化级别改为0,然后问题就消失了。