Forum: Mikrocontroller und Digitale Elektronik [STM32/Cortex-M4] JTag nur beim Systemflash möglich. Fehler beim Mainflash


von cortexuser (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

zuerst ein paar Infos zur verwendeten Hardware.
Debugger: Segger JLink
µC: STM32F407IG (Cortex-M4)
Die JTagpins sind ohne Pullups. Sie sind direkt vom µC mit dem JTag 
verbunden.

Ich habe das Board gelötet und konnte dann problemlos von Linux auf die 
Cortex per JTag zugreifen. Ich konnte die Register etc. auslesen und 
habe ein kleines LED-Beispiel aufgespielt (auf dem STM32F4 Eval Board 
ging das Programm problemlos, ich habe nur die Pins angepasst). Nachdem 
ich einmal "go" eingegeben habe, konnte das JTag die CPU nicht mehr in 
den Haltmodus versetzen.

Ich hatte BOOT0 mit 10k gegen Masse. Boot1 war erst nicht angeschlossen 
(laut Datenblatt ist es für den Main Memory egal). Ich hab allerdings 
testweise auch ein definiertes Signal angelegt.

Nach ewigen hin und her testen konnte ich zweimal richtig per JTag 
zugreifen. Dann konnte ich ein Programm aufspielen und im "Step" Modus 
hätte er die richtigen Befehle ausgeführt. Ich habe es wieder zurück 
gelesen und es stimmte. Mit "go" und "reset" kam wieder die Meldung, 
dass er die CPU nicht in den Haltemodus versetzen kann.

Wenn ich mit der Hand den Resetknopf drücke, erkennt er die CPU, er kann 
sie allerdings ebenfalls nicht in den Haltemodus versetzen. 
Programmieren geht ebenfalls nicht, da er versucht vorher die CPU in den 
Haltemodus zu versetzen. Ich habe den Flash oder Register ausgelesen und 
er hat nur Nullen angezeigt.

Beim JLink (9-Poliger Stecker) kann ich den Pin 9 auf Reset brücken, den 
habe ich auch an Reset vom µC gelegt. Dies hatte keinen Erfolg.

Auch die Jlink-Stm32-unlock.exe von Segger brachte einen Fehler.

Testweise habe ich den BOOT0 mit 10k gegen VCC gelötet. Ich konnte auf 
den Bootloader mit UART zugreifen. JTag funktioniert hier auch 
problemlos. Ich habe ein anderes Testprogramm  mit dem JLink (ebenfalls 
für das STM32F4 Eval Board) in den Mainflash laden können und per 
Bootloader zurücklesen.

An dem Fehlerbild im Bootmodus "Mainflash" hat sich nichts geändert.

Ich habe auch eine leichte Erwärmung  im "Mainflashmodus" gemerkt. 
Könnte an den eigentlich eingestellten 168MHz liegen.

Wenn ich per Bootloader boote, hat die LED nicht geblinkt und JTag ging 
nicht mehr. (gleiche Fehlermeldung als angehängt)

Ich habe es von 3 verschiedenen PCs (Windows und Linux) mit zwei 
verschiedenen Versionen getestet und immer den gleichen Fehler erhalten. 
Ich habe auch an dem Taster einen Pullup gebaut, brachte nichts. Auch 
ein Pullup an JTag-TDI brachte nichts.

Das JTag habe ich eben nochmals mit einer Freescale Kinetis Cortex-M4 
getestet, da ging es problemlos und eben im Systemflash Bootmodus auch.

Da die Software fast unverändert aus dem I-Net übernommen wurde, kann 
ich sie nicht komplett hochladen.

Müsste ich irgend etwas ändern, damit die Software vom Eval Board auch 
auf der größeren Cortex läuft. (außer der Flashgröße und evtl der 
Ramgröße/Stackpointer) Für eine einfache LED-Blinkanwendung sollte der 
Startupcode ja 1:1 funktionieren.

Sleepmodus, Watchdog habe ich nicht bewusst aktiviert. CMSIS sollte es 
ja auch nicht einfach so aktivieren.

Ich hoffe ihr könnt mir weiter helfen.

Vielen Dank!

Simon

von cortexuser (Gast)


Angehängte Dateien:

Lesenswert?

Die Fehler nochmals als .txt Datei, sollte es sonst Probleme geben.

von cell85 (Gast)


Lesenswert?

du hast warscheinlich den JTAG Debugger Reset Pin nicht mit dem 
STM32-Reset Pin verbunden.
Du kannst jetzt in den Hardware Einstellungen des Debuggers die RESET 
Art ändern ... Per ResetPin ... auf SYSReset oder so.
Dann geht auch das Flash-under-reset.
Oder du verbindest den Reset Pin vom JTAG/SWD Debugger mit dem reset pin 
des stm32.

von cell85 (Gast)


Lesenswert?

Wie gesagt, musst den JLINK so einstellen das er den Reset nicht mit via 
HardwareReset durchführt. Daher auch dieser Fehler "MCU couldnt halted 
blabla".
Das gleiche ist das Problem beim Keil & Eclipse.  Keil merkt das bzw. 
probiert verschiedene reset varianten durch bis es klappt und bei 
Eclipse muss es entsprechend eingestellt werden. Sonst geht das mit dem 
Flash / Connect under reset auch nicht.

von cortexuser (Gast)


Lesenswert?

Danke für die Antwort. Ich habe den Pin testweise verbunden gehabt. Das 
Fehlerbild war dann auch anders. Den genauen Fehler weiß ich nicht mehr, 
jedenfalls war es ca. so:

2 Zeilen Fehlermeldung
1 Zeile eigentliche Ausgabe, allerdings alle Werte waren 0

Die verschiedenen Reset-Methoden habe ich auch schon ausprobiert, kann 
aber sein, dass ich einen Parameter übersehen habe. Ich werde es Morgen 
nochmals testen.

Da es ja vor dem Flashen funktioniert hat und im anderen Bootmodus 
funktioniert: Könnte es - außer Sleepmodus direkt nach dem Start (hab 
dazu was im segger Forum gelesen) oder ein aktiver Watchdog - noch 
weitere Softwareprobleme geben? Könnte ich mich über die Optionbytes 
aussperren? Per Bootloader habe ich read und writeprotection 
deaktiviert. Allerdings keine Veränderung.

Wenn die Software auf einer kleinen STM32F407VG (STM32F4 Eval Board) 
problemlos läuft und ich nur den Pin ändere, reicht das aus, oder muss 
ich den Startupcode für CMSIS ändern und sogar noch das Linkerskript 
anpassen. (Letzteres werde ich auf 1MB Flash machen müssen, sollte aber 
mit kleineren Werten ebenfalls funktionieren.)

von cortexuser (Gast)


Lesenswert?

Also wenn ich den Bootloadermodus wähle und dann den Flash ab 0x800 0000 
mit lauter 0xFF fülle komme ich wie nach dem löten auf die Cortex.

Ich kann Step, Go, Halt machen was alles funktioniert, auch Softreset.

Ich habe mittlerweile 3-4 verschiedene Programme mit CMSIS  (alle für 
das Eval board) durch und sobald ich mein Programm hochlade und boote, 
komme ich nicht mehr mit dem JTag drauf. Der Fehler ist wie oben.

Ich nutze momentan die Beispiele von:
https://github.com/cccc/U23_2013_examples

Dort das 01_leds. Außer den Ports (PA10 soll toggeln) habe ich nichts 
geändert.

Laut der .bin File stimmt der Stackpointer.

Auch habe ich die main.c auf das geändert:
1
#include <System.h>
2
int main()
3
{
4
int a=0;
5
  while (1)
6
  {
7
  a++;
8
}
9
}

Das ändert auch nichts. Daher müsste der Fehler im Startupcode oder an 
der Hardware liegen. Außer den zwei Bootpins und dem Reset (Stimmt die 
beschaltung? So habe ich sie in einem Beispiel von ST gesehen) müsste 
ich ja nichts beschalten? Im Bootloadermodus funktioniert es so wie es 
soll.

Ich habe die Option Bytes ausgelesen, da ist keine Beschränkung. 
Watchdog ist auf Software und BOD ist auf off.

Hat jmd ein Minimalbeispiel am Laufen für den STM32F407IG (beim *VGT6 
laufen meine auch problemlos)?

von cortexuser (Gast)


Lesenswert?

Das Problem ist anscheinend gelöst und schon fast peinlich. Den Grund 
schreibe ich, falls einer das gleiche Problem hat.

Der Quarz ist 25 MHz statt 8 MHz wie auf dem Demoboard. Ich hab 
vergessen den PLL richtig einzustellen. Das müsste dann ca. 0,5GHz 
machen :P Das erklärt auch die leichte Erwärmung. Das Beispiel von oben 
läuft jetzt per JTag.

Ich danke allen, die sich Zeit genommen haben.

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.