Forum: Mikrocontroller und Digitale Elektronik STM32 läuft nicht mit globalen Variablen?


von Tom (Gast)


Lesenswert?

Hi everyone,

Das ist wieder ein Beitrag für STM32. Obwohl es schon so viele Beiträge 
im Forum gibt, helfen sie mir leider nicht bei meinem merkwürdigen 
Problem.

Meine Entwicklungsumgebung: Linux, Sourcery G++ Lite 2010.09-51 for ARM 
EABI, Eclipse, STM32F10x_StdPeriph_Lib_V3.4.0 aus STM und der uC 
STM32F103.
Der Kode ist sehr einfach, und zwar:

int m = 2;  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int main()
{
  int i;

  // GPIO Configuration
  USART1_GPIO_Config();

  // USART Configuration
  USART1_Config();
  while (1)
    {
      USART1_Send ( (uint16_t)'a');
      for (i=0; i<1000000; i++);
      //m = 3;   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    }
  return 0;
}
Am Anfang lief das erstellte Projekt komplett reibungslos. D.h. Die 
Kompilierung und das Flash funktionierten. PC hat tatsächlich die 
Nachrichten („aaa…“)empfangen.

Aber dann tritt das komische Problem auf, wenn die Zeile
m = 3;   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
im Kode eingesetzt ist, um die globale Variable zu ändern. Die 
Kompilierung und das Flash laufen nach wie vor. Trotzdem empfängt der PC 
nur das einzige „a“ und wird keine Nachricht mehr auf dem Monitor 
gezeigt. Anscheinend dürfte man keine globale Variable ändern. Warum 
funktioniert der uC bei mir nicht mit der globalen Variable? Hat jemand 
schon auf solchem Problem gestoßen?

Vielen Dank im Voraus.
Tom

von Torsten S. (tse)


Lesenswert?

schreib das mal so:

...

for (i=0; i<1000000; i++) // [<- ohne semikolon]
    m = 3;

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Schreib
volatile int i;

sonst wird die Verzögerungsschleife wegoptimiert. Ob USART1_send damit 
klarkommt, wenn es direkt nacheinander aufgerufen wird, sehe ich nicht, 
weil der Code dazu fehlt.

Grüße,

Peter

von Andi (Gast)


Lesenswert?

hi

hatte auch ein Problem mit dem usart... mein Problem war das ich nicht 
gewartet hab bis dieser mit senden fertig ist... es müsste eine Funktion 
geben die prüft ob der usart fertig ist... diese hab ich in ner while 
schleife überprüft bis der usart fertig ist....

von Tom (Gast)


Lesenswert?

Sorry, guys :(

Bei mir funktioniert das Flash nicht mehr. Wenn das Flash wieder läuft, 
melde ich mich zurück.

Tom

von Tom (Gast)


Lesenswert?

Hallo, I am back :)

To Torsten,
Dein Vorschlag habe ich probiert. Nach wie vor wird nur ein 'a' gezeigt.



To Peter,
Eigentlich benutze ich die funktion aus StdPeriph_Lib, und zwar
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data).
Ich habe "volatile" hinzugefügt. Aber dasselbe Problem tritt auf :(

Hat jemand noch eine Idee?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.