Hallo Leute,
Wie in vielen Foren und auch hier wird nach Lösungen gesucht um mit dem
STM32 nur mit frei verfügbaren Tools zu arbeiten. Dieser Thread hier
soll als Basis dienen um einen Artikel aufzubauen der einen Lösungsweg
beschreibt.
Vorweg: Debuggen funktioniert hier bei mir größtenteils.
Hier mal ein paar Schritte für euch zum testen und als Ausgangsbasis:
Man benötigt:
-> Eclipse
-> Eclipse CDT
-> Eclipse Zylin
-> Codesourcery Toolchain
-> openOCD 0.1.0
-> angehängte RAR-Datei
In der RAR Datei, findet ihr ein Grundsetup für das STM32-H103 von
Olimex + Olimex USB-Tiny Debugger.
Die KOMPLETTEN Makefiles und Einstellung sind alle aufbauend auf das
Grundsetup von lanchon aus dem ST Forum(
http://www.st.com/mcu/forums-cat-6445-23.html&start=0 ). VIELEN DANK!
An dem Packet habe ich nur das jtag Script angepasst um mit 0.1.0
Version von oOCD zusammen zu arbeiten. Und seine kompletten Änderungen
an der FW-Lib wieder rückgängig gemacht, um das Ganze aktualisierbar zu
machen und um mögliche Fehlerquellen zu bereinigen.
Leider steige ich bei den Linkerscripts nicht durch was der Herr da
gemacht hat, aber für sowas ist der Thread ja da :).
So alles installiert? Dann gehts los.
1) Eclipse starten, neues Projekt -> C-Projekt, kompletten Ordner vom
RAR-File importieren -> Project Properties -> C/C++ Build ->
Buildcommand "cs-make" und als Builddirectory das Projektverzeichnis ->
das wars :) Mit einem klick auf Build sollte eigentlich alles
durchlaufen und mit Erfolg gekrönt sein.
2) Downloaden geht wie folgt:
-> External Tool Configuration -> cs-make suchen (C:\Program
Files\CodeSourcery\Sourcery G++ Lite\bin\cs-make.exe) als Argument
"flash" (ohne ") angeben. Als working dir, muss das Projektverzeichniss
angegeben werden (muss bei jedem Projekt umgestellt werden dazu habe ich
noch keine Lösung :( ) Rest nach belieben einstellen, also build before
launch usw. Wie man es halt möchte.
cs-make flash führt das Script jtag/flash-bin.cfg aus
1 | # Open On-Chip Debugger
|
2 | # (c) 2005 by Dominic Rath
|
3 | # (snapshot r247 from SVN tree + giveio, no official release, compiled my mifi)
|
4 | #
|
5 | # --help | -h display this help
|
6 | # --file | -f use configuration file <name>
|
7 | # --debug | -d set debug level <0-3>
|
8 | # --log_output | -l redirect log output to file <name>
|
9 |
|
10 |
|
11 | # daemon configuration
|
12 |
|
13 | # logging
|
14 | #debug 3
|
15 |
|
16 | # default ports
|
17 | telnet_port 4444
|
18 | gdb_port 3333
|
19 |
|
20 | #daemon_startup reset
|
21 |
|
22 | #gdb_flash_program enable
|
23 |
|
24 |
|
25 | # interface configuration
|
26 |
|
27 | interface ft2232
|
28 | #ft2232_device_desc "Olimex OpenOCD JTAG A"
|
29 | ft2232_device_desc "Olimex OpenOCD JTAG TINY A"
|
30 | ft2232_layout olimex-jtag
|
31 | jtag_speed 10
|
32 |
|
33 | jtag_nsrst_delay 100
|
34 | jtag_ntrst_delay 100
|
35 |
|
36 |
|
37 | # scan chain configuration
|
38 |
|
39 | # jtag_device L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
|
40 | #jtag_device 4 0x1 0xf 0xe
|
41 | #jtag_device 5 0x1 0x1 0x1e
|
42 |
|
43 |
|
44 | # target configuration
|
45 |
|
46 | # script for stm32
|
47 |
|
48 |
|
49 | #use combined on interfaces or targets that can't set TRST/SRST separately
|
50 | reset_config trst_and_srst
|
51 | jtag newtap stm32 cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x3ba00477
|
52 | jtag newtap stm32 bs -irlen 5 -ircapture 0x1 -irmask 0x1 -expected-id 0x16410041
|
53 | target create stm32.cpu cortex_m3 -endian little -chain-position stm32.cpu
|
54 | stm32.cpu configure -work-area-virt 0 -work-area-phys 0x20000000 -work-area-size 16384 -work-area-backup 0
|
55 | flash bank stm32x 0x08000000 0x20000 0 0 0
|
56 |
|
57 | script flash-elf.script
|
Das muss je nach eurem Debugger angepasst werden.
1 | # interface configuration
|
2 | interface ft2232
|
3 | #ft2232_device_desc "Olimex OpenOCD JTAG A"
|
4 | ft2232_device_desc "Olimex OpenOCD JTAG TINY A"
|
5 | ft2232_layout olimex-jtag
|
6 | jtag_speed 10
|
Sollte soweit klappen. Einfach mal testen.
Als Ergebnis liegt sollte in der Console (nach haufenweiße
Zwischenmeldungen)
1 | Info : device id = 0x20036410
|
2 | Info : flash size = 128kbytes
|
3 | stm32x mass erase complete
|
4 | Info : Padding image section 0 with 0 bytes
|
5 | wrote 2760 byte from file flash.elf in 0.588000s (4.583865 kb/s)
|
6 |
|
7 | target state: halted
|
8 | target halted due to breakpoint, current mode: Thread
|
9 | xPSR: 0x81000000 pc: 0x080001ee
|
Das Programm ist nun drüben :)
Debuggen:
Debugconfiguration -> unter Zylin embedded Debug (nativ) eine neue
Configuration anlegen. C/C++ Application -> main.elf
-> Im Debugreiter als Debugger arm-none-eabi-gdb.exe aus dem
Codesourcery Verzeichnis nehmen. Das GDB Commandfile entfernen
-> Im Commandsreiter unter "init"
1 | target extended-remote localhost:3333
|
2 | monitor debug_level 2
|
3 | monitor halt
|
4 | load
|
5 | monitor cortex_m3 maskisr off
|
6 | thbreak main
|
7 | monitor debug_level 0
|
eingeben
Jetzt unter Windows eine Console öffnen und oOCD starten. (So schauts
bei mir aus: C:\Program Files\OpenOCD\0.1.0\interface>openocd -f
olimex-jtag-tiny-a.cfg -f ..\target\stm32.cfg)
Und nun solltet ihr mittels der neuen Debugconfiguration Debuggen
können.
Wichtige Hinweiße:
Im Makefile ist gaaaanz oben
DEBUG_COMP = 1 # or include DEBUG=1 in the command line
gesetzt werden, Code wird damit zwar schlechter, aber debugbar
Im lanchon-stm32.ld muss je nach CPU Typ Flashgröße und Ramgröße
angegeben werden.
So, mehr weiß ich dazu noch nicht. Ich hab hier das Eclipse weder sauber
noch praktisch eingerichtet. Aber soweit funktioniert es.
Was mich stört:
oOCD muss vor jedem Debuggen gestartet, und vorm flashen wieder beendet
werden.
Linkerscripte unddurchschaubar für ich
Und teilweise noch zu Projektspezifisch :( hätte die Einstellungen
lieber globaler
Testet es bitte mal und postet hier eure Ergebnisse.
Falls 2-3 Leute ein OK geben, werde ich das entsprechend formatiert ins
Wiki einfügen.