STM32-407 DIY-MORE
Introduzione
La scheda “STM32-407” prodotta da “DIY MORE” è una "development board" oscura ed economica. Si può ordinare dalla Cina per pochi euro ma sono poche le informazioni che si possono trovare in rete. È una scheda piuttosto minimale e può essere considerata come una "breakout board" del microcontrollore STM32F407. Questo microcontrollore è abbastanza comune ed usato anche in altre schede, di conseguenza è possibile utilizzare la "STM32-407 DIY-MORE" con Micropython. Inoltre questa stessa scheda è anche supportata da Frosted.
La scheda
Oltre al microcontrollore stesso la scheda fornisce:
- una porta USB micro B;
- 2 pulsanti (uno di reset ed uno programmabile);
- 2 led (uno di accensione ed uno programmabile);
- 92 pin (inclusi quelli di alimentazione);
- svariati componenti accessori necessari al corretto funzionamento del microcontrollore.
Pulsanti
Il pulsante vicino la porta USB ha una funzione di "reset". L'altro pulsante invece è programmabile ed è configurato in "pull-up" al pin PD15 con una resistenza da 10kΩ.
LED
LED1, situato vicino la porta USB, è utilizzato per segnalare lo stato di alimentazione. LED2 è programmabile ed è collegato al pin PE0 da una resistenza da 1kΩ. Il pin abbassato equivale ad un LED acceso.
Boot pin
La scheda è provvista di due "boot pin" la cui configurazione all'accensione determina lo stato del microcontrollore. I pin si trovano in un angolo sul lato opposto rispetto alla porta USB e sono denominati "BOOT0" e "BOOT1". Entrambi sono in una configurazione normalmente "up" e sono adiacenti a dei pin collegati a massa. Pertanto si può facilmente controllare lo stato di questi pin per mezzo di un "jumper".
Come mostrato nella tabella in basso, sono tre le configurazioni utili che si possono ottenere dalle combinazioni degli stati dei due "boot pin":
- In modalità "Flash", assumendo che MicroPython sia correttamente installato, è possibile montare la memoria flash del microcontrollore via USB per copiare i file degli script da eseguire. Allo stesso tempo è anche possibile accedere alla "REPL" di MicroPython attraverso una porta seriale fornita dalla stessa porta USB (la quale utilizza i pin PA11 e PA12);
- In modalità DFU è possibile programmare il microcontrollore e caricare il firmware. Questa è la modalità che viene generalmente usata per caricare MicroPython nel microcontrollore;
- La modalità SRAM non l'ho mai usata ed onestamente non so a cosa serve.
Pin BOOT0 | Pin BOOT1 | Modalità |
Giù | Su/Giù | Flash |
Su | Giù | DFU |
Su | Su | SRAM |
ST-LINK
La scheda di per sé è priva di un dispositivo ST-LINK per la programmazione, ma un dispositivo di questo tipo può essere collegato utilizzando il seguente schema.
Pin della scheda | Pin ST-LINK |
PA13 | SWDIO |
PA14 | SWCLK |
3v3 | 3v3 |
GND | GND |
Pin degni di nota
I pin della scheda corrispondono ai pin del microcontrollore STM32F407. Si può consultare il datasheet del componente per conoscere le funzionalità speciali dei vari pin (UART, I2C, SPI, eccetera). Ad ogni modo bisogna tenere in considerazione alcune peculiarità dell'implementazione della scheda:
- PD15 è collegato in "pull-up" al pulsante.
- PE0 è collegato al LED2 (Pin abbassato equivale a LED acceso).
- PA11 e PA12 sono usati dalla porta USB. Sebbene corrispondano anche ai pin CTS ed RTS della UART1, è meglio non usarli se si vuole usare la porta USB.
- Altre informazioni sui pin possono essere lette nel file "mpconfigboard.h" riportato più in basso.
Micropython
Per utilizzare correttamente questa scheda è necessario compilare manualmente il codice di MicroPython. Inoltre è necessario impostare delle configurazioni ad-hoc per poter gestire in maniera corretta la mappatura dei "pin". Di seguito sono esposti i passaggi per compiere questa operazione su un sistema GNU/Linux. Si assume che il sistema del lettore sia già configurato per l'utilizzo di "git" e la "cross-compilazione".
Ottenere MicroPython
$ git clone "https://github.com/micropython/micropython.git" $ git submodule update --init
Aggiungere la configurazione per la scheda
$ cd micropython/ports/stm32/boards/ $ cp -R STM32F4DISC STM32F4DIYMORE $ cd STM32F4DIYMORE $ rm staccel.py
Sostituire il contenuto del file "mpconfigboard.h" con:
#define MICROPY_HW_BOARD_NAME "F4DIYMORE" #define MICROPY_HW_MCU_NAME "STM32F407" #define MICROPY_HW_HAS_SWITCH (1) #define MICROPY_HW_HAS_FLASH (1) #define MICROPY_HW_ENABLE_RNG (1) #define MICROPY_HW_ENABLE_RTC (1) #define MICROPY_HW_ENABLE_DAC (1) #define MICROPY_HW_ENABLE_USB (1) // HSE is 8MHz #define MICROPY_HW_CLK_PLLM (8) #define MICROPY_HW_CLK_PLLN (336) #define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2) #define MICROPY_HW_CLK_PLLQ (7) // UART config //PA11 and PA12 pins are used by USB //#define MICROPY_HW_UART1_TX (pin_A9) //#define MICROPY_HW_UART1_RX (pin_A10) //#define MICROPY_HW_UART1_RTS (pin_A12) //#define MICROPY_HW_UART1_CTS (pin_A11) #define MICROPY_HW_UART2_TX (pin_A2) #define MICROPY_HW_UART2_RX (pin_A3) #define MICROPY_HW_UART2_RTS (pin_A1) #define MICROPY_HW_UART2_CTS (pin_A0) #define MICROPY_HW_UART3_TX (pin_D8) #define MICROPY_HW_UART3_RX (pin_D9) #define MICROPY_HW_UART3_RTS (pin_D12) #define MICROPY_HW_UART3_CTS (pin_D11) //PA0 and PA1 pins are used by UART2 //#define MICROPY_HW_UART4_TX (pin_A0) //#define MICROPY_HW_UART4_RX (pin_A1) //I do not really need it //#define MICROPY_HW_UART6_TX (pin_C6) //#define MICROPY_HW_UART6_RX (pin_C7) // I2C busses #define MICROPY_HW_I2C1_SCL (pin_B6) #define MICROPY_HW_I2C1_SDA (pin_B7) #define MICROPY_HW_I2C2_SCL (pin_B10) #define MICROPY_HW_I2C2_SDA (pin_B11) // SPI busses #define MICROPY_HW_SPI1_NSS (pin_A4) #define MICROPY_HW_SPI1_SCK (pin_A5) #define MICROPY_HW_SPI1_MISO (pin_A6) #define MICROPY_HW_SPI1_MOSI (pin_A7) #define MICROPY_HW_SPI2_NSS (pin_B12) #define MICROPY_HW_SPI2_SCK (pin_B13) #define MICROPY_HW_SPI2_MISO (pin_B14) #define MICROPY_HW_SPI2_MOSI (pin_B15) // CAN busses //#define MICROPY_HW_CAN1_TX (pin_B9) //#define MICROPY_HW_CAN1_RX (pin_B8) //PB12 and PB13 pins are used by SPI2 //#define MICROPY_HW_CAN2_TX (pin_B13) //#define MICROPY_HW_CAN2_RX (pin_B12) // USRSW is pulled up. Pressing the button makes the input go low. #define MICROPY_HW_USRSW_PIN (pin_D15) #define MICROPY_HW_USRSW_PULL (GPIO_PULLUP) #define MICROPY_HW_USRSW_EXTI_MODE (GPIO_MODE_IT_FALLING) #define MICROPY_HW_USRSW_PRESSED (0) // LEDs #define MICROPY_HW_LED_INVERTED (1) // LEDs are on when pin is driven low #define MICROPY_HW_LED1 (pin_E0) #define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin)) #define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin)) // USB config #define MICROPY_HW_USB_FS (1) // Show IDLE on UART1 //#define MICROPY_HW_UART_REPL PYB_UART_1 //#define MICROPY_HW_UART_REPL_BAUD 115200
Sostituire il contenuto del file "pins.csv" con:
PA0,PA0 PA1,PA1 PA2,PA2 PA3,PA3 PA4,PA4 PA5,PA5 PA6,PA6 PA7,PA7 PA8,PA8 PA9,PA9 PA10,PA10 PA11,PA11 PA12,PA12 PA13,PA13 PA14,PA14 PA15,PA15 PB0,PB0 PB1,PB1 PB2,PB2 PB3,PB3 PB4,PB4 PB5,PB5 PB6,PB6 PB7,PB7 PB8,PB8 PB9,PB9 PB10,PB10 PB11,PB11 PB12,PB12 PB13,PB13 PB14,PB14 PB15,PB15 PC0,PC0 PC1,PC1 PC2,PC2 PC3,PC3 PC4,PC4 PC5,PC5 PC6,PC6 PC7,PC7 PC8,PC8 PC9,PC9 PC10,PC10 PC11,PC11 PC12,PC12 PC13,PC13 PD0,PD0 PD1,PD1 PD2,PD2 PD3,PD3 PD4,PD4 PD5,PD5 PD6,PD6 PD7,PD7 PD8,PD8 PD9,PD9 PD10,PD10 PD11,PD11 PD12,PD12 PD13,PD13 PD14,PD14 PD15,PD15 PE0,PE0 PE1,PE1 PE2,PE2 PE3,PE3 PE4,PE4 PE5,PE5 PE6,PE6 PE7,PE7 PE8,PE8 PE9,PE9 PE10,PE10 PE11,PE11 PE12,PE12 PE13,PE13 PE14,PE14 PE15,PE15 LED,PE0 SW,PD15
Compilare MicroPython
Per istruzioni di compilazione dettagliate si faccia riferimento al file:
micropython/ports/stm32/README.md
In breve, di seguito i comandi necessari per compilare MicroPython usando la configurazione esposta precedentemente.
$ cd micropython/ $ make -C mpy-cross $ cd micropython/ports/stm32/ $ make BOARD=STM32F4DIYMORE
Installare MicroPython
Per caricare il firmware sulla scheda impostarla in modalità "DFU" prima di accenderla. Poi collearla al computer via USB. In un sistema GNU/Linux sarà possibile verificare che la scheda sia effettivamente in modalità DFU con il comamndo:
$ lsusb Bus 002 Device 005: ID 0483:df11 STMicroelectronics STM Device in DFU Mode
Per caricare il firmware:
# apt install python3-usb $ make BOARD=STM32F4DIYMORE deploy
Se si dispone di un adattatore ST-LINK esterno (la scheda di per sé ne è sprovvista) questo si può utilizzare per la programmazione del firmware in alternativa alla modalità DFU. La corretta configurazione dei pin è stata già mostrata nella sezione dedicata all'hardware di questa pagina. Per quanto riguarda il versante software si faccia riferimento al file "README.md" di cui sopra.
Eseguire codice
Quando la scheda viene avviata in modalità "flash" (si veda la sezione "Boot pin") è possibile accedere al REPL di MicroPython attraverso una porta seriale fornita direttamente dalla porta USB.
$ screen /dev/ttyACM0 115200 MicroPython v1.10-194-g41e7ad647 on 2019-03-11; F4DIYMORE with STM32F407 Type "help()" for more information. >>>
Dalla stessa porta USB e con la scheda avviata con la stessa modalità è anche possibile accedere alla memoria flash del microcontrollore, dentro la quale si possono copiare i file ".py" da far eseguire a MicroPython.
$ pmount /dev/sdb1 $ ls /media/sdb1/ README.txt boot.py main.py pybcdc.inf
Frosted
Frosted è un sistema opertivo libero e conforme a POSIX per sistemi integrati. Può risultare interessante a chi preferirebbe programmare questa board usando C pittosto che Micropython. La conformità a POSIX rende il porting di applicazioni sulla piattaforma relativamente semplice. Frosted di suo fornisce anche MicroPython, il supporto però è limitato. La scheda "STM32-407 DIY-MORE" è supportata da Frosted e maggiori informazioni possono essere trovate nel relativo commit sul github del progetto.
Note finali
Si tenga presente che questa scheda è poco documentata e supportata. È molto economica rispetto alle alternative, ma non è detto che le procedure descritte in questa pagina funzioneranno correttamente nel presente o nel futuro. Tutto ciò che è stato scritto è frutto di sperimentazioni ed "hackeraggi" da considerare assolutamente inaffidabili.
Link e risorse utili
- DIY More STM32F407VGT6 ボード Pagina di un blog in giapponese che contiene alcune informazioni utili sulla scheda tra cui lo schema elettrico.
- Added support for STM32-F407 DIYMORE from diymore.cc Commit di supporto della scheda su Frosted.
- Compilare micropython per una scheda STM32Nucleo-F4 Guida sulla compilazione di MicroPython in italiano.