martedì 14 maggio 2013

[HOWTO] STM32F3-Discovery su Ubuntu con ChibiOS ed Eclipse

Questa guida, rivolta principalmente ai miei colleghi universitari, ha lo scopo di illustrare le operazioni necessarie per configurare la STM32F3-Discovery della STMicroelectronics su Ubuntu utilizzando ChibiOS ed Eclipse.
Sul mio PC ho installato e configurato Ubuntu 13.04 a 64bit, ma la procedura è stata testata anche su Ubuntu 11.04 a 64bit, Ubuntu 12.04 a 32bit su macchina virtuale, Ubuntu 13.04 a 32bit su macchina virtuale e su Fedora 18 a 32bit (grazie Andrea).
Software necessario
Prima di cominciare, è necessario scaricare alcuni files:
- Eclipse IDE for C/C++ Developers, scaricabile da qui. Vi consiglio di scaricare la versione 4.2 (Juno) o superiore.
- ChibiOS, scaricabile da qui. È sufficiente fare click su "Zip".
- GNU Tools for ARM Embedded Processors, scaricabile da qui.
- OpenOCD, scaricabile da qui.
Supponiamo quindi di avere, all'interno di una directory qualsiasi, i seguenti quattro files:
  • ChibiOS-master.zip
  • eclipse-cpp-juno-SR2-linux-gtk-x86_64.tar.gz
  • gcc-arm-none-eabi-4_7-2013q1-20130313-linux.tar.bz2
  • openocd-0.7.0.zip
Ovviamente i nomi possono variare a seconda della versione che intendete utilizzare.
Installare Java
La prima cosa da fare, se non l'avete già fatto, è installare Java. Per conoscere se Java è installato e quale versione, basta digitare Per installare la JDK 7 di Oracle:
Installare Eclipse
Posizionamoci nella cartella in cui abbiamo salvato i files scaricati in precedenza e digitiamo Controlliamo che esista la directory ~/.local/share/applications, altrimenti la creiamo con Utilizzando un editor di testo (ad esempio gedit) creiamo il file eclipsecpp.desktop nel modo seguente: e scriviamo: In questo modo avremo il nostro IDE accessibile direttamente da menu.
Installare le dipendenze
Il software che andremo ad installare richiede che vengano soddisfatte alcune dipendenze. In particolare, per i sistemi a 64 bit è necessario garantire alcune librerie a 32 bit. Per fare ciò, è necessario installare il pacchetto ia32-libs: Una volta fatto ciò, installiamo le altre dipendenze:
Compilare ed installare OpenOCD
Nonostante OpenOCD sia presente nei repository di Ubuntu, abbiamo bisogno di ricompilarlo per abilitare il supporto ST-LINK.

NOTA: per chi avesse voglia di fare una prova, ho creato i package di OpenOCD per Ubuntu. Non ho avuto modo di testarli, quindi sarebbe gradito un feedback. Ecco i link ai files:
openocd_0.7.0-1_amd64.deb
openocd_0.7.0-1_i386.deb

Per chi vuole andare sul sicuro, bisogna seguire la seguente procedura. Posizioniamoci nella directory in cui abbiamo scaricato i files e digitiamo:
Installare le "GNU Tools for ARM Embedded Processors"
Ritorniamo alla cartella contenente i files scaricati ed eseguiamo i seguenti comandi: NOTA: Fedora utilizza un file differente per la configurazione di sistema. In particolare, l'istruzione precedente diventa: Per rendere effettive le modifiche, bisogna effettuare logout e login.
Aggiungere i permessi ed eseguire il primo test
A questo punto, se non abbiamo riscontrato nessun errore, possiamo procedere alla definizione delle regole di udev che ci permetteranno di accedere alla nostra scheda. Per fare ciò, è necessario creare un file: ed inserirci la seguente riga: Infine salviamo e ricarichiamo le regole con: Per testare se la scheda viene correttamente identificata, basta collegarla alla porta USB (sulla scheda bisogna utilizzare la porta etichettata con USB ST-LINK) ed eseguire il comando: e dovremmo ottenere un output del tipo: Terminiamo OpenOCD premendo CTRL-C e passiamo alla configurazione di Eclipse.
Configurare Eclipse
Per poter effettuare il debugging delle nostre applicazioni, abbiamo bisogno di installare un tool di Eclipse. Dal menu "Help" selezioniamo "Install New Software...". Nel menu a tendina, selezioniamo il repository ufficiale della nostra versione di Eclipse (per Juno è http://download.eclipse.org/releases/juno) e selezioniamo il pacchetto "C/C++ GDB Hardware Debugging".
Dopo l'installazione ed il riavvio di Eclipse, eseguire le seguenti impostazioni:
  • Deselezionare "Project -> Build Automatically"
  • Andare in "Window -> Preferences"
    • "C/C++ -> Code Analysis" e disabilitare tutto
    • "C/C++ -> New CDT Project Wizard -> Makefile Project -> Discovery Options" e selezionare "Automatic discovery of paths and symbols" e poi "GCC per project scanner info profile"
    • "C/C++ -> New CDT Project Wizard -> Makefile Project -> Behaviour" e selezionare "Enable parallel build" e poi "Use optimal jobs (n)" (dove n indica il numero di jobs ottimali per la vostra architettura)
    • "Run/Debug -> Launching -> Default Launchers -> GDB Hardware Debugging -> [debug]" e selezionare "Standard GDB Hardware Debugging Launcher"
    • Salvare le modifiche e chiudere
ChibiOS e il "progetto base"
Passiamo ora alla configurazione di un primo progetto che utilizzeremo successivamente per creare gli altri progetti.
Estraiamo il contenuto del file ChibiOS-master.zip che abbiamo scaricato in precedenza nella radice del workspace di Eclipse, in modo da avere qualcosa del tipo <workspace>/ChibiOS-master. Successivamente, copiamo la cartella <workspace>/ChibiOS-master/demos/ARMCM4-STM32F303-DISCOVERY nella cartella root del workspace, rinominandola BaseProject.
Da Eclipse, selezioniamo "File -> New -> C Project" e successivamente "Makefile project -> Empty Project -> -- Other Toolchain --". Assegniamo il nome BaseProject e poi clicchiamo su "Finish". Eclipse ci avviserà che il progetto esiste già, ma è quello che vogliamo, quindi clicchiamo su "OK".
Andate ora in "Window -> Preferences -> General -> Workspace -> Linked Resources", cliccate su "New..." e create una nuova variabile con nome CHIBIOS e scegliendo come "Location" la radice della directory ChibiOS-master.
Aggiornate il progetto (F5) e dovreste ottenere qualcosa del genere: Aprite il file Makefile e scorrete verso il basso fino alla riga la quale va sostituita con Salvate e provate a compilare: se tutto va a buon fine, siamo a buon punto! :-)
Configurare OpenOCD
Per poter comunicare con la scheda, è necessario eseguire OpenOCD. In particolare, è necessario fare in modo che sia Eclipse ad avviarlo. Per fare ciò, bisogna configurarlo come strumento esterno.
Da Eclipse, selezionare "Run -> External Tools -> External Tools Configurations...".
Cliccare col tasto destro su "Program" e poi "New".

Scheda "Main":
Nella casella "Name" scrivere OpenOCD
Nella casella "Location" scrivere /usr/local/bin/openocd
Nella casella "Working directory" scrivere ${workspace_loc:/${project_name}}
Nella casella "Arguments" scrivere -f /usr/local/share/openocd/scripts/board/stm32f3discovery.cfg -c init -c "reset init" -c "poll"

Scheda "Build":
Rimuovere la spunta a "Build before launch"

Cliccare su "Apply" e poi su "Close".
Configurare il debugger
Da Eclipse, selezionare "Run -> Debug Configurations...".
Cliccare col tasto destro su "GDB Hardware Debugging" e poi "New".

Scheda "Main":
Nella casella "Name" scrivere BaseProject (Flash and Run)
Nella casella "C/C++ Application" scrivere build/ch.elf
Selezionare "Disable auto build"

Scheda "Debugger":
Nella casella "GDB Command" scrivere arm-none-eabi-gdb
Selezionare "mi2" in "Protocol Version"
Nella casella "Port number" scrivere 3333

Scheda "Startup":
Nella casella "Reset and Delay (seconds)" scrivere 1
Rimuovere la spunta a "Halt"
Nella casella sotto "Halt" scrivere monitor reset halt
Selezionare "Set breakpoint at" e scrivere main

Scheda "Common":
Selezionare "Shared file" e scrivere /BaseProject

Cliccare su "Apply" e poi su "Close".
Compilazione e test finale
Siamo pronti ad eseguire la nostra prima applicazione!
Colleghiamo la scheda alla porta USB (ST-LINK) e ricompiliamo il progetto.
Avviamo OpenOCD: "Run -> External Tools -> External Tools Configurations...", selezionate "OpenOCD" e cliccate su "Run".
Avviamo il Debug: "Run -> Debug Configurations...", selezionate "BaseProject (Flash and Run)" e cliccate su "Debug".
A questo punto, dovrebbe aprirsi la vista "Debug" e dovrebbe avviarsi l'esecuzione, fermandosi al primo breakpoint. Per proseguire con l'esecuzione, cliccate sul tasto verde in alto finché non superate tutti i breakpoint e godetevi lo spettacolo! :-D
Creazione di un nuovo progetto
Come detto in precedenza, il progetto BaseProject ci servirà ogniqualvolta vorremo creare un nuovo progetto. Quindi è altamente consigliato tenerlo pulito ed evitare di farci test! All'atto della creazione di un nuovo progetto, il progetto base deve essere aperto.
Da Eclipse, duplicare il progetto BaseProject (copia e incolla).
Dopo aver dato un nuovo nome alla copia, selezionare "Run -> Debug Configurations...". Saranno presenti due configurazioni con lo stesso nome: selezioniamone una, apriamo la scheda "Common" e individuiamo quale delle due si riferisce al nuovo progetto (basta controllare il campo "Shared file").
Una volta individuata la configurazione del nuovo progetto, basta modificarne il nome e successivamente selezionare la scheda "Main", cliccare sul pulsante "Browse..." a destra della casella "Project:" e scegliere il nuovo progetto.
Infine, cliccate su "Apply" e poi su "Close", aggiornate il nuovo progetto (F5) e compilate!
Aggiunta di nuovi file al progetto
Se si vogliono aggiungere ulteriori file .c al progetto, è necessario aggiornare il campo CSRC del Makefile. Ad esempio, supponendo di creare un file test.c ed il suo header test.h, bisogna modificare il Makefile in questo modo:
Problema: CTRL+Click non funziona!
Se la funzione CTRL+Click di Eclipse non dovesse funzionare, è necessario aggiornare l'indice del progetto: fare click col tasto destro sul progetto e selezionare "Index -> Rebuild".
Link utili
Descrizione delle varie funzioni e costanti di ChibiOS: http://chibios.sourceforge.net/html/index.html
Forum ufficiale di ChibiOS: http://forum.chibios.org
Fonti
http://www.engineering-diy.blogspot.ro/2012/11/stm32f3-discovery-eclipse-openocd.html
http://www.chibios.org/dokuwiki/doku.php?id=chibios:guides:eclipse1
http://www.chibios.org/dokuwiki/doku.php?id=chibios:guides:eclipse2

46 commenti :

  1. anto' ma la cartella di eclipse dove viene spostata?

    RispondiElimina
  2. anto' ho trovato la cartella...ma si puo spostare o deve rimanere nell'attuale posizione?

    RispondiElimina
    Risposte
    1. Eclipse viene installato in /opt/eclipse-cpp. Questo perché la cartella /opt serve a contenere il software "opzionale". In pratica, il comando sudo mv eclipse /opt/eclipse-cpp non fa altro che spostare la cartella eclipse in /opt e rinominarla.
      La puoi spostare tranquillamente, ma non vedo perché dovresti! :P

      Elimina
    2. Anto' premettendo ke nn ho fatto alcun cambiamnto ancora rispetto alla tua guida e ke la skeda viene riconosciuta.....eclipse mi da uno strano problema :

      Some sites could not be found. See the error log for more detail.
      No repository found at http://download.eclipse.org/eclipse/updates/4.2.
      No repository found at http://download.eclipse.org/releases/juno/201303010900.
      No repository found at http://download.eclipse.org/releases/juno.
      No repository found at http://download.eclipse.org/releases/juno/201206270900.
      No repository found at http://download.eclipse.org/eclipse/updates/4.2-I-builds.


      e quindi nn riesco a istallare il plugin di eclipse

      Elimina
    3. 1. Hai Eclipse Juno o un'altra versione?
      2. Quando fai "Help -> Install new software..." cosa inserisci nel campo "Work with:"?
      Per Juno devi selezionare "Juno - http://download.eclipse.org/releases/juno" (che è già presente nel menu a tendina).

      Elimina
    4. anto nn soke è successo cmq ho cancellato e istalatto un altro eclipse.....ho fatto tutto però nel mio progetto nn compare l'include...come si aggiungono? lo posso fare manualmente?

      Elimina
    5. Probabilmente puoi aggiungerli a mano, ma su questo non so aiutarti al momento... Comunque se non ti compaiono c'è qualcosa che non va. Hai compilato? Ti dà qualche errore?
      Fai così: tasto destro sul progetto e poi "Clean Project", poi di nuovo tasto destro e "Build Project" e vedi cosa ti dice la console.

      Elimina
  3. Ho seguito tutta la guida ma non compila il codice.
    Questi sono gli errori:

    make: *** [build/obj/crt0.o] Errore 127 BaseProject C/C++ Problem

    make: *** [build/obj/vectors.o] Errore 127 BaseProject C/C++ Problem

    RispondiElimina
    Risposte
    1. Potresti postare tutto il log?

      Elimina
    2. Riavviando Ubuntu ha compilato tutto il codice (non mi chiedere perchè). Ora quando provo a far partire l'esempio in modalità debug mi dà questo errore: An internal error occurred during: "Launching BaseProject (Flash and Run)".
      Path for project must have only one segment.
      Devo aver sbagliato qualcosa nei settaggi, adesso provo a risolvere.

      Elimina
    3. Probabilmente il riavvio ha impostato la variabile PATH (cosa che avrebbe dovuto fare il comando `source ~/.profile`).
      Fammi sapere se riesci a risolvere! ;)

      Elimina
    4. Ma quando mando in esecuzione il programma devo sempre usare la porta USB ST-LINK o la USB USER?

      Elimina
    5. La porta USER serve per comunicare con il dispositivo, ad esempio per leggere un eventuale output.
      La porta ST-LINK serve invece per flashare il dispositivo.
      Quando avvii il debugger, il dispositivo deve quindi essere collegato alla porta ST-LINK.

      Elimina
    6. Ok grazie. Comunque ho risolto. Errore di distrazione come sempre. Nel configurare il debugger avevo dimenticato di settare il "Project" nella schermata "Main". Grazie ancora per la disponibilità!!!

      Elimina
    7. Ti chiedo un'ultimissima informazione. Mi sapresti indicare dove posso trovare un po' di documentazione per la programmazione?

      Elimina
    8. La documentazione completa mi pare sia a pagamento... :(
      Comunque, trovi qui la descrizione delle varie funzioni e costanti di ChibiOS: http://chibios.sourceforge.net/html/index.html
      Inoltre, è presente il forum ufficiale di ChibiOS, con alcuni esempi: http://forum.chibios.org/
      Per il resto, bisogna cercare un po' in rete e magari collaborare tra di noi! ;)

      Elimina
    9. Description Resource Path Location Type
      make: *** [build/obj/crt0.o] Error 127 BaseProject C/C++ Problem
      make: *** Waiting for unfinished jobs.... BaseProject C/C++ Problem
      make: *** [build/obj/vectors.o] Error 127 BaseProject C/C++ Problem

      Ho ricevuto questi errori quando ho provato a compilare, suggerimenti?

      Elimina
    10. Ciao Chaosottolo. Dovresti postare tutto il log (la scheda "Console" e non "Problems" di Eclipse).

      Elimina
    11. make -j2 all
      Compiling crt0.c
      Compiling vectors.c
      make: arm-none-eabi-gcc: Command not found
      make: arm-none-eabi-gcc: Command not found
      make: *** [build/obj/crt0.o] Error 127
      make: *** Waiting for unfinished jobs....
      make: *** [build/obj/vectors.o] Error 127

      Penso sia dovuto ad un errore di configurazione di arm-none-eabi-gcc - In particolare mi sembra che gli ultimi due comandi non siano andati a buon fine.

      Elimina
    12. Il problema è stato risolto e inserito nella guida.
      Chaosottolo utilizza Fedora e il path va impostato in ~/.bash_profile

      Elimina
  4. quando creo un nuovo progetto e faccio build project esce questo:

    18:32:15 **** Build of configuration Default for project BlinkingLight ****
    make -j8 all
    makefile:68: ../../boards/ST_STM32F3_DISCOVERY/board.mk: No such file or directory
    makefile:69: ../../os/hal/platforms/STM32F3xx/platform.mk: No such file or directory
    makefile:70: ../../os/hal/hal.mk: No such file or directory
    makefile:71: ../../os/ports/GCC/ARMCMx/STM32F3xx/port.mk: No such file or directory
    makefile:72: ../../os/kernel/kernel.mk: No such file or directory
    makefile:73: ../../test/test.mk: No such file or directory
    makefile:221: ../../os/ports/GCC/ARMCMx/rules.mk: No such file or directory
    make: *** No rule to make target `../../os/ports/GCC/ARMCMx/rules.mk'. Stop.

    18:32:15 Build Finished (took 80ms)

    RispondiElimina
    Risposte
    1. inoltre anche a me non ci sono le include

      Elimina
    2. Potrebbe essere un problema di path... Fai una cosa, da shell esegui il comando `pwd` all'interno di ciascuna delle seguenti cartelle e posti il risultato:
      - La cartella del workspace
      - La cartella ChibiOS-master
      - La cartella del tuo progetto (da quello che hai postato è la cartella BlinkingLight)

      Elimina
  5. A me in Windows mi crea il progetto, ma esso è vuoto, non contiene nessun file ne dir

    RispondiElimina
    Risposte
    1. Su Windows non l'ho testato (né penso lo farò).
      Se riesci a risolvere, puoi scrivere qui come hai fatto, nel caso qualcun altro abbia il tuo stesso problema. ;)

      Elimina
  6. Ciao, ottima guida complimenti, ma qualche link ad esempi, magari per il giroscopio e quant' altro ? Grazie mille

    RispondiElimina
    Risposte
    1. Grazie! Penso che nei prossimi giorni metterò qualche esempio. ;)

      Elimina
  7. Ciao, volevo chiedetti se conosci una procedura per poter far girare un programma scritto per Ubuntu su piattaforma Windows. Ho tutti i file ma che ho copiato nel progetto ma ho qualche problema con l` OpenOCD e il Debug.

    RispondiElimina
    Risposte
    1. Ciao! Come ho già scritto in qualche commento più sopra, non ho avuto modo (né voglia) di testare la procedura su Window$. Ad ogni modo, so che esiste un tool (ChibiStudio) che dovrebbe contenere tutti gli strumenti (OpenOCD e il debugger) già configurati. Ti consiglio di fare una prova con quello.
      Mi dispiace non poterti essere d'aiuto più di tanto...

      Elimina
  8. Ciao Antonio,

    grazie e complimenti per questa splendida guida! Ne ho lette tante e devo riconoscere che questa è sia la più completa che la più chiara. Con questa sono riuscito a compilare da Eclipse i progetti ChibiOS, al contrario di prima dove mi funzionavano solo i progetti "ST".

    Se vivi o passi da Trento, fatti vivo che ti offro una birra.
    Grazie ancora,

    Davide

    RispondiElimina
    Risposte
    1. A proposito, non è che potresti aggiungere le informazioni anche su come flashare ed eseguire un progetto su RAM invece che su ROM?

      Grazie!

      Elimina
    2. Ciao Davide! Grazie mille per i complimenti! :D
      Non credo di passare per Trento (vivo MOLTO più a sud), ma è come se avessi accettato la birra! ;)
      Per quanto riguarda il discorso della RAM, purtroppo non so aiutarti. Ad ogni modo, penso sia impossibile flashare un progetto su RAM in quanto è una memoria volatile. Non so come gestisce la memoria ChibiOS, ma generalmente le applicazioni vengono spostate nella RAM in fase di esecuzione, a seconda dello spazio a disposizione.
      Ti consiglio di consultare il forum ufficiale di ChibiOS (http://forum.chibios.org) e magari chiedere lì (l'amministratore, nonché creatore di ChibiOS è di Salerno).
      Ciao!

      Elimina
  9. Hello I use STM32F3 discovery and Openocd 0.7.0 and Ubuntu 12.04 LTS 64bit
    I've got some errors:

    Open On-Chip Debugger 0.7.0 (2013-09-09-10:58)
    Licensed under GNU GPL v2
    For bug reports, read
    http://openocd.sourceforge.net/doc/doxygen/bugs.html
    srst_only separate srst_nogate srst_open_drain connect_deassert_srst
    Info : This adapter doesn't support configurable speed
    Info : STLINK v2 JTAG v16 API v2 SWIM v0 VID 0x0483 PID 0x3748
    Info : Target voltage: 2.887038
    Error: init mode failed
    in procedure 'transport'
    in procedure 'init'


    I try on openocd 0.6.1 and did not works too i've got:

    Error: open failed
    in procedure 'transport'
    in procedure 'init'

    Can i fix this?? or maybe is something wrong on my board?? Ofc i connected on USB ST-LINK, and i did all following the tutorials

    RispondiElimina
    Risposte
    1. Hi, could you post the result of the following command?

      openocd -f /usr/local/share/openocd/scripts/board/stm32f3discovery.cfg -c init -c "reset init" -c "poll"

      Elimina
    2. Pay particular attention to the quotes! I suggest you do not copy and paste!

      Elimina
    3. Ok, solved, there was something wrong with my ST-LINK jumpers on the board.

      Elimina
  10. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  11. Ciao Antonio
    ho seguito la tua guida più o meno alla lettera (più o meno perché ho una scheda diversa la SMT32F4-Discovery e perché ho ubuntu 13.10 a 64-bit). Solo che funge più o meno tutto ma quando vado a compilare mi esce questo errore:

    make: *** No rule to make target `crt0.c', needed by `build/obj/crt0.o'. Stop.

    Per caso saresti in grado di dirmi la causa ed una probabile soluzione?
    Ti ringrazio in anticipo :D

    RispondiElimina
    Risposte
    1. Come non detto ho risolto :D Problemi nel settare la variabile $PATH.

      PS: grande guida!!! Mi è stata utilissima!! GRAZIE!

      Elimina
    2. Ciao Emanuele!
      Scusa se non ti ho risposto prima.
      Mi fa piacere che tu sia riuscito a risolvere e ti ringrazio per i complimenti! :)

      Elimina
  12. salve sono pasquale
    posseggo la STM32F3-Discovery la procedura di installazioe e debug è ok, se possibile puoi darmi una dritta di come attivare una porta per interfacciare un sensore di movimento (PIR) alla scheda.

    RispondiElimina
    Risposte
    1. Ciao Pasquale.
      Purtroppo attualmente mi trovo all'estero e non ho qui con me la scheda, quindi non posso aiutarti. Però sul sito della ST sono presenti dei documenti piuttosto dettagliati, anche se molto tecnici, su ciascun componente della STM32F3-Discovery. Inoltre, potresti dare un'occhiata al forum di ChibiOS qui: http://forum.chibios.org/. Il forum sembra piuttosto attivo e credo che lì riusciranno ad aiutarti.
      Mi dispiace non poterti aiutare più di tanto.

      Elimina
    2. ok ti ringrazio adesso ci provo.
      ciao

      Elimina