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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.