STM32F4-Discovery und Crossworks

Gast #2674815
Lesenswert?

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.
Angehängte Dateien:
#2675038
Lesenswert?

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
Angehängte Dateien:
Gast #2675201
Lesenswert?

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.
#2751695
Lesenswert?

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
#2752877
Lesenswert?

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
#2752886
Lesenswert?

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.
#2753568
Lesenswert?

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.
Gast #2766681
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren