STM32 e Arduino

by luca
25 comments

STM32 è una famiglia di microcontrollori a 32bit prodotti da STMicroelectronics e basata su core ARM Cortex M.

La famiglia STM32 è divisa in diverse linee di microcontrollori (L0-1-4, F0-1-2…) a seconda delle caratteristiche e dell’uso a cui sono destinati:

stm32-16

Questi microcontrollori sono molto utilizzati in ambito industriale… per portare un paio di esempi sia l’orologio Pebble, sia i braccialetti Fitbit sono basati su MCU STM32.

Se vi interessate di quadricotteri o droni, sicuramente avrete sentito parlare di schede di controllo (flight control boards) F1, F3, F4… Tale nome indica proprio il microcontrollore STM32 sulle quali sono basate.

Grazie al lavoro della community stm32duino e al supporto di ST stessa, da inizio giugno i microcontrollori STM32 sono facilmente utilizzabili con l’IDE Arduino ed è inoltre possibile sfruttare gran parte delle librerie disponibili per Arduino.

Ho quindi deciso di acquistare una scheda minimale basata sul microcontrollore STM32F103C8T6 (queste schede sono spesso chiamate blue pill); vediamo come utilizzarla con Arduino.

Bootloader

Molte schede vengono vendute non programmate: la prima cosa da fare è quindi quella di programmare un bootloader, un piccolo programma che ci consentirà poi di caricare il nostro programma tramite la porta USB.

Per programmare il bootloader, ci servirà un adattatore USB -> seriale, da collegare alla scheda come segue:

  • RX -> A9
  • TX -> A10
  • VCC -> 5V
  • GND -> GND

stm32-18 stm32-19

Inoltre dobbiamo attivare la modalità programmazione, spostando il primo jumper (etichettato BOOTo) in posizione 1:

stm32-17

Dobbiamo ora scaricare il software per effettuare la programmazione e il file contenente il bootloader. Se utilizziamo Windows, possiamo scaricare il Flash Loader dal sito ufficiale di ST: una volta registrati (gratuitamente) ci sarà inviato il link per il download direttamente via mail.

Il bootloader è stato sviluppato da Roger Clark ed è disponibile sul suo repository Github. Per le schede STMF1 sono disponibili diversi binari, a seconda del pin al quale è collegato il led presente sulla scheda stessa. Nel mio caso tale pin è P13, quindi utilizzerò il file generic_boot20_pb13.bin.

Eseguiamo Demonstrator GUI e selezioniamo la porta seriale alla quale è collegato il nostro adattatore:

stm32-03

Se i collegamenti sono corretti, il software dovrebbe rilevare il microcontrollore:

stm32-04

Possiamo ora indicare il modello di microcontrollore che è presente sulla nostra scheda:

stm32-05

quindi caricare il file contenente il bootloader e procedere con la programmazione. Per sicurezza possiamo richiedere una global erase:

stm32-06

il programma procederà alla programmazione del chip e al termine ci darà un messaggio di conferma:

stm32-08

Se riportiamo il jumper BOOT0 in posizione iniziale, vedremo il led lampeggiare: questo indica che il bootloader è in esecuzione e che non c’è alcun programma memorizzato… possiamo ora passare alla configurazione dell’IDE.

Arduino IDE

Quanto descritto in questo paragrafo non è valido per le nuove versioni di Arduino. Potete seguire la wiki ufficiale o leggere il commento di Giancarlo al termine dell’articolo.

Apriamo il nostro IDE e scegliamo File – Preferences. Inseriamo come Additional Boards Manager URLs la seguente:

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

stm32-00

Apriamo ora il Boards Manager:

stm32-01

Cerchiamo STM32F1 e installiamo il relativo Cores package:

stm32-02

Siamo quasi pronti per compilare e caricare il nostro primo programma…

Drivers

Colleghiamo la scheda di sviluppo al nostro PC via USB e verifichiamo come viene rilevata.

E’ possibile che Windows non sia in grado di riconoscerla e la visualizzi come Maple 003, in tal caso è necessario installare i relativi drivers:

stm32-09

Scarichiamo dal repository Github di Clark i seguenti files:

  • install_STM_COM_drivers.bat
  • install_drivers.bat
  • wdi-simple.exe

Eseguiamo i due .bat:

stm32-10

ora la scheda dovrebbe essere riconosciuta correttamente:

stm32-11

E’ possibile però che non venga riconosciuta anche la porta seriale associata alla scheda. Per “forzare” Windows a identificarla, possiamo programmare sulla scheda un semplice sketch che faccia uso dell’oggetto Serial. Apriamo ad esempio lo sketch blink e modifichiamolo come segue:

stm32-12

Programmiamo lo sketch selezionando BluePill F103C8 come boardSTM32duino bootloader come upload method.

Una volta programmato ed eseguito lo sketch, Windows dovrebbe rilevare anche la nuova porta COM:

stm32-14

Abbiamo terminato, ora possiamo utilizzare la scheda dall’IDE Arduino:

stm32-15

Related Posts

25 comments

Gert 27 luglio 2017 - 21:17

found the .bin file in Roger Clark’s repository, however when uploading the modified blink sketch:

Cannot run program “{runtime.tools.arm-none-eabi-gcc.path}\bin\arm-none-eabi-g++” (in directory “.”): CreateProcess error=2, The system cannot find the file specified

Reply
luca 28 luglio 2017 - 12:48

Hi, it usually means that the installation of the platform wasn’t successful… try to reinstall it.

Reply
Gert 29 luglio 2017 - 18:52

Thanks for you wonderful manual!
I used Arduino IDE v 1.6.5 initially, which failed. Now I used v 1.8.3 that seems to do better. Using your directions, I could indeed persuade Windows to find the COM5 port. After compiling the blink sketch I see the following output, the STM32 is not programmed, (I use the USB line)
———————————–
Sketch uses 12172 bytes (9%) of program storage space. Maximum is 131071 bytes.
Global variables use 3012 bytes (36%) of dynamic memory, leaving 5180 bytes for local variables. Maximum is 8192 bytes.
STM32 ST-LINK CLI v2.1.0
STM32 ST-LINK Command Line Interface
No ST-LINK detected!
————————————

Reply
Gert 29 luglio 2017 - 18:57

Sorry, ignore the output in my last comment. It is actually as follows: (the STM32 does not get programmed):
————————–
Build options changed, rebuilding all
Sketch uses 20276 bytes (30%) of program storage space. Maximum is 65536 bytes.
Global variables use 6456 bytes (31%) of dynamic memory, leaving 14024 bytes for local variables. Maximum is 20480 bytes.
maple_loader v0.1
Resetting to bootloader via DTR pulse
Searching for DFU device [1EAF:0003]…
Found it!

Opening USB Device 0x1eaf:0x0003…
Found Runtime: [0x1eaf:0x0003] devnum=1, cfg=0, intf=0, alt=2, name=”STM32duino bootloader v1.0 Upload to Flash 0x8002000″
Setting Configuration 1…
Claiming USB DFU Interface…
Setting Alternate Setting …
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Transfer Size = 0x0400
bytes_per_hash=411
Starting download: [##################################################] finished!
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
Resetting USB to switch back to runtime mode
error resetting after download: usb_reset: could not reset device, win error: The system cannot find the file specified.
———————————-

Reply
Gert 29 luglio 2017 - 20:03

solved: problem was the 1.5 kΩ pullup resistor on D+ , see:
http://wiki.stm32duino.com/index.php?title=Blue_Pill

Reply
luca 29 luglio 2017 - 23:13

thanks for sharing your solution!

Reply
Daniele 10 settembre 2017 - 14:41

Grazie per la splendida guida! Ho due domande:
1) Le uscite e gli ingressi dei pin accettano 5v come arduino o 3.3v?
2)Ho bisogno di un conertitore seriale TTL?

Reply
luca 16 settembre 2017 - 16:02

Ciao Daniele, non tutti i pin sono 5v tolerant… puoi guardare il datasheet o questa tabella per sapere quali. Il convertitore seriale-ttl ti serve solo per programmare il bootloader, poi puoi usare l’interfaccia USB nativa.

Reply
Raul 19 ottobre 2017 - 09:26

Ciao Luca
GRAZIE tante per le tue spiegazioni molto utili.
io invece ho un problema….i miei IDE non trovano il file da caricare STM32F1 sul BOARDS MANAGER.
uso IDE 1.6.5 ed il 1.8.2
Trovano soltanto il STM32F4
se mi puoi aiutare ti ringrazierei tanto….

RAUL

Reply
luca 21 ottobre 2017 - 13:54

Ciao! Controlla di aver inserito correttamente l’URL tra le “Additional Boards Manager URLs”, una volta scaricato l’elenco da quel sito dovrebbe comparire.

Reply
Raul 12 gennaio 2018 - 09:59

Ciao Luca, vorrei sapere se si può in qualche maniera installare sul IDE 1.0.6 l’applicazione per poterlo usare con questi CHIP stm32
Su PREFERENCES di questa versione IDE non c’è Additional Boards Manager URLs…!!

Ti saluto e ti ringrazio…!

RAUL

Reply
luca 12 gennaio 2018 - 10:11

