STM32-407 DIY-MORE

Da raspibo.
Jump to navigation Jump to search
STM32-407 DIY-MORE.png

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 collegarla al computer via USB. In un sistema GNU/Linux sarà possibile verificare che la scheda sia effettivamente in modalità DFU con il comando:

$ 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 (o addirittura sh) 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