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
Hallo Rooney, bei mir starten auch die Applikationen ohne den Debugger, natürlich nur wenn STARTUP_FROM_RESET gesetzt ist. Gruß, Michael
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.
Benutzt Du noch die "debug_XXXX" Funktionen, wenn ja, raus damit. Geht es dann?
Das Programm schaut wie folgt aus. Quick und dirty...
1 | void main(void) |
2 | {
|
3 | unsigned int i = 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.