Compiler meckert, dass ich ein ";" vergessen habe.

Gast #4524668
Lesenswert?

hallo,

ich programmiere mit Keil µVision ein STM32 Discovery Board. Ich möchte 
binär! die LED 12 und 13 einschalten. Jetzt kommt aber die 
Fehlermeldung, dass ich ein ";" vergessen habe. Aber das habe ich hier 
doch drin?

1
#include "stm32f4xx.h"
2

3
int main ()
4
{
5
  
6
  
7
  //Taktversorgung für Port D anschalten
8
  RCC->AHB1ENR |= (1<<3);
9
  
10
  //Konfiguration für Port D
11
  GPIOD->MODER |= (1<<24);
12
  GPIOD->MODER |= (1<<26);
13
  GPIOD->MODER |= (1<<28);
14
  GPIOD->MODER |= (1<<30);
15
  
16
  //LED12 und LED13 einschalten
17
  GPIOD->BSRRL |= 0b11;
18
  
19
    
20
  
21
  do
22
  {
23
    
24
  }
25
  while (1);
26
}

Fehlermeldung:
***********************************************
main.c(17): error:  #65: expected a ";"
        GPIOD->BSRRL |= 0b11;
main.c: 0 warnings, 1 error
***********************************************
Gast #4524695
Lesenswert?

Steven M. schrieb:
> was passiert denn, wenn du es einklammerst?

Dann kommt folgende Fehlermeldung:
main.c(18): error:  #18: expected a ")"
        GPIOD->BSRRL |= (0b11);
main.c: 0 warnings, 1 error

hopix schrieb:
> Torben hat schon recht
> in eine do - while Schleife gehört auch eine (von mir aus auch leere)
> Anweisung

Daran liegt es aber nicht. Denn in hex funktioniert das Programm.
Gast #4524714
Lesenswert?

Leere Schleife? C Conform ist das aber nicht.

wie sieht es denn in HEX aus?

muß binärvergleich nicht mindesten 8 bit haben?

versuchs mal mit 0b0000011

Ich kenne Keil Compiler nicht aber binär vertragen nicht alle.
Hopix
#4524717
Lesenswert?

Auf einem 32-Bitter sollte man sich die 0b-Schreibweise, die IIRC nur 
auf AVR-GCC funktionert schnell abgewöhnen. Die meisten Register sind 
32-Bittig, da kommt man zu schnell durcheinander.

Dein geposteter Code enthält außerdem zuviele Magische Zahlen. Für die 
meisten Flags gibt es passende #defines in den Headern, dann wird der 
Code viel besser lesbar.
#4524927
Lesenswert?

Hopix schrieb:
> OK.
> hab ich heute wieder was gelernt :-)

So schön wie das ist: es wäre noch schöner gewesen wenn du das erst 
gelernt hättest und erst danach eine Anwort (nämlich: die richtige) 
hier geschrieben hättest. Für falsche Antworten kann sich der TE nix 
kaufen, und du kriegst im besten Fall eine schlechte Bewertung und 
landest im (für dich) schlimmsten Fall in einem Killfile.
Gast #4525011
Lesenswert?

Danke an alle. Habe nun aber nochmal eine Frage:

Ich möchte in das Register den Wert 110000 schreiben, also das char "0".
Das hier funktioniert aber nicht:

GPIOD->BSRRL = "0";

Für mein Problem muss ich das mit einem char machen, also wäre es nett, 
wenn ihr mir weiterhelfen könntet.
#4525025
Lesenswert?

nemesis... schrieb:
>> C Conform ist das aber nicht.
>
> Der TO benutzt ja auch C++.

Als ob das einen Unterschied machen würde.
Und als ob Keil C++ verstünde.

> Ein Semikolon hinter einem do-, for- oder while-Schleifenbegin
> wäre mir neu und meinem Referenzhandbuch auch.

Wenn du damit
  do ; while(1);
meinst: Zwischen do und while steht genau 1 Statement. Völlig leere 
Statements gibts aber nicht, weniger als das Semikolon geht deshalb 
nicht. Ein Compound Statement ist nicht zwingend, weshalb auch das geht, 
ist nur wenig gebräuchlich:
  do foo(); while(1);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren