Forum: Mikrocontroller und Digitale Elektronik STM32 Nucleo defekt?


von Simon R. (nixname1)


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
1
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

von Christopher J. (christopher_j23)


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
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.