In dem Code unten, kann ich sehen, dass der Timer normal funktioniert, wie die LED immer blinkt. Aber der Wert der count
Variable ändert sich nie innerhalb der zweiten while
.Variable Wert nicht durch Interrupt auf STM32F4 Entdeckung aktualisiert
Ich weiß nicht, was könnte schief gehen?
// count variable used only in main and TIM2_IRQHandler.
uint8_t count=0;
int main(void)
{
count=0;
SystemInit();
GPIOInit();
NVIC_Configuration();
TIM_Configuration();
init_USART3(115200);
// All initialization is ok.
USART_puts(USART3, "\r\nConnection ok.\r\n");// Working normally
while (1)
{
if(asterixok==1)// No problem. This code if ok ->>process continue next step.
{
GPIO_SetBits(GPIOD , GPIO_Pin_12); // Led on (ok)
count=0;// count going to zero, timer working, must be change in there
while(1)
{
//Led blinking continue
//Timer query working normal led (13) blink.
//There is a problem
if(count>5) // Timer working, count never change in timer interrupt query (WHY)
{
GPIO_SetBits(GPIOD , GPIO_Pin_14); // LED OFFFFFFFFFFFFFFFF
USART_puts(USART3, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n");
goto nextstate;
}
}
nextstate:
GPIO_SetBits(GPIOD , GPIO_Pin_15); // Led never going on because code step in while loop.
}
}
}
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE))
{
unsigned char t = USART3->DR;
if(t=='*')
{
asterixok=1;
}
}
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
count++;
if(count>100)
count=0;
if(display)
{
GPIO_ResetBits(GPIOD , GPIO_Pin_13);
}
else
{
GPIO_SetBits(GPIOD , GPIO_Pin_13);
}
display = ~display;
}
}
Ich habe mit einem anderen Discovery-Board versucht, aber das Problem geht weiter. Bitte helfen. Ich werde verrückt!
volatile uint8_t count;
Während main
die Compiler konnten kompilieren beweisen, dass count
nicht in der Schleife modifiziert wurde, und so zwischengespeichert es wahrscheinlich seinen Wert in einem Register:
Tahnk Sie für Ihre Lösungen. Ich habe das Schlüsselwort volatile variable ausprobiert. Manchmal wurde das Problem erneut wiederholt. Wie ich es verstehe, ist dies vermutlich der Fall, wenn sowohl der Interrupt-Abfrage-Handler als auch der abhängige Code auf dieselbe GLOBAL-Variable namens "benannte Anzahl" zugreifen. Vielleicht deaktivieren/aktivieren Sie die Interrupt-Aktion, um dies zu beheben. Ich werde es zur richtigen Zeit versuchen. – Fico