Ciao Raul, stai usando una versione veramente vecchia dell’IDE… devi aggiornarlo

Reply
Raul 12 gennaio 2018 - 16:56

ciao Luca…lo so, lavoro anche con la versione 1.8.3 ma questo codice che avevo fatto non si compila con i nuovi IDE ed io ancora sono un po di legno per capire il perché….
Comunque non si puo fare nulla con la versione 1.0.6….??? non posso caricare in nessuna maniera ..??

GRAZIE

RAUL

Reply
Sam 12 febbraio 2018 - 14:04

Ciao, ottima guida! Ho la stessa tua scheda di sviluppo, che però ho notato che monta oscillatori da 4 e 16Mhz, ti chiedevo se conosci un modo per capire a che reale frequenza vada questa MCU??? Utilizza un oscillatore interno per raggiungere i 70Mhz? Grazie!

Reply
luca 26 febbraio 2018 - 14:51

ciao, il chip internamente va a 72MHz, che vengono generati a partire da un quarzo esterno (supportati da 4 a 16MHz) o dall’oscillatore interno a 8MHz.

Reply
Jacopo 19 maggio 2018 - 21:41

Salve, ho una domanda. Ho acquistato una scheda BluePill, una volta scaricato il bootloader tramite ftdi volevo utilizzare la usb integrata sulla scheda, ma inserito il cavetto usb nel PC compare un pop-up di avvertimento dicendomi che l’ultimo dispositivo usb non è stato riconosciuto. Ho letto che potrebbe essere un problema hardware dato dalla resistenza posizionata su R10. Sostituendola con una resistenza da 1.8KOhm è possibile risolvere questo problema?

Reply
luca 20 maggio 2018 - 09:55

Ciao Jacopo, si alcune schede hanno questo problema e il suggerimento è proprio quello di cambiare la resistenza (vedi ad esempio la pagina wiki di STM32duino). Fammi sapere se così risolvi…

Reply
Antonio 11 novembre 2018 - 18:58

Buongiorno Luca,
intanto complimenti per il tuo impegno sulla condivisione.
Ho acquistato una scheda black pill STM32F103 ecc… ho seguito la tua procedura per far vedere la scheda in modalità seriale con demonstrator GUI della ST ma non me la riconosce.
Ho settato correttamente i jumper e settato l’interfaccia TTL/USB a 115200baud ma niente da fare.

Risulta a qualcuno un problema simile al mio?

grazie dell’aiuto
Antonio

Reply
Giancarlo 1 febbraio 2019 - 20:47

Buongiorno Luca, Ottima guida complimenti.
Io ho una blue pill STM32F103C8, ho seguito tutti i passi elencati, però anche se l’ide di arduino riconosce la scheda non mi da STM32duino bootloader come upload method, ci sono 3 opzioni ma non quella che serve . non so che fare . Ciao

Reply
luca 1 febbraio 2019 - 21:49

Ciao, il tutorial ormai è superato per i nuovi IDE, segui la wiki ufficiale

Reply
Giancarlo 2 febbraio 2019 - 10:02

Grazie. Ciao

Reply
Giancarlo 2 febbraio 2019 - 11:01

Risolto : Bisogna scaricare il file (Arduino_STM32-master.zip) dal wiki ufficiale
qui ( http://wiki.stm32duino.com/index.php?title=Installation ) decomprimere e mettere la cartella : Arduino_STM32-master (togliendo -master) qui : C:\Users\\Documents\Arduino\hardware\Arduino_STM32 , aggiungere” \hardware” se non è presente . Riavviare ide arduino . Adesso il upload method : STM32duino bootloader è presente ed è possibile caricare gli sketch .
Grazie Luca

Reply
Giancarlo 2 febbraio 2019 - 11:08

Il tutorial non è superato c’è solo da aggiungere quest’ultima parte . Ciao

Reply
luca 2 febbraio 2019 - 12:00

grazie Giancarlo per il feedback!

Reply
Sil 12 aprile 2019 - 13:41

Buon giorno,

sto usando una scheda STM Nucleo-32 modello 32L4KC.

Ho installato correttamente tutte le librerie, gli esempi base funzionano senza alcun problema.

Quando compilo un mio software che su Arduino classico funziona senza alcun problema, così come su un altro microcontrollere, ottengo questo errore:

C:\Users\skunkworks2\AppData\Local\Arduino15\packages\STM32\hardware\stm32\1.5.0\libraries\Wire\src/Wire.h:54:5: error: ‘i2c_t’ does not name a type

i2c_t _i2c;

Mi può aiutare?
Grazie. Silvano

Reply

Leave a Comment

sedici + sette =