venerdì 1 marzo 2019

Toolchain per ESP32 su Linux

Post per impostare l'ambiente di sviluppo esp32-idf su Debian 9



si installano i pacchetti

apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future python-pyparsing

e successivamente
mkdir esp
cd ~/esp 
git clone -b v3.1.3 --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
export IDF_PATH=~/esp/esp-idf 

si scarica il compilatore e lo si decomprime

tar -xzf ~/Downloads/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
si inserisce l'ambiente di sviluppo in Path

export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
se tutto e' andato bene si puo' andare in $HOME/esp/esp-idf/examples/get-started/hello_world e digitare make per vedere se il progetto si compila (viene generato il bootloader all'indirizzo 0x10000 oltre al programma vero e proprio all'inidirizzo 0x8000). Al termine si puo' digitare

make flash 

per copiarlo sulla scheda (questi i messaggi)

-----------------------------------------
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000 )...
esptool.py v2.6
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32D0WDQ6 (revision 0)
Features: WiFi, BT, Dual Core, Coding Scheme None
MAC: 24:0a:c4:05:df:5c
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 21184 bytes to 12506...
Wrote 21184 bytes (12506 compressed) at 0x00001000 in 1.1 seconds (effective 153.7 kbit/s)...
Hash of data verified.
Compressed 144080 bytes to 68379...
Wrote 144080 bytes (68379 compressed) at 0x00010000 in 6.0 seconds (effective 190.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 1843.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
---------------------------------------------------

Collegandosi con minicom alla /dev/ttyUSB0 si ottengono le seguenti stringhe
---------------------------------------------------
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)                          
configsip: 0, SPIWP:0xee                                                        
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00         
mode:DIO, clock div:2                                                           
load:0x3fff0018,len:4                                                           
load:0x3fff001c,len:5804                                                        
load:0x40078000,len:9188                                                        
load:0x40080000,len:6084                                                        
entry 0x4008032c                                                                
I (29) boot: ESP-IDF v3.1.3 2nd stage bootloader                                
I (29) boot: compile time 11:25:47                                              
I (29) boot: Enabling RNG early entropy source...                               
I (34) boot: SPI Speed      : 40MHz                                             
I (38) boot: SPI Mode       : DIO                                               
I (42) boot: SPI Flash Size : 4MB                                               
I (46) boot: Partition Table:                                                   
I (49) boot: ## Label            Usage          Type ST Offset   Length         
I (57) boot:  0 nvs              WiFi data        01 02 00009000 00006000       
I (64) boot:  1 phy_init         RF data          01 01 0000f000 00001000       
I (72) boot:  2 factory          factory app      00 00 00010000 00100000       
I (79) boot: End of partition table                                             
I (83) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x07180 ( 2p
I (102) esp_image: segment 1: paddr=0x000171a8 vaddr=0x3ffb0000 size=0x022a0 ( d
I (106) esp_image: segment 2: paddr=0x00019450 vaddr=0x40080000 size=0x00400 ( d
I (110) esp_image: segment 3: paddr=0x00019858 vaddr=0x40080400 size=0x067b8 ( d
I (130) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11150 ( p
I (155) esp_image: segment 5: paddr=0x00031170 vaddr=0x40086bb8 size=0x02130 ( d
I (164) boot: Loaded app from partition at offset 0x10000                       
I (164) boot: Disabling RNG early entropy source...                             
I (166) cpu_start: Pro cpu up.                                                  
I (170) cpu_start: Starting app cpu, entry point is 0x40080e74                  
I (162) cpu_start: App cpu up.                                                  
I (181) heap_init: Initializing. RAM available for dynamic allocation:          
I (187) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM                       
I (193) heap_init: At 3FFB32F8 len 0002CD08 (179 KiB): DRAM                     
I (200) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM                    
I (206) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM                   
I (213) heap_init: At 40088CE8 len 00017318 (92 KiB): IRAM                      
I (219) cpu_start: Pro cpu start user code                                      
I (237) cpu_start: Starting scheduler on PRO CPU.                               
I (0) cpu_start: Starting scheduler on APP CPU.                                 
Hello world!                                                                    
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 4MB exterh
Restarting in 10 seconds...                                                     
Restarting in 9 seconds...                                                      
Restarting in 8 seconds...                                                      
Restarting in 7 seconds...                                                      
Restarting in 6 seconds...                                                      
Restarting in 5 seconds...                                                      
Restarting in 4 seconds...                                                      
Restarting in 3 seconds...                                                      
Restarting in 2 seconds...                                                      
Restarting in 1 seconds...                                                      
Restarting in 0 seconds...                                                      
Restarting now.

-------------------------------------------------------
Questo comportamento e' coerente con il programma hello_world.c

---------------------------------------------
/* Hello World Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"


void app_main()
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    printf("silicon revision %d, ", chip_info.revision);

    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}
------------------------------------------------------

In conclusione l'ambiente di sviluppo e' funzionante

Calcolo durata batteria per mini progetti

Fino ad oggi calcolavo la durata teorica di funzionamento di un utilizzatore (tipicamente una Arduino) connesso ad una batteria LiPo dividendo i mAh della batteria per il consumo in ampere dell'utilizzatore



Per esempio: con una batteria da 2500 mAh ed una Arduino Uno in configurazione base con consumo da 45 mA stimavo il tempo di funzionamento in 2500 mAh/45 mA cioe' circa 55 ora

In realta' il calcolo e' sbagliato perche' si deve tenere conto della potenza in Watt (o meglio si deve tenere in conto della potenza nel caso in cui il voltaggio della batteria e dell'utilizzatore sono identici ....ma questo e' un caso particolare)

Prendendo l'esempio precedente una batteria LiPo da 2500 mAh con un 3.7 ha un potenza di 9.25 Wh, La Arduino Uno ha un consumo di circa 45mA a 5 V pèari a 0.225 W. Dividendo 9.25 Wh per 0.225 h si ottiene che il tempo di funzionamento di circa 41 ore (valore sensibilmente differente dal calcolo, errato, precedente)

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






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 */
  }
-------------------------------------------------------------

mercoledì 27 febbraio 2019

Raspberry e Windows 10

E' di qualche giorno fa la notizia di poter installare Windows 10 (versione ARM) su Raspberry...in realta' gia' qualche anno fa Microsoft aveva rilasciato una versione di Windows per Raspeberry ma si trattava di una versione priva di desktop ed indirizzata all'IoT



Il progetto si trova a questo indirizzo http://jhanc.altervista.org/jargon/Intro.html ma diciamo che le cose sono partite subito un po' male ...l'installer non voleva saperne di funzionare


Dopo un po' di lettura del forum degli sviluppatori in cui venivano descritti errori e rimedi l'installazione e' andata a buon fine




ma il problema principale e' che la Raspberry con il solo desktop di Windows 10 e' sempre in picco con il processore sopra al 90% se non al 100%. Il sistema quindi non risponde ai comandi (se non molto lentamente). Non oso pensare quando l'utente inizia a fare girare un applicativo


In conclusione un progetto interessante ma piu' una curiosita' che non uno strumento da utilizzare 

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";
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

martedì 26 febbraio 2019

MBed IDE per STM32 Nucleo STM32F446RET6

Lo ammetto, per ora non sono riuscito ad installare una IDE locale per sviluppare su STM32 su Linux. Sono arrivato a compilare il codice con AC6 System  Workbench ma non riesco a fare il debug per problemi con libopencm3 ed il server stlink



Usando l'IDE online per MbedOS le cose sono decisamente piu' lineari anche perche' il codice e' astratto dall'hardware

Per iniziare il progetto si deve prima selezionare l'hardware in uso



Successivamente si puo' usare un codice di esempio oppure scrivere da zero


Al momento della compilazione viene scaricato un file .bin

Per caricare il file .bin sulla scheda si usa il software StLink traminte il comando

st-flash write programma.bin 0x8000000

La scheda che ho usato (la STM32F446RET6) ha un ST-LINKV2  debugger integrato per cui e' sufficiente collegare la  porta USB

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...