Per inviare dati seriali sulla porta USB (collegata ad STLink) si devono prima attivare i pin tramite Cube MX e si devono configurare i parametri di trasmissione di USART2 (in questo caso 9600 8N1)
fatto cio' si apre il progetto e si trova gia' configurata la porta huart2 su cui trasmettere un buffer di caratteri
char buffer[12];
..........
HAL_UART_Transmit(&huart2,buffer,strlen(buffer),HAL_MAX_DELAY);
char newline[2] = "\r\n";
HAL_UART_Transmit(&huart2,(uint8_t *) newline,2,HAL_MAX_DELAY);
Visualizzazione post con etichetta STM32. Mostra tutti i post
Visualizzazione post con etichetta STM32. Mostra tutti i post
giovedì 22 agosto 2019
sabato 17 agosto 2019
STM32F103C8T6 Blue Pill Blink
La scheda si basa su un Cortex M3 a 72 MHz e 32 bit con 20Kb di ram statica, 64 Kb di flash memory. Tensione di riferimento e' a 3.3 V ma alcuni pin permettono anche tensioni massime di 5 V
Nonostante disponga di una porta USB la programmazione avviene tramite ST Link esterno che deve essere collegato ai 4 pin sul lato corto (oppure usando un seriale TTL TX su A10 e RX su A9). In realta' e' possibile flashare un boot loader che permette la programmazione via USB e la compatilibita' con Arduino IDE perdendo pero' spazio di memoria (circa 20 Kb)
Proviamo adesso a programmmare il classisvo blink
Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.142412
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Error: timed out while waiting for target halted
TARGET: STM32F103C8Tx.cpu - Not halted
in procedure 'program'
in procedure 'reset' called at file "embedded:startup.tcl", line 500
in procedure 'ocd_bouncer'
embedded:startup.tcl:476: Error: ** Unable to reset target **
in procedure 'program'
in procedure 'program_error' called at file "embedded:startup.tcl", line 501
at file "embedded:startup.tcl", line 476
il trucco sta nel premere il pulsante di reset della scheda, lanciare Run e circa un seconda dopo che inizia a lampeggiare STLink si deve rilasciare il tasto di reset
il messaggio di corretto carivamente e;' il segiente
Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.129153
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000c50 msp: 0x20005000
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
adapter speed: 4000 kHz
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 64kbytes
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 4096 bytes from file Debug/blue_piull.elf in 0.264664s (15.114 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
verified 3404 bytes in 0.072038s (46.145 KiB/s)
** Verified OK **
** Resetting Target **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
shutdown command invoked
A questo punto si preme nuovamente il tasto reset per mandare in esecuzione il programma
Nonostante disponga di una porta USB la programmazione avviene tramite ST Link esterno che deve essere collegato ai 4 pin sul lato corto (oppure usando un seriale TTL TX su A10 e RX su A9). In realta' e' possibile flashare un boot loader che permette la programmazione via USB e la compatilibita' con Arduino IDE perdendo pero' spazio di memoria (circa 20 Kb)
Proviamo adesso a programmmare il classisvo blink
Da questo schema si vede che il led integrato e' collegato alla porta GPIO C13. Attenzione ...rispetto ad una Arduino la numerazione dei Pin e' diffetente...ci sono piu' pin 13 per esempio PB13, PC13 perche' ci sono piu' porte GPIO
Si apre CubeMX e i crea un progetto selezionando selezionando STM32F103C8Tx ed attivando il il clock su HCE Crystal reconator e PC13 come GPIO Output e denominandolo LED
Si genera il codice e si apre SW4STM32 e si modifica main.c come indicato
-------------------------------------------------
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(5000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
-------------------------------------------------
Qui arriva la parte un po' complicata....se si effettua un semplice build and run si ottiene il seguente errore
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.142412
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Error: timed out while waiting for target halted
TARGET: STM32F103C8Tx.cpu - Not halted
in procedure 'program'
in procedure 'reset' called at file "embedded:startup.tcl", line 500
in procedure 'ocd_bouncer'
embedded:startup.tcl:476: Error: ** Unable to reset target **
in procedure 'program'
in procedure 'program_error' called at file "embedded:startup.tcl", line 501
at file "embedded:startup.tcl", line 476
il trucco sta nel premere il pulsante di reset della scheda, lanciare Run e circa un seconda dopo che inizia a lampeggiare STLink si deve rilasciare il tasto di reset
il messaggio di corretto carivamente e;' il segiente
Open On-Chip Debugger 0.10.0+dev-00021-g524e8c8 (2019-04-12-08:48)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
srst_only separate srst_nogate srst_open_drain connect_assert_srst
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 8000 kHz
adapter_nsrst_delay: 100
Info : clock speed 8000 kHz
Info : STLINK v2 JTAG v34 API v2 SWIM v7 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.129153
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : STM32F103C8Tx.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000c50 msp: 0x20005000
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
Info : Stlink adapter speed set to 4000 kHz
Info : Unable to match requested speed 8000 kHz, using 4000 kHz
adapter speed: 4000 kHz
** Programming Started **
auto erase enabled
Info : device id = 0x20036410
Info : flash size = 64kbytes
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 4096 bytes from file Debug/blue_piull.elf in 0.264664s (15.114 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
verified 3404 bytes in 0.072038s (46.145 KiB/s)
** Verified OK **
** Resetting Target **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20005000
shutdown command invoked
A questo punto si preme nuovamente il tasto reset per mandare in esecuzione il programma
martedì 13 agosto 2019
CubeMX e SW4STM32 AC6
Per creare un progetto STM32 si parte da CubeMX con New Project e selezionando la scheda di sviluppo
e' piu' comodo usare il tab board selector al posto di MCU/MPU selector
Se la scheda e' ancora stato scaricato il pacchetto di configurazione della scheda il software effettua il download. Una volta scaricato il pacchetto nel repository di CubeMX saranno presenti anche degli esempi per l'utilizzo della scheda
Per esempio su Windows il repository si trova in
C:\Users\PC\STM32Cube\Repository\
mentre gli esempi sono nelle sottodirectory ordinate per classe di scheda
C:\Users\PC\STM32Cube\Repository\STM32Cube_FW_F7_V1.15.0\Projects\STM32746G-Discovery\Examples
Gli esempi vengono presentati in diverse directory a seconda dell'IDE (quindi usando AC6 si usera' la directory SW4STM32)
Prima di premere il pulsante Generate Code si deve selezionare Toolchain/IDE a SW4STM32
successivamente si deve copiare il percorso della Project Location
A questo punto si puo' aprire SW4STM32 e aprire il progetto da Open File from File System selezionando la directory
In SW4STM32 si possono importare anche librerie in C standard. Nel progetto basta trascinare i file nel ramo del progetto e poi settare la nuova path nelle proprieta' del progetto (nel caso di esempio mini-gmp, una versione ridotta di GMPLib)...ovviamente se si vogliono importare librerie binarie queste devono essere gia' compilate per ARM
lunedì 4 marzo 2019
Mongoose OS ed ESP-Wroom-32
Un paio di indicazioni:
1) Mongoose OS non e' legato a MongoDB e Node.JS...maledetta fantasia nel mettere i nomi
2) in estrema sintesi Mongoose OS e' molto simile al cloud di Particle con la differenza che quest'ultimo e' legato a doppio filo con l'hardware di Particle (Electron, Photon) mentre Mongoose OS puo' essere usato con hardware ESP32 ed STM32
Per inziare ho scaricato il pacchetto generico per Linux
curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash mos
mos clone https://github.com/mongoose-os-apps/demo-js app1
mos wifi WIFI_NETWORK_NAME WIFI_PASSWORD
Una volta ottenuta la connessione si rete si puo' impostare la connessione al cloud.Ci si collega a https://dash.mongoose-os.com/ e si crea un nuovo dispositivo (con il profilo gratuito se ne possono creare fino a 3)
mos config-set dash.enable=true dash.token=xxxxxxxxdc08
1) Mongoose OS non e' legato a MongoDB e Node.JS...maledetta fantasia nel mettere i nomi
2) in estrema sintesi Mongoose OS e' molto simile al cloud di Particle con la differenza che quest'ultimo e' legato a doppio filo con l'hardware di Particle (Electron, Photon) mentre Mongoose OS puo' essere usato con hardware ESP32 ed STM32
Per inziare ho scaricato il pacchetto generico per Linux
curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash mos
e si lancia il programma in $HOME/.mos/bin/mos
si aprira' il browser di default all'indirizzo http://127.0.0.1:1992/
Le istruzioni dicono di premere CTRL+N per creare una nuova app ma su Chrome per Linux questa combinazione apre una nuova scheda del browser. Si puo' pero' usare la barra in basso allo schermo (vicino all'icona arancione che si trova nell'angolo in basso a destra) per digitare
a seguire (la compilazione avviente completamente sul cloud...i risultati saranno nella sottodirectory build)
mos build
mos flash
Per avere la possibilita' di interagire in remoto ed effettuare anche degli OTA update (Over the air) si puo' configurare la connessione con l'access point con
si copia il token (basta andare sopra al token) e da http://127.0.0.1:1992/ si digita
se tutto e' andato bene il dispositivo comparira' on line nel cloud
Dall'interfaccia Web si puo' impostare il comando remoto tramite Mobile (si tratta di un link)
Si puo' accendere o spengere una porta digitale. Con il modulo ESP-Wroom-32 il pin preimpostato e' il numero 13 (IO13 a destra di GND)
La programmazione successiva puo' avvenire mediante C o Javascript. In generale, leggendo anche il forum, si tratta di un progetto piuttosto immaturo con un supporto ancora scarso con l'hardware (nonostante sia comunque presente la possibilita' di convertire le librerie Arduino nei progetti Mongoose)
Dall'interfaccia Web si puo' impostare il comando remoto tramite Mobile (si tratta di un link)
Si puo' accendere o spengere una porta digitale. Con il modulo ESP-Wroom-32 il pin preimpostato e' il numero 13 (IO13 a destra di GND)
La programmazione successiva puo' avvenire mediante C o Javascript. In generale, leggendo anche il forum, si tratta di un progetto piuttosto immaturo con un supporto ancora scarso con l'hardware (nonostante sia comunque presente la possibilita' di convertire le librerie Arduino nei progetti Mongoose)
giovedì 28 febbraio 2019
AC6 System Workbench per Debian 9
ed alla fine sono riuscito ad avere una IDE per STM32 funzionante su Debian 9
Per l'installazione l'utente deve poter essere nei sudoers
Il problema era piuttosto semplice alla fine e viene dopo l'installazione. Una volta installato System Workbench con l'installer la compilazione del programma funziona in modo corretto ma viene generato un errore da GDB
la soluzione e' installare libncurses e creare un link simbolico tra la versione 6 32bit e la versione 5 (non disponibile nel repository...basta il symlink)
root@debian:/usr/lib/i386-linux-gnu# ln -s libncurses.so.6 libncurses.so.5
Per l'installazione l'utente deve poter essere nei sudoers
Il problema era piuttosto semplice alla fine e viene dopo l'installazione. Una volta installato System Workbench con l'installer la compilazione del programma funziona in modo corretto ma viene generato un errore da GDB
la soluzione e' installare libncurses e creare un link simbolico tra la versione 6 32bit e la versione 5 (non disponibile nel repository...basta il symlink)
root@debian:/usr/lib/i386-linux-gnu# ln -s libncurses.so.6 libncurses.so.5
User Button su STM32 Nucleo 64 con AC6 System Workbench
Ripartendo da questo post qui si studia l'interazione con lo User Button della STM32F446RE
Se l'utente preme lo User Button viene cambiato lo stato del led LD2
-------------------------------------------------------------
while (1)
{
if (!HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) {
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
-------------------------------------------------------------
Se l'utente preme lo User Button viene cambiato lo stato del led LD2
-------------------------------------------------------------
while (1)
{
if (!HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) {
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
-------------------------------------------------------------
mercoledì 27 febbraio 2019
Blink Led su STM32 Nucleo 64 con AC6 System Workbench
Non riuscendo ad installare una IDE funzionante su Linux sono passato a Windows e le cose sono migliorate (anche se non e' una passeggiata)
In questo esempio viene mostrato come lanciare un programma per far lampeggiare il led su una scheda STM32F446RE Nucleo 64 utilizzando STM32CubeMX per impostare il progetto di base, AC6 SystemWorkbench per compilare e debuggare il codice
Si installa la IDE AC6 System Workbench con la toolchain GCC da http://www.openstm32.org/HomePage. Si tratta di una versione di Eclipse con i plugin gia' installati e con GCC, GDB per Arm ed i driver STLink inclusi
In seguito si crea un nuovo progetto in STM32CubeMX
Si seleziona Start my project from STBoard, nella finestra di ricerca si digita Nucleo e si seleziona NUCLEO-F446RE. Nel caso in cui il firmware della scheda non sia mai utilizzato si dovra' scaricare (e' un pacchetto corposo)
Si fa doppio clic sulla foto della scheda e si risponde yes ad Initialize all peripherals.
Si va in Project Manager, si sceglie un nome per il progetto e nella ToolChain/IDE si indica SW4STM32.
Si apre in progetto e nel ciclo while (1) riga 99 si inserisce il codice. I progetti creati con STNM32CubeMX sono generati con le librerie HAL (un layer di astrazione sull'hardware...ci sono commenti discordanti sull'utilizzo di questo sistema)
---------------------------------------------------------
while (1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
---------------------------------------------------------
da STM32CubeMX si vede che la porta GPIO a cui e' collegato al porta denominata LD2_GPIO con il nome del pin denominato LD2_Pin
Il comando TooglePin cambia semplicemente lo stato del Pin (se e' attivo lo disattiva e l'ovvio contrario)
Si fa collega la scheda alla porta USB ed abbbiamo il programma in funzione, L'aspetto piu' interessante e' il fatto di poter eseguire un debug step by step del codice
Per concludere segnalo che il codice di base di STM32CubeMX abilita la porta seriale UART2. Per inviare messaggi sulla porta seriale via USB e' sufficiente
---------------------------------------------------------
char *msg = "Test\n\r";
In questo esempio viene mostrato come lanciare un programma per far lampeggiare il led su una scheda STM32F446RE Nucleo 64 utilizzando STM32CubeMX per impostare il progetto di base, AC6 SystemWorkbench per compilare e debuggare il codice
Si installa la IDE AC6 System Workbench con la toolchain GCC da http://www.openstm32.org/HomePage. Si tratta di una versione di Eclipse con i plugin gia' installati e con GCC, GDB per Arm ed i driver STLink inclusi
In seguito si crea un nuovo progetto in STM32CubeMX
Si seleziona Start my project from STBoard, nella finestra di ricerca si digita Nucleo e si seleziona NUCLEO-F446RE. Nel caso in cui il firmware della scheda non sia mai utilizzato si dovra' scaricare (e' un pacchetto corposo)
Si fa doppio clic sulla foto della scheda e si risponde yes ad Initialize all peripherals.
Si va in Project Manager, si sceglie un nome per il progetto e nella ToolChain/IDE si indica SW4STM32.
Si apre in progetto e nel ciclo while (1) riga 99 si inserisce il codice. I progetti creati con STNM32CubeMX sono generati con le librerie HAL (un layer di astrazione sull'hardware...ci sono commenti discordanti sull'utilizzo di questo sistema)
---------------------------------------------------------
while (1)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
---------------------------------------------------------
da STM32CubeMX si vede che la porta GPIO a cui e' collegato al porta denominata LD2_GPIO con il nome del pin denominato LD2_Pin
Il comando TooglePin cambia semplicemente lo stato del Pin (se e' attivo lo disattiva e l'ovvio contrario)
Si fa collega la scheda alla porta USB ed abbbiamo il programma in funzione, L'aspetto piu' interessante e' il fatto di poter eseguire un debug step by step del codice
Per concludere segnalo che il codice di base di STM32CubeMX abilita la porta seriale UART2. Per inviare messaggi sulla porta seriale via USB e' sufficiente
---------------------------------------------------------
char *msg = "Test\n\r";
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 0xFFFF);
---------------------------------------------------------
I parametri sono di default 115200 8N1 ma si possono modificare nella funzione MX_USART2_UART_Init contenuta in main.c
lunedì 18 febbraio 2019
Ambiente di sviluppo STM32 su Debian
Si scarica il pacchetto principale da
git clone https://github.com/ve3wwg/stm32f103c8t6.git
e lo si scompatta nella directory stm32
poi si scarica libopncm3
git clone https://github.com/libopencm3/libopencm3.git
e si scompatta nella sottodirectory /libopnmc3 di /stm32
apt-get install build-essential libgtk-3-dev libusb-1.0-0-dev cmake gcc-arm-none-eabi gdb-arm-none-eabi
si puo' quindi lanciare la compilazione andando in /stm32 e digitando
make
-------------------------------------
modifica : in Debian esiste il pacchetto stlink-tools
-------------------------------------
non e' ancora finita perche' Debian non ha nei repository i tool st-flash ed st-info e si devono compilare da sorgenti partendo da https://github.com/texane/stlink. Si scompatta lo zip e lo si mette in /stm32/stlink e si seguono le istruzioni da https://github.com/texane/stlink/blob/master/doc/compiling.md
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...