Hallo
Ich habe versucht das Evaluationboard STM32F4-Discovery (STM32F407VG)
zusammen mit Crossworks (2.2) zum laufen zu bekommen.
Ich möchte euch mitteilen, wie was ich wie hinbekommen habe und wo es
nicht optimal läuft. Als Basis beziehe ich mich auf das Posting
Beitrag "[S]uche - STM32 - Crossworks Beispiel - STM32F105" welches mir sehr
weitergeholfen hat.
Der Anfang gestaltet sich sehr einfach.
Crossworks und die benötigten Packages installieren. Ich habe folgende
Packages installiert:
CMSIS2 Support Package
CMSIS3 Support Package
STMicroelectronics STM32 CPU Support Package
STMicroelectronics STM32F4xx DSP and Standard Peripherals Library
Updates
Die Installation lief problemlos. Nach der Installation der Packages
kann man ein neues Projekt erzeugen. Wenn man nun als Target mit dem
STLink/V2 verbinden will (Interface SWD) und Das Programm im Debug Mode
ausführt klappt alles sofort.
Als nächstes wollte ich eine LED einschalten und dabei die
STDPeriph_Driver und STMF4-Discovery Libraries verwenden. Hier fingen
meine Probleme an. Ich habe zwar bei der Installation von
STMicroelectronics STM32F4xx DSP and Standard Peripherals Library
Updates den Pfad zur Library angegeben, allerdings scheint Crossworks
nichts zu finden.
In dem zitierten Posting wird empfohlen, im Property Windows unter
Preprocessor Options -> System Include Directories manuell den Pfad zum
inc-Verzeichnis der Library zu legen. Leider war dies bei mir nicht
ausreichend. Der Eintrag hat nur dazu geführt, dass man bei einem
#include nicht mehr den vollen Pfad zur Headerdatei eingeben musste.
Die Library von ST besteht bei mir aus zwei Ordern, inc und src. Es sind
keine Objektdateien vorhanden. Bei mir ist der Linker auf die Nase
gefallen, weil er die Referenzen nicht auflösen konnte.
Ich habe das Problem so gelöst, dass ich im Projekt einen neuen Ordner
angelegt und diesen als "Dynamic" markiert habe. Den Order habe ich auf
die Library zeigen lassen (rekursiv). Das selbe habe ich mit der
"Discovery"-Library gemacht.
Crossworks war nun in der Lage, die c-Dateien zu finden. Der Linker
läuft nun fast durch. Bei mir sind noch 2 Probleme verblieben.
1. In der "Discovery" Library sind Funktionen für den Audio-Codec und
Beschleunigungs-Sensor enthalten, die im Hauptprogramm weitere
Funktionen benötigen. Da ich diese nicht hatte, gabs beim Linken wieder
Fehler. Meine Lösunge war bei diesen Dateien "Exclude from build"
auszuwählen.
2. assert_param: Dieses Makro wird in der Datei stm32f4xx_conf.h
definiert. Diese Datei liegt bei mir im Source-Verzeichnis. Ich habe sie
von einem ST-Beispiel kopiert. Damit diese auch unter Crossworks
funktioniert, muss unter Preprocessor Definitions in einer Zeile
USE_STDPERIPH_DRIVER eingetragen werden. Dies sorgt dafür, dass die
HeaderFile, die bei Crossworks dabei ist diese Datei verwendet und damit
das Makro kennt.
Daneben habe ich noch ein paar andere Dateien aus den Beispielen
dazukopiert.
Ich habe das Projekt angehängt. Wenn man es direkt nach C:\ kopiert
stimmen die Pfade.
Ich hoffe ich konnte damit anderen ein wenig helfen und vielleicht habt
ihr noch ein paar Tips für mich, wie man eine schönere Lösung
hinbekommt.
Hallo Tilo,
mhh, wie soll ich es einfach erklären?
Das Beispiel sollte jetzt auch bei Dir laufen.
Es fehlten folgende "User Include Directories":
STM32F4xx_StdPeriph_Driver\inc
STM32F4-Discovery
Wie kommt man nun dahin?
1. Projekt in CrossStudio öffnen
2. Rechtsklick auf Dein Projekt "LED-Blink" > Properties...
3. Nun die "Configuration" oben rechts auf "Common" umstellen
4. evt. die "Teilung" etwas verschieben, die Eingabefelder sind
nicht zu sehen.
5. Unter "Preprocessor Option" unter "User Include Directories"
die fehlenden Einträge hinzufügen.
Gruß,
Michael
Danke für diene Hilfe
Das Beispiel läuft ja, allerdings nur mit den "dynamischen"
Verzeichnissen, mit denen ich den src-Ordner mit ins Projekt einbinde.
Ich habe deine Version gerade ausprobiert. So bald ich
STM32F4xx_StdPeriph_Driver als dynamisches Verzeichnis aus dem Projekt
entferne, klappts auch nicht mehr.
Ich gebe zu, dass mir der Unterschied zwischen "System" und "User"
Include Directories noch nicht so ganz klar ist. Ich hab jedenfalls noch
keinen Unterschied gemerkt und in der Hilfe bisher auch nichts gefunden.
Ich kann euch CooCox ans Herzen legen. Bisher konnte ich nichts besseres
an freier Software finden, wenn es um Cortex-M3 und Cportex-M4 geht.
http://www.coocox.org/
Hallo Michael!
Startet bei dir die Applikation aus dem Flash, auch wenn du keinen
Debugger angesteckt hast?
Ich habe im Internet gelesen, dass man in den Preprocessors
STARTUP_FROM_RESET setzen muss, damit das funktioniert.
Leider klappt das bei mir aber auch nicht.
lg
Rooney
Merkwürdig...
Ich habe das Projekt von dir genommen,STARTUP_FROM_RESET gesetzt und
dennoch läuft nix von selbst hoch.
Welche Crossworks Version verwendest du?
Hallo Rooney,
ich habe die 2.2.1 und die 2.3.0 verwendet.
Das sind aber "Nightly Builds", mit der 2.2.0 sollte es aber auch
laufen. Welches Beispiel genau von mir hast Du verwendet, und woran
erkennst Du das es nicht startet?
Welche Version von CrossWorks benutzt Du?
Kann ich Dein Beispiel mal bekommen was nicht geht?
Gruß,
Michael
Ich verwende LED-Blink-2.zip.
Das Programm habe ich zum Testen etwas abgeändert. Du schaltest ja nur
die LED ein. Ich habe daraus eine Endlosschleife gemacht, so dass die
LED blinkt.
Hängt der Debugger dran, dann funktioniert das Blinken einwandfrei.
Stecke ich ab, funktioniert es noch immer einwandfrei. Probleme gibt es
erst nach einem Reset.
Merkwürdig ist, dass wenn ich auf "Attach Debugger" gehe, also die
Software nicht neu reinspiele, dann blinkt die Baugruppe wieder. Hätte
ich STARTUP_FROM_RESET nicht gesetzt, dann würde der Programm Counter
auf reset_wait stehen --> siehe Startup.s. D.h. vom Prinzip her ändert
STARTUP_FROM_RESET das Verhalten, jedoch bin ich etwas ratlos, warum das
nur mit Debugger funktioniert. Muss man noch irgendetwas in den
Einstellungen ändern?
An der Hardware liegt das aber mit Sicherheit nicht, denn im IAR geht
das wunderbar.
Das Programm schaut wie folgt aus. Quick und dirty...
1
voidmain(void)
2
{
3
unsignedinti=0;
4
STM_EVAL_LEDInit(LED4);
5
STM_EVAL_LEDOn(LED4);/* Turn LED4 on: start of configuration */
6
while(1)
7
{
8
for(i=0;i<200000;i++)
9
{
10
STM_EVAL_LEDOn(LED4);
11
}
12
for(i=0;i<200000;i++)
13
{
14
STM_EVAL_LEDOff(LED4);
15
}
16
}
17
}
Crossworks Version: 2.2.0.20120222100.14129
STM32 CPU Support Package 2.13
Also irgendwie ist das sehr enttäuschend, dass so einfache Dinge in
Crossworks nicht funktionieren.
Hallo Rooney.
also hier läuft es.
1. Ich habe die main Funktion aus dem Beispiel oben gegen Deine main
ersetzt.
2. Zusätzlich STARTUP_FROM_RESET bei "Preprocessor Definitions".
Nun blinkt die LED wenn das Board die Versorgungsspannung bekommt.
Gruß,
Michael
Hallo Michael!
Bei mir läuft das Programm nun auch. Habe schätzungsweise 5x das Projekt
neu angelegt und jetzt geht alles. Woran es gelegen hat weiß ich aber
noch immer nicht....
Vielen Dank für deine Hilfe!!
lg
Rooney
Ich hatte auch Probleme.
Es scheint temporäre Dateien zu geben, die zwar projektabhängig sind
aber nicht im Projekt sondern in temporären Ordnern liegt.
Nach dem ich diese Dateien löschte waren meine Probleme weg.
Ich weiß aber leider nicht mehr welche das waren, hoffe aber der Tip
kann weiterhelfen.