CoIDE und STM32F429

Hier ein paar Beschreibungen, wie man den STM32F429 per CoIDE zum laufen bekommt :

1. Projekt Vorlage
2. Erstes Demo Programm für den STM32F429
3. Standard Peripheral-Files von CoIDE
4. Linker-Script für STM32F429
5. Probleme/Fehler bei der Benutzung von CoIDE und STM32F429
6. Library vom STM32F407 am STM32F429 benutzen

Ich gehe hier davon aus, das eure Toolchain für den STM32F4 schon installiert ist und funktioniert. (falls nicht…hier nochmal nachlesen : LINK)

Leider wird Momentan (23.10.2013) die STM32F429 CPU von der CoIDE nicht direkt unterstützt. Mann kann also nicht wie gewohnt ein Projekt anlegen sondern muss sich anders helfen (zumindest bis ein update der CoIDE vorhanden ist).

1. Projekt-Vorlage :

Unter nachfolgendem Link findet ihr ein (bzw. zwei) Leeres-CoIDE-Projekt mit allen Einstellungen die für das STM32F429-Discovery-Board notwendig sind. Ich werde dieses Gerüst als Ausgangspunkt für alle folgenden Projekte benutzen.

Sysclock = 180MHz (nicht für USB-Projekte geeignet) vorlage_f429_v101
Sysclock = 168MHz (für USB-Projekte geeignet) vorlage_f429_168MHz_v100

Die Vorlage kann mit CoIDE per “Project/Open project…” geladen werden

prj_leer

2. Erstes Demo-Programm für den STM32F429 :

Um zu testen ob alles funktioniert kann der nachfolgende Code benutzt werden :

//--------------------------------------------------------------
// File : main.c
// Datum : 23.10.2013
// Version : 1.0
// Autor : UB
// EMail : mc-4u(@)t-online.de
// Web : www.mikrocontroller-4u.de
// CPU : STM32F429
// IDE : CooCox CoIDE 1.7.4
// GCC : 4.7 2012q4
// Module : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Hauptprogramm
// Hinweis : Diese zwei Files muessen auf 8MHz stehen
// "cmsis_boot/stm32f4xx.h"
// "cmsis_boot/system_stm32f4xx.c"
// In Configuration diese Define hinzufügen :
// "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER"
//--------------------------------------------------------------

#include "main.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

void Delay(volatile uint32_t nCount) {
  while(nCount--)
  {
  }
}

void init(void) {
  GPIO_InitTypeDef GPIO_InitStructure;

  // Clock Enable
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

  // Config PG13 als Digital-Ausgang
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}

int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren

  init();

  while(1)
  {
    Delay(5000000);
    GPIOG->ODR ^= GPIO_Pin_13; // PG13 toggeln
  }
}

nach dem compilieren und programmieren (wie bei STM32F4) , sollte die grüne LED auf dem STM32F429-Discovery-Board blinken.

3. StandardPeripheral-Files von CoIDE

In der CoIDE können eigentlich sehr komfortabel die Standard-Module die für ein Projekt benötigt werden unter “Repository/Peripheral” hinzugefügt und entfernt werden.
(z.B. GPIO, SPI, TIM usw) … ist nur ein Mausklick.

Leider führt diese Methode dazu, das die Files für den STM32F407 in das Projekt kopiert werden und nicht die Files für den STM32F429 !!

So kann man also Standard-Module nicht zum eigenen Projekt hinzufügen.
Den Weg den ich benutze ist :

1. Das Firmware-Packet von der STM-Seite für den STM32F429 runterladen (da sind alle Files der Standard-Peripherals dabei)
Link : http://www.st.com/web/en/catalog/tools/PF259429
2. Wenn ich ein Modul benötige (z.B. GPIO) dann kopiere ich “per Hand” GPIO.C und GPIO.h in mein Projekt (in den “CMSIS_Lib”-Ordner)
3. In der CoIDE müssen die Files dann noch per rechter Maustaste “Add Files…” in das Projekt hinzugefügt werden.

Das ganze ist etwas umständlich aber in den Beispiel-Projekten von mir hab ich das ganze schon so vorbereitet….ihr müsst da gar nichts mehr machen.
(nur nicht vergessen NICHT per CoIDE die Standard-Module hinzufügen!!)

4. Linker-Script für STM32F429

Um das interne RAM von 256k komplett nutzen zu können, könnt ihr dieses Linker-Script-File nehmen :

ub_linkerscript_stm32f429i_disco

Nach dem auspacken müsst ihr das File in das Root von eurem CoIDE-Projektordner kopieren und dann unter “Configuration” den Haken entfernen (siehe Bild). Danach könnt ihr mit dem “Browse” Button das Linker-File einbinden.

linker

Im Linker-Script-File habe ich auch noch einen Adressbereich im SD-RAM von 4MByte (ab Adresse 0xD0100000) deklariert. Somit sind noch die ersten 1MByte vom RAM für das Display frei (damit es zu keinem Fehler mit meinen Display-Librarys kommt).

Um jetzt ein Array im externen SD-RAM anzulegen einfach folgendes machen :

1. Eine Array deklarieren (das im SD-RAM liegt)
2. Das SD-RAM initialisieren (mit meiner SD-RAM-Library)
3. Auf das Array ganz normal zugreifen

Hier ein Beispiel :

#include "stm32_ub_sdram.h"

// 1MByte array im SD-RAM deklarieren
#define  BUFFER_SIZE  (1024*1024)
uint8_t buffer[BUFFER_SIZE] __attribute__((section(".HeapMemSection")));

int main(void)
{
  uint32_t n;

  // init vom SD-RAM
  UB_SDRAM_Init();

  // array löschen
  for(n=0;n<BUFFER_SIZE;n++) {
    buffer[n]=0x00;
  }

  while(1) {
    // nothing to do
  }
}

5. Probleme/Fehler bei der Benutzung von CoIDE und STM32F429

Der STM32F429 hat 2MB Flash, leider unterstützt CoIDE im Moment nur das beschreiben der ersten 1MB.

6. Library vom STM32F407 am STM32F429 benutzen :

Die meisten Librarys die ich für den STM32F407 geschrieben habe, funktionieren ohne Änderung auch mit dem STM32F429.

Hier ein ToDO wie ihr selbst eine Library vom 407 auf dem 429 zum laufen bekommt :

1. Erstellt ein neues Projekt für den STM32F429 mit Hilfe der Vorlage (von weiter oben) entweder für 180MHz oder 168 MHz (wenn es ein USB-Projekt werden soll).
2. Erstellt einen Unterordner “ub_lib” im Projektordner und kopiert die Library die ihr benutzen wollt dort hinein (falls notwendig auch alle Hilfs-Librarys z.B. für SPI-Lolevel usw)
3. Legt in CoIDE einen Unterordner “ub_lib” an und fügt alle Files per rechter Maustaste “Add File” in das Projekt hinzu.
4. Drückt bei CoIDE auf den Button “Rebuild”
5. Jetzt kommen zich Warnmeldungen und Errors…schaut euch die erste an…da steht dann z.B. ” Filename : undefined reference to ‘NVIC_Init’ ”
6. Klickt per Maus auf den Filenamen der angemeckert wird und schaut ganz oben in den Kommentaren nach, welche Module für diese Library benötigt werden. Hier z.B. “GPIO, USART, MISC”
7. Kopiert von den STM Originalen für den STM32F429 aus dem Pfad “STM32F4xx_StdPeriph_Driver” die C- und H- Files aller Module die fehlen (also hier GPIO, UART, MISC) in den CoIDE Projektordner unter “cmsis_lib”
8. Fügt in CoIDE die Files (unter cmsis_lib) per rechter Maustaste “Add Files” zum Projekt hinzu und macht wieder bei Punkt 4 weiter, bis alle Fehlermeldungen beseitigt sind.
9. Es kann auch so eine Fehlermeldung angezeigt werden “oder “fatal error: stm32f4xx_spi.h: No such file or directory”
Da ist dann gleich ersichtlich welche Files fehlen (in dem Fall SPI.c und SPI.h)
10. Wenn das compilieren ohne Warn- und Fehlermeldung durchläuft, sollte das Projekt auf dem STm32F429 laufen.
11. Fertig

28 Antworten auf CoIDE und STM32F429

  1. Marco sagt:

    Man man bist du schnell… Ich habe das Teil nichtmal ausgepackt und bei dir läuft es schon mit der CoIDE. Was genau musstest du denn tun damit es läuft?

    • admin_ub sagt:

      Eigentlich nicht viel, der F429 und der F407 sind in vielen Sachen identisch. Und in den STM Beispielen sind ja Vorlagen z.B. für die “stm32f4xx.h” dabei. Die hab ich einfach kopiert bzw angepasst. Also alle Files unterhalb von “cmsis” und “cmsis_boot”. Wahrscheinlich kann man 70% der Projekte vom F407 auch unter dem F429 laufen lassen (ohne eine Änderung). An den restlichen 30% sitze ich gerade.

      • Marco sagt:

        Kannst du denn auch den gesamten Flash beschreiben? Ich habe gelesen, dass die CoIDE den Flashalgorithmus für die 2MB STMs nicht kann?

        • admin_ub sagt:

          nein hab ich schon geschrieben, bei 1MB ist schluß und um das komplette interne RAM benutzen zu können, wird auch was angepasst werden müssen.

  2. Tobias6789 sagt:

    Hi!
    An erster Stelle SUPER Arbeit!
    Deine Lib’s sind sehr gut geschrieben und sehr gut verständlich (kommt auch nicht all zu oft vor).
    Gibt es auch bereits eine Lib für den Inertialsensor?
    Liebe Grüße!

  3. NeoExacun sagt:

    Hey, ich finde deine Seite super :) Ohne dich hätte ich den Einstieg wohl nicht so schnell geschafft.

    Ich habe ein kleines Problem. Und zwar würde ich die Programme die ich schreibe gerne zuerst im RAM laufen lassen, um den Flash zu schonen. Wenn ich die Funktion “Debug in RAM” aktiviere bekomme ich leider nur Müll auf dem Display und nichts funktioniert.

    Kannst du irgendwie erklären, wie man Programme im RAM testen kann?

    Liebe Grüße
    Neo

    • tinkerer sagt:

      @NeoExacun

      warum willst du denn den “flash schonen” mittels nicht programmausführung “im flash”?
      Um die zigtausend garantierten schreibzyklen fürs flash mit reinschreiben neuer programme zu überschreiten, musst du schon sehr fleißig sein.
      Um zB. innerhalb eines Jahres auf 10000 writes zu kommen, müsstest du jeden der 365 tage 27 mal schreiben. Wenn du nur an wochenenden programmierst, müsstest du 1 Jahr lang *jedes* WE Sa+So 96 mal ins flash schreiben. Wenn du durchschnittlich jeden wochenend-tag 12 writes machst, hält der flash im chip mindestens 8 Jahre.
      Reicht das? ^^

  4. miros sagt:

    Hi,
    I have found needed STM32F4xx_2048.elf for 2M Flash.
    I don’t know if it works, but I plan to use it in near future.
    http://olek.tk/blog/public/STM32F4xx_2048.elf
    http://olek.tk/blog/index.php?post/2013/11/10/STM32F429I-FLASH-driver-for-CooCox

    • admin_ub sagt:

      thanks,
      i allready known this driver but i could not tested it. My projekts are smaller than 1MB. When it works fine, leave a message, then i uploaded the ELF and the link too.

      • miros sagt:

        Hi,
        finally it works.
        I have had problem with FMC peripherals library.
        When I moved from STM32F407 to STM32F427 I changed the FSMC library to FMC library. But this one causes a problem. The program is freezing always when I read or write to external FLASH or LCD. When I changed it to FSMC all works fine.
        The same problem was also in EmBlocks IDE.

  5. KvB sagt:

    Hallo,

    Ich muss vorausschicken….ich habe null Ahnung von dem Teil stm32f429…
    ausgepackt, alles nach deiner Anleitung installed und dann das erste prg, projekt und null probleme bis nach dem Build wie ich dann allerdings auf download code auslösen wollte passierte absolute nichts und ein reset nimmt er auch ned an…das Demo (das hübsche) ist auch weg…ich seh jetzt nur ein helles LCD…dat wars….

    was tun?

    br
    Gue

  6. Gerald_G sagt:

    Hi,

    wollte dich nur informieren, dass seit CooCox CoIDE V1.7.7 das STM32F429 voll unsterstützt wird.
    Hierzu muss gegebenenfalls im Repository unter Chips der grüne Update Button oben rechts gedrückt werden.

    • Lord sagt:

      Kann es sein das man beim neuen device File (CoIDE\config\devices\ST\STM32F429.xml) auf ein nicht vorhandenes Debugsettingfile verwiesen wird(STM32F4x9.xml)?
      Hab das bei mir mal auf die vorhandene Datei STM32F4x.xml umgeändert, wodurch nun das downloaden des Programmcodes ermöglicht wurde( allerdings weiß ich nicht ob diese vorgehensweiße nun Sinn der Sache ist).

  7. Julian W. sagt:

    Wenn ich jetzt eine Standardlib hinzufügen möchte, z.B. math.h, reicht es dann zu schreiben “#include, oder muss ich die noch irgendwo hinkopieren?

    • admin_ub sagt:

      standard Librarys musst du nicht ins Projekt kopieren
      (die sind ja bei jedem gleich der den gleichen Compiler benutzt)
      zum unterscheiden macht man den include dann in spitzen Klammern

      #include <stdio.h>
      #include <stdbool.h>
      

      usw.

  8. Olek:

    I am having a problem with step 1. of CoIDE and STM32F429. I do not get the window that is shown in step 1. therefor I do not know how to load “Sysclock = 168MHz (für USB-Projekte geeignet) vorlage_f429_168MHz_v100″.

    Is there an English version of this?

    Thank you,
    ƒg

    • admin_ub sagt:

      just click on the link and download the zip file. unzip the file into a folder e.g.”c:\stm_prj_01\”. then start CoIDE press in the menu bar “project/open project…” and select the “stm32f429.coproj” file. thats it.

  9. admin_ub:

    That was simple, thank you, I have the blinking green LED; but now I would like to understand the remainder of the article. I tried translating it on line but it is not clear to me. Is there am English translation?

    ƒg

    • admin_ub sagt:

      no sorry, all comments on this blog are only in german. but if you had a blinking green led then there is no more to do. All my projects you can download here contained the complete coide project files. so do the same thing and all projects should run out of the box. the only “tricky” part is if you want to add a library from here to a existing projekt. give me a second :

    • admin_ub sagt:

      ok lets say you have a new folder with the empty template project for the stm32f429 from here. Folder name is “stm_prj_01″. And you want to add the uart library from me to this projekt.
      1. make a subfolder in “stm_prj_01″ with the name “ub_lib”
      2. download my demo uart project for stm32f429 in a “temp” folder
      (it contains all files you need)
      3. copy the two files “stm32_ub_uart.c” and “stm32_ub_uart.h”
      from the uart_demo to “stm_prj_01/ub_lib”
      4. copy all stm_peripheral files from the uart_demo under “cmsis_lib”
      to “stm_prj_01/cmsis_lib”
      5. Open the “prj_01″ with coide
      6. add all new files in the IDE “uart.c+h” and all “cmsis peripheral” files
      7. edit the main.c with : #include “stm32_ub_uart.h”
      8. thats it…a compile should throw no errors/warnings
      9. look at the uart-demo project how the uart-lib must be used
      and implemet the source lines in your own main.c
      Hint : implement one lib a time and make sure that you have no compiler error

  10. TheMason sagt:

    Erstmal vielen dank für deine ganze Arbeit.
    Dank deiner ausgezeichneten libraries und Beispielen kommt man echt schnell rein.
    Aber mal eben eine Frage zum linkerscript.
    warum ist als sdram-Größe 0×400000 angegeben und nicht 0×800000 bzw 0×700000 für deine Display-reserve ? Die längen Angaben sind doch in Bytes oder ?

    • admin_ub sagt:

      Ja die Angabe ist in Bytes und ich habe mit Absicht nur die ersten 4MByte in die Region “SDRAM” für das Display gepackt. Wer eine zusätzliche Region braucht kann disese hintern den 4MB hinzufügen und kann sicher sein, das alle meine Projekte trotzdem damit laufen werden.

      • TheMason sagt:

        Ah Oki danke. War etwas verwirrt :)
        Mal noch eben eine Frage zu den libraries. Ich würde die vielen MBs nun gerne per malloc nutzen. Hab auch c Base library aktiviert, aber beim linken findet der sbrk nicht. Muss da noch beim linker was angegeben werden oder funzt malloc nicht weil man das Standard memory layout nicht nutzt ?

        • TheMason sagt:

          Hat sich erledigt. Ich war zu doof die syscalls mit ins Projekt zu packen. Kompilieren lässt es sich, aber nach dem Update der chipliste ging mit coide erstmal nix mehr :/

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


acht − = sieben

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>