mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Nucleo defekt?


Autor: Simon R. (nixname1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

nachdem ich hier Anfang der Woche noch fröhlich Fragen gestellt und mit 
meinem STM32F411 experimentiert habe, habe ich nun ein Problem:

Ich hatte gestern Abend überraschend nach einer Änderung das Problem, 
dass der ST Link nicht mehr per JTAG mit dem STM32F411 reden konnte.
Ich musste dann den STM32F411 in den Bootloader starten, den flash (vom 
F411) löschen und konnte erst dann wieder eine neue Version falshen.

Ich habe nun herausgefunden, dass das Problem immer dann auftritt, wenn 
ich in das Register GPIOA_MODER schreibe.
Wenn ich also PA5 (User LED beim Nucleo64) mit
GPIOA->MODER |= GPIO_MODER_MODE5_0; // set PA5 as output
als output definieren will, habe ich das Problem. Dabei ist es egal, 
welches Bit gesetzt wird.
Andere Ports wie z.B. PORTB oder C funktionieren wie sie sollen.

Zusätzlich ist mir ein weiteres Problem aufgefallen: Wenn ich in irgend 
ein Register von TIM2,3 oder 4 (andere Timer habe ich jetzt nicht 
ausprobiert) schreibe, stehen die Werte später nicht im Register. Das 
heißt, wenn ich die Register auslese bekomme ich immer eine 0 und 
Funktionen wie PWM funktionieren nicht.

Hatte jemand von euch schon einmal so ein Problem? Kann es sein, dass 
sich der Controller (oder Teile von ihm) einfach verabschiedet hat?

Bin über jede Antwort dankbar.

Gruß,
Simon

Autor: Christopher Johnson (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon R. schrieb:
> GPIOA->MODER |= GPIO_MODER_MODE5_0; // set PA5 as output

Hast du das wirklich so im Quelltext stehen?

Wenn du nämlich ohne "oder", also so

GPIOA->MODER = GPIO_MODER_MODE5_0

den Wert ins Register schreibst funktioniert zwar die LED als Output 
aber gleichzeitig setzt du auch die beiden Pins für SWDIO und SWCLK auf 
"input", da die nämlich auch an GPIOA hängen. Damit sperrst du dich dann 
quasi aus.

Im Prinzip hat der Nico hier schon richtigerweise davor gewarnt:
Beitrag "Re: STM32F4 Timer interrupt"

Nico W. schrieb:
>> Reset values:
>> • 0x0C00 0000 for port A
>> • 0x0000 0280 for port B
>> • 0x0000 0000 for other ports

Nach einem Reset sind damit PA12 und PA13 für SWD konfiguriert. Dadurch 
kommt man auch z.B. mit OpenOCD immer wieder rein, sofern man nach dem 
Reset sofort anhält und kann dadurch neu flashen. Da kommt es allerdings 
darauf an was du in deiner OpenOCD init stehen hast (sofern du denn 
OpenOCD verwendest).

PS: Ja, ich hatte das Problem auch schon, allerdings ist da nichts 
kaputt, außer dem Code ;)

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.