STM32F0Discovery: BSRR tut nicht das, was es soll.

Gast #3463762
Lesenswert?

Hallo!

Ich versuche gerade die beiden LEDs auf dem Board über das BSR register 
zum leuchten zu bringen. Dazu benutze ich den folgenden Code:
1
  *((uint32_t*)(0x48000818)) = (1 << 8);
2
  *((uint32_t*)(0x48000818)) = (1 << 9);
Doch leider leuchtet nur die LED PC9. Drehe ich die beiden Zeilen um 
leuchtet hingegen nur die LED PC8. Und jede Zeile allein tut ebenfalls 
was sie soll.

Wenn ich nun in das Reference Manual in Kapitel 8.4.7 auf Seite 135 
schaue, so steht dort folgendes:

> 0: No action on the corresponding ODRx bit

Wenn ich das richtig verstehe, ändert sich bei dem jeweiligen ODR Bit 
nichts, wenn in das dazugehörige BSRR Bit eine Null geschrieben wird.
Doch genau dies schein nicht zu funktionieren, denn in der zweten Zeile 
löscht die Null in Bit 8 das entsprechende Bit in ODR offenbar wieder.
Oder habe ich da was falsch verstanden?

Vielen Dank im Voraus!
Hexheini
Gast #3463807
Lesenswert?

Des Rätsels Lösung ist: Der Compiler hat die erste Zeile wegoptimiert.
Mit einem volatile geht es:
1
  *((volatile uint32_t*)(0x48000818)) = (1 << 8);
2
  *((volatile uint32_t*)(0x48000818)) = (1 << 9);

Die Standard Library von ST werde ich übrigens weiterhin nicht nutzen, 
da sie potthässlich ist:
1
    RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
2
    GPIOC->MODER |= (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0) ;
3
    GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9);
4
    GPIOC->BSRR = (1 << 8) | (1 << 9);
Ich bastel mir gerade etwas zusammen, das viel einfacher und vor allen 
lesbarer ist:
1
  rcc.ahbenr.iopcen = 1;
2
  gpioc.moder.pin8 = gpo;
3
  gpioc.moder.pin9 = gpo;
4
  gpioc.bsrrbs.pin8 = 1;
5
  gpioc.bsrrbs.pin9 = 1;
:)
(Firma: matzetronics) #3463890
Lesenswert?

Blub schrieb:
> Hexheini schrieb:
>> (1 << 8)
>
> Warum schreibt man nicht BIT8 und das #define BIT8  0x00000010?

Weil du damit BIT4 definierst und nicht Bit8. Richtig wäre
eher:
1
#define BIT8 0x00000100
Das ist aber gar nicht nötig, so unelegant ist das alles gar nicht:
1
#define GREEN_LED_PIN                   GPIO_Pin_9
2
#define BLUE_LED_PIN                   GPIO_Pin_8
3
#define LED_GPIO_PORT                   GPIOC
4
/* Turn On the blue LED */
5
LED_GPIO_PORT->BSRR =  BLUE_LED_PIN;
6
/* turn off the blue LED */
7
LED_GPIO_PORT->BRR =  BLUE_LED_PIN;

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