stm32/boards/WEACT_F411_BLACKPILL: Add WeAct F411 'blackpill' boards.
Adds board profile for the WeAct F411 'blackpill' which is a quite popular low cost ST dev board. This board also has optional spiflash so can be purchased in a few different configurations. Builds for v3.1 with no SPI Flash by default. Includes variants for different board versions and spi flash sizes. Signed-off-by: Andrew Leech <andrew@alelec.net>
This commit is contained in:
parent
a9945fc528
commit
22804fccf3
12 changed files with 345 additions and 0 deletions
55
ports/stm32/boards/WEACT_F411_BLACKPILL/README.md
Normal file
55
ports/stm32/boards/WEACT_F411_BLACKPILL/README.md
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
WeAct F411 'blackpill'
|
||||
======================
|
||||
|
||||
The WeAct F411 blackpill board comes in a number of versions and variants.
|
||||
All have a footprint for a SPI flash chip on the back, though the board is
|
||||
often sold without any flash chip loaded.
|
||||
|
||||
At the time of writing (Sep 2024) v3.1 is the current version.
|
||||
This version is sold with both 25Mhz HSE crystal (same as previous versions) and also
|
||||
with a 8Mhz crystal. The end user should be careful to confirm which variant is
|
||||
purchased and/or read the markings on the crystal to know which variant build to load.
|
||||
|
||||
The previous v2.0 boards had changed the MCU pinout for the spi flash chip so requires
|
||||
soft-spi support enabled in the variant settings, unlike v3.1 or v1.3 which is
|
||||
compatible with the hardware spi peripheral.
|
||||
|
||||
The original v1.3 boards did not include a user switch on the top, it only has
|
||||
"BOOT0" and "NRST" switches to load bootloader and reset the board respectively.
|
||||
|
||||
For more information see: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1
|
||||
|
||||
Note: The pins used by features like spiflash and USB are also broken out to the
|
||||
gpio headers on the sides of the board.
|
||||
If these peripherals / features are enabled then these external pins must be avoided to ensure
|
||||
there are no conflicts. [pins.csv](pins.csv) should be consulted to check all pins assigned
|
||||
to alternate functions on the board.
|
||||
|
||||
Customising the build
|
||||
---------------------
|
||||
|
||||
After purchasing a board without any spiflash chip loaded the user can solder on
|
||||
their own of any desired size. Most brands of spiflash in SO8 pinout are compatible
|
||||
however some do have a slightly different protocol so may not work out of the box
|
||||
with micropython. Brand compatibility is outide the scope of this doc.
|
||||
|
||||
Once a custom spiflash chip has been loaded onto the board micropython should
|
||||
be built with the flash size specified. After doing so the spiflash chip will
|
||||
be used for the FAT/LFS main filesystem.
|
||||
|
||||
Examples:
|
||||
|
||||
For a v3.1 / 25Mhz (default version) board with 16MiB flash chip loaded:
|
||||
``` bash
|
||||
make -C ports/stm32 BOARD=WEACT_F411_BLACKPILL SPI_FLASH_SIZE_MB=16
|
||||
```
|
||||
|
||||
For a v3.1 / 8Mhz board with 4MiB flash chip loaded:
|
||||
``` bash
|
||||
make -C ports/stm32 BOARD=WEACT_F411_BLACKPILL BOARD_VARIANT=V31_XTAL_8M SPI_FLASH_SIZE_MB=4
|
||||
```
|
||||
|
||||
For a v1.3 board with 2MiB flash chip loaded and XTAL manually replaced with 8Mhz:
|
||||
``` bash
|
||||
make -C ports/stm32 BOARD=WEACT_F411_BLACKPILL BOARD_VARIANT=V13 SPI_FLASH_SIZE_MB=2 XTAL_FREQ_MHZ=8
|
||||
```
|
||||
45
ports/stm32/boards/WEACT_F411_BLACKPILL/bdev.c
Normal file
45
ports/stm32/boards/WEACT_F411_BLACKPILL/bdev.c
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
#include "storage.h"
|
||||
#include "spi.h"
|
||||
#include "py/mpconfig.h"
|
||||
|
||||
#if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
|
||||
|
||||
#if WEACT_F411_V20
|
||||
// External SPI flash uses SPI interface, but not on all HW spi pins.
|
||||
static const mp_soft_spi_obj_t spi_bus = {
|
||||
.delay_half = MICROPY_HW_SOFTSPI_MIN_DELAY,
|
||||
.polarity = 0,
|
||||
.phase = 0,
|
||||
.sck = MICROPY_HW_SPIFLASH_SCK,
|
||||
.mosi = MICROPY_HW_SPIFLASH_MOSI,
|
||||
.miso = MICROPY_HW_SPIFLASH_MISO,
|
||||
};
|
||||
|
||||
#else // WEACT_F411_V1.3 or WEACT_F411_V3.1
|
||||
static const spi_proto_cfg_t spi_bus = {
|
||||
.spi = &spi_obj[0], // SPI1
|
||||
.baudrate = 25000000,
|
||||
.polarity = 0,
|
||||
.phase = 0,
|
||||
.bits = 8,
|
||||
.firstbit = SPI_FIRSTBIT_MSB,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
|
||||
static mp_spiflash_cache_t spi_bdev_cache;
|
||||
#endif
|
||||
|
||||
const mp_spiflash_config_t spiflash_config = {
|
||||
.bus_kind = MP_SPIFLASH_BUS_SPI,
|
||||
.bus.u_spi.cs = MICROPY_HW_SPIFLASH_CS,
|
||||
.bus.u_spi.data = (void *)&spi_bus,
|
||||
.bus.u_spi.proto = &spi_proto,
|
||||
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
|
||||
.cache = &spi_bdev_cache,
|
||||
#endif
|
||||
};
|
||||
|
||||
spi_bdev_t spi_bdev;
|
||||
|
||||
#endif
|
||||
22
ports/stm32/boards/WEACT_F411_BLACKPILL/board.json
Normal file
22
ports/stm32/boards/WEACT_F411_BLACKPILL/board.json
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"deploy": [
|
||||
"../PYBV10/deploy.md"
|
||||
],
|
||||
"docs": "",
|
||||
"features": [],
|
||||
"images": [
|
||||
"WEACTV20_F411.jpg"
|
||||
],
|
||||
"mcu": "stm32f411",
|
||||
"product": "WeAct F411 'blackpill'. Default variant is v3.1 with no SPI Flash.",
|
||||
"thumbnail": "",
|
||||
"url": "https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1",
|
||||
"variants": {
|
||||
"V13": "v1.3 board with no SPI Flash",
|
||||
"V13_FLASH_4M": "v1.3 board with 4MB SPI Flash",
|
||||
"V20_FLASH_4M": "v2.0 board with 4MB SPI Flash",
|
||||
"V31_FLASH_8M": "v3.1 board with 8MB SPI Flash",
|
||||
"V31_XTAL_8M": "v3.1 board with 8MHz crystal"
|
||||
},
|
||||
"vendor": "WeAct Studio"
|
||||
}
|
||||
112
ports/stm32/boards/WEACT_F411_BLACKPILL/mpconfigboard.h
Normal file
112
ports/stm32/boards/WEACT_F411_BLACKPILL/mpconfigboard.h
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
// based off the following two repositories:
|
||||
// * https://github.com/mcauser/WEACT_F411CEU6
|
||||
// * https://github.com/YXZhu/micropython
|
||||
|
||||
#define MICROPY_HW_BOARD_NAME "WEACT_F411_BLACKPILL"
|
||||
#define MICROPY_HW_MCU_NAME "STM32F411CE"
|
||||
#define MICROPY_HW_FLASH_FS_LABEL "WEACT_F411_BLACKPILL"
|
||||
|
||||
// some users having issues with FLASH_LATENCY_2, so set to 3
|
||||
// from https://forum.micropython.org/viewtopic.php?t=7154
|
||||
#define MICROPY_HW_FLASH_LATENCY FLASH_LATENCY_3
|
||||
|
||||
#define MICROPY_HW_HAS_FLASH (1)
|
||||
#define MICROPY_HW_ENABLE_RTC (1)
|
||||
#define MICROPY_HW_ENABLE_USB (1)
|
||||
#define MICROPY_HW_USB_FS (1)
|
||||
|
||||
// Switch
|
||||
#if WEACT_F411_V13
|
||||
#define MICROPY_HW_HAS_SWITCH (0)
|
||||
#else
|
||||
#define MICROPY_HW_HAS_SWITCH (1)
|
||||
#define MICROPY_HW_USRSW_PIN (pyb_pin_SW)
|
||||
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
|
||||
#define MICROPY_HW_USRSW_EXTI_MODE (GPIO_MODE_IT_FALLING)
|
||||
#define MICROPY_HW_USRSW_PRESSED (0)
|
||||
#endif
|
||||
|
||||
// LEDs
|
||||
#define MICROPY_HW_LED1 (pyb_pin_LED_BLUE)
|
||||
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
|
||||
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
|
||||
|
||||
// RTC
|
||||
#define MICROPY_HW_RTC_USE_LSE (1)
|
||||
#define MICROPY_HW_RTC_USE_US (0)
|
||||
#define MICROPY_HW_RTC_USE_CALOUT (1)
|
||||
|
||||
// Set PLLM same as HSE in MHZ.
|
||||
#define MICROPY_HW_CLK_PLLM (MICROPY_HW_HSE_SPEED_MHZ)
|
||||
// Configure PLL for final CPU freq of 96MHz
|
||||
#define MICROPY_HW_CLK_PLLN (192)
|
||||
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
|
||||
#define MICROPY_HW_CLK_PLLQ (4)
|
||||
|
||||
// UART config
|
||||
#define MICROPY_HW_UART1_TX (pin_A9)
|
||||
#define MICROPY_HW_UART1_RX (pin_A10)
|
||||
|
||||
#define MICROPY_HW_UART2_TX (pin_A2)
|
||||
#define MICROPY_HW_UART2_RX (pin_A3)
|
||||
|
||||
#define MICROPY_HW_UART_REPL (PYB_UART_1)
|
||||
#define MICROPY_HW_UART_REPL_BAUD (115200)
|
||||
|
||||
// I2C bus
|
||||
#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_B9)
|
||||
#define MICROPY_HW_I2C3_SCL (pin_A8)
|
||||
#define MICROPY_HW_I2C3_SDA (pin_B8)
|
||||
|
||||
// SPI bus
|
||||
// SPI 1 is generally used for the SPI flash if enabled below.
|
||||
#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)
|
||||
|
||||
// SPI 3 is not accessible if SPI flash module is used on V2.0 (PB4 conflict)
|
||||
#define MICROPY_HW_SPI3_NSS (pin_A15)
|
||||
#define MICROPY_HW_SPI3_SCK (pin_B3)
|
||||
#define MICROPY_HW_SPI3_MISO (pin_B4)
|
||||
#define MICROPY_HW_SPI3_MOSI (pin_B5)
|
||||
|
||||
// External SPI Flash configuration
|
||||
|
||||
#if !MICROPY_HW_SPIFLASH_SIZE_BYTES
|
||||
// Use internal filesystem if spiflash not enabled.
|
||||
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (1)
|
||||
|
||||
#else
|
||||
// Disable internal filesystem to use spiflash.
|
||||
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)
|
||||
|
||||
// SPI flash pins
|
||||
#define MICROPY_HW_SPIFLASH_CS (pyb_pin_FLASH_CS)
|
||||
#define MICROPY_HW_SPIFLASH_SCK (pyb_pin_FLASH_SCK)
|
||||
#define MICROPY_HW_SPIFLASH_MOSI (pyb_pin_FLASH_MOSI)
|
||||
#if WEACT_F411_V13
|
||||
#define MICROPY_HW_SPIFLASH_MISO (pyb_pin_FLASH_MISO_V13)
|
||||
#elif WEACT_F411_V20
|
||||
#define MICROPY_HW_SPIFLASH_MISO (pyb_pin_FLASH_MISO_V20)
|
||||
#else
|
||||
#define MICROPY_HW_SPIFLASH_MISO (pyb_pin_FLASH_MISO_V31)
|
||||
#endif
|
||||
|
||||
extern const struct _mp_spiflash_config_t spiflash_config;
|
||||
extern struct _spi_bdev_t spi_bdev;
|
||||
#define MICROPY_HW_SPIFLASH_ENABLE_CACHE (1)
|
||||
#define MICROPY_HW_BDEV_SPIFLASH (&spi_bdev)
|
||||
#define MICROPY_HW_BDEV_SPIFLASH_CONFIG (&spiflash_config)
|
||||
#define MICROPY_HW_BDEV_SPIFLASH_SIZE_BYTES (MICROPY_HW_SPIFLASH_SIZE_BITS / 8)
|
||||
#define MICROPY_HW_BDEV_SPIFLASH_EXTENDED (&spi_bdev) // for extended block protocol
|
||||
#define MICROPY_HW_SPIFLASH_SIZE_BITS (MICROPY_HW_SPIFLASH_SIZE_BYTES * 8)
|
||||
#endif
|
||||
38
ports/stm32/boards/WEACT_F411_BLACKPILL/mpconfigboard.mk
Normal file
38
ports/stm32/boards/WEACT_F411_BLACKPILL/mpconfigboard.mk
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
MCU_SERIES = f4
|
||||
CMSIS_MCU = STM32F411xE
|
||||
AF_FILE = boards/stm32f411_af.csv
|
||||
LD_FILES = boards/stm32f411.ld boards/common_ifs.ld
|
||||
TEXT0_ADDR = 0x08000000
|
||||
TEXT1_ADDR = 0x08020000
|
||||
|
||||
MICROPY_VFS_LFS2 = 1
|
||||
|
||||
# Settings for version, spi flash and HSE xtal.
|
||||
# These are used in variant configs and/or on make command line.
|
||||
# If provided on make command line the build folder name will be updated to match
|
||||
# When set in variant they're included after this file so the following ifdef blocks are ignored.
|
||||
|
||||
ifdef BOARD_VERSION
|
||||
BUILD := $(BUILD)_V$(BOARD_VERSION)
|
||||
endif
|
||||
|
||||
ifdef SPI_FLASH_SIZE_MB
|
||||
BUILD := $(BUILD)_FLASH_$(SPI_FLASH_SIZE_MB)M
|
||||
endif
|
||||
|
||||
ifdef XTAL_FREQ_MHZ
|
||||
BUILD := $(BUILD)_XTAL_$(XTAL_FREQ_MHZ)M
|
||||
endif
|
||||
|
||||
# Blackpill v3.1 board by default
|
||||
BOARD_VERSION ?= 31
|
||||
|
||||
# No flash chip in default build - use internal flash
|
||||
SPI_FLASH_SIZE_MB ?= 0
|
||||
|
||||
# 25Mhz HSE crystal by default.
|
||||
XTAL_FREQ_MHZ ?= 25
|
||||
|
||||
CFLAGS += -DWEACT_F411_V$(BOARD_VERSION)=1
|
||||
CFLAGS += -DMICROPY_HW_SPIFLASH_SIZE_BYTES="($(SPI_FLASH_SIZE_MB) * 1024 * 1024)"
|
||||
CFLAGS += -DMICROPY_HW_HSE_SPEED_MHZ="($(XTAL_FREQ_MHZ))"
|
||||
|
|
@ -0,0 +1 @@
|
|||
BOARD_VERSION = 13
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
BOARD_VERSION = 13
|
||||
SPI_FLASH_SIZE_MB = 4
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
BOARD_VERSION = 20
|
||||
SPI_FLASH_SIZE_MB = 4
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
BOARD_VERSION = 31
|
||||
SPI_FLASH_SIZE_MB = 8
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
BOARD_VERSION = 31
|
||||
XTAL_FREQ_MHZ = 8
|
||||
45
ports/stm32/boards/WEACT_F411_BLACKPILL/pins.csv
Normal file
45
ports/stm32/boards/WEACT_F411_BLACKPILL/pins.csv
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
,PA0
|
||||
,PA1
|
||||
,PA2
|
||||
,PA3
|
||||
,PA4
|
||||
,PA5
|
||||
,PA6
|
||||
,PA7
|
||||
,PA8
|
||||
,PA9
|
||||
,PA10
|
||||
,PA11
|
||||
,PA12
|
||||
,PA15
|
||||
,PB0
|
||||
,PB1
|
||||
,PB2
|
||||
,PB3
|
||||
,PB4
|
||||
,PB5
|
||||
,PB6
|
||||
,PB7
|
||||
,PB8
|
||||
,PB9
|
||||
,PB10
|
||||
,PB12
|
||||
,PB13
|
||||
,PB14
|
||||
,PB15
|
||||
,PC14
|
||||
,PC15
|
||||
LED_BLUE,PC13
|
||||
SW,PA0
|
||||
-SWDIO,PA13
|
||||
-SWCLK,PA14
|
||||
-OSC32_IN,PH0
|
||||
-OSC32_OUT,PH1
|
||||
-USB_DM,PA11
|
||||
-USB_DP,PA12
|
||||
-FLASH_CS,PA4
|
||||
-FLASH_SCK,PA5
|
||||
-FLASH_MOSI,PA7
|
||||
-FLASH_MISO_V13,PA6
|
||||
-FLASH_MISO_V20,PB4
|
||||
-FLASH_MISO_V31,PA6
|
||||
|
19
ports/stm32/boards/WEACT_F411_BLACKPILL/stm32f4xx_hal_conf.h
Normal file
19
ports/stm32/boards/WEACT_F411_BLACKPILL/stm32f4xx_hal_conf.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/* This file is part of the MicroPython project, http://micropython.org/
|
||||
* The MIT License (MIT)
|
||||
* Copyright (c) 2024 Andrew Leech
|
||||
*/
|
||||
#ifndef MICROPY_INCLUDED_STM32F4XX_HAL_CONF_H
|
||||
#define MICROPY_INCLUDED_STM32F4XX_HAL_CONF_H
|
||||
|
||||
#include "boards/stm32f4xx_hal_conf_base.h"
|
||||
|
||||
// Oscillator values in Hz
|
||||
#define HSE_VALUE (MICROPY_HW_HSE_SPEED_MHZ * 1000000)
|
||||
#define LSE_VALUE (32768)
|
||||
#define EXTERNAL_CLOCK_VALUE (12288000)
|
||||
|
||||
// Oscillator timeouts in ms
|
||||
#define HSE_STARTUP_TIMEOUT (100)
|
||||
#define LSE_STARTUP_TIMEOUT (5000)
|
||||
|
||||
#endif // MICROPY_INCLUDED_STM32F4XX_HAL_CONF_H
|
||||
Loading…
Reference in a new issue