microPython在F407VE的移植
[toc]
在这里我们根据已有资源,针对3块不同的 STM32F407 开发版,做 microPython 的移植案例。
主要工作在不同开发板的晶振、脚位配置、SD卡或内部Flash等周边配置设定。
0. 关于 F407VE
F407VE 和PYBoard 用的 F405RG功能差异不大,F407VE V系列的脚位比R系列更多,还可连 TFT。
一般的开发板上不会有加速度计。有的开发板上有SPI Flash(一般只有2MB),可以直接当Python的文件系统用,不必额外插上 SD卡。这样除非应用的文件太大,足够使用了。
microPython 需要 SPI Flash 或 SD卡当程式存储,MCU上 512KB 的 flash只保留96k给文件系统,虽然也可用,但一下就满了。所以采购开发板时需要注意,有SPI Flash或有SD卡槽才方便使用。407VG的Flash为1MB,使用更充裕,就不用SPI Flash了,只是贵了些,淘宝供货的较少。
目前手上有多种不同的 407VE开发板,在此做简单的移植记录。
有的板卡可能晶振不准,很难进入USB – DFU模式烧录,尤其在用 MacBook Pro USB供电时很挑。一般主晶振用25MHz的比较不会出问题,若遇到问题可以尝试 :
- 接上 USB Hub 隔离。
- MacBook暂时不用外部电源,用电池电源烧录。
- 按着 Reset 多插拔USB几次。
STM32F407VET6 MCU资源:
- 主芯片 STM32F407VET6 规格:
- ARM Cortex M4
- 168MHz 系统时钟,1.8V-3.6V 工作电压
- 使用 8MHz、12MHz、 或 25MHz 系统晶振,和 32.768KHz RTC晶振
- 512 KB闪存,192KB + 4 KB SRAM
- 可调整的片上周边控制器有:
- 3个SPI,3个USART,2个UART,2个I2S,3个I2C
- 12个 通用计时器,2个高级计时器
- 3个 ADC(12位/ 16通道)
- 2个 DAC(12位)
- 1个USB 2.0 FS OTG(带专用DMA),外加PHY可扩充为 HS 模式
- 1个FSMC,1个SDIO,2个CAN 端口
- 1个 8 到 12 位并行摄像头接口
- 1个10/100 以太网MAC接口
1. BLACK_F407VE 的移植
https://github.com/mcauser/BLACK_F407VE

主板板引脚功能与布局
- JTAG(SWD)口、UART 口、nRF24L1(SPI)口、TFT口:

- 左侧排插:

- 右侧排插:

原理图:

板框图:

BLACK_F407VE 板上接口和器件
- 板上周边和接口:
- 1个 Micro SD 槽
- 1个 华邦 W25Q16 16Mbit(2M byte) SPI 闪存
- 1个 RTC电池CR1220
- 2个 用户LED D2(PA6)、用户LED D3(PA7)低电平有效
- 2个 用户按钮K0(PE4)和K1(PE3)
- 2根 Boot模式选择线
- 1个 重置按钮,1个 唤醒按钮(PA0 / WAKEUP)
- 两侧 2×24 双排针引出GPIO
- 下方 2×16 双排针 TFT 接口
- 1个 NRF24L01模块插座
注意使用到 PA6、PA7当 LED输出。我们用到的 频谱分析仪软件 Demo pin是 ‘X7’,也就是 ’PA5‘。要把它调到其他可当 ADC的 pin,会减少 LED引入的 Noise。
microPython 固件烧录
1. 配置编译固件
- 1 micropython git 下载
git clone https://github.com/micropython/micropython.git
cd micropython
git submodule update --init
- 2 将所用的开发板定义从 github 克隆到您的MicroPython 项目的
ports/stm32/boards文件夹中。
cd micropython/ports/stm32/boards
git clone https://github.com/mcauser/BLACK_F407VE.git
git clone https://github.com/mcauser/MCUDEV_DEVEBOX_F407VET6.git
git clone https://github.com/mcauser/MCUDEV_DEVEBOX_F407VGT6.git
git clone https://github.com/mcauser/WEACT_F411CEU6.git
#git clone https://github.com/WeActTC/WeAct_F411CE-MicroPython.git WeAct_F411CE
- 2 在
micropythonports/stm32/boards/BLACK_F407VE/mpconfigboard.h调整设定。
pico BLACK_F407VE/mpconfigboard.h
目前修改如下:
// 0. 命名和MCU选择
#define MICROPY_HW_BOARD_NAME "BLACK_F407VE"
#define MICROPY_HW_MCU_NAME "STM32F407VE"
#define MICROPY_HW_FLASH_FS_LABEL "BF407_"
...
// 1. MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE 设为0 使用SPI
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0) //cyue use SPI Flash
...
// 2. 在 #if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE 内添加:
#define MICROPY_HW_SPIFLASH_ENABLE_CACHE (1) //cyue add
/* cyue 增加启用 THREAD */
#define MICROPY_PY_THREAD (1)
...
/* cyue: 删除 Ethernet via RMII 支持,以使用足够的RAM
// Ethernet via RMII
#define MICROPY_HW_ETH_MDC (pin_C1)
#define MICROPY_HW_ETH_MDIO (pin_A2)
#define MICROPY_HW_ETH_RMII_REF_CLK (pin_A1)
#define MICROPY_HW_ETH_RMII_CRS_DV (pin_A7)
#define MICROPY_HW_ETH_RMII_RXD0 (pin_C4)
#define MICROPY_HW_ETH_RMII_RXD1 (pin_C5)
#define MICROPY_HW_ETH_RMII_TX_EN (pin_B11)
#define MICROPY_HW_ETH_RMII_TXD0 (pin_B12)
#define MICROPY_HW_ETH_RMII_TXD1 (pin_B13)
*/
- 3 参考 WeAct F411的 SPI flash,BLACK_F407VE/bdev.c 条件需要修改更完整,如下:
age.h"
#if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
// External SPI flash uses standard SPI interface
STATIC const mp_soft_spi_obj_t soft_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,
};
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE //cyue
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*)&soft_spi_bus,
.bus.u_spi.proto = &mp_soft_spi_proto,
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE //cyue
.cache = &spi_bdev_cache,
#endif
};
spi_bdev_t spi_bdev;
#endif
- 4 在BLACK_F407VE/mpconfigboard.mk 注释掉不用的网路Lib
MCU_SERIES = f4
CMSIS_MCU = STM32F407xx
AF_FILE = boards/stm32f405_af.csv
LD_FILES = boards/stm32f405.ld boards/common_ifs.ld
TEXT0_ADDR = 0x08000000
TEXT1_ADDR = 0x08020000
#MICROPY_PY_LWIP = 1
#MICROPY_PY_USSL = 1
#MICROPY_SSL_MBEDTLS = 1
- 5 再重新进入
micropython/ports/stm32/编译:
cd ..
make BOARD=BLACK_F407VE -j
2. 通过DFU烧录
可以使用DFU刷新该板。要将板置于DFU模式,请断开USB的连接,将BT0引脚连接到3V3将BOOT0设置为ON,然后重新连接USB。
现在,您可以使用USB使用以下命令来刷新板子:
make BOARD=BLACK_F407VE deploy
上传完成后,断开USB连接,将BT0引脚连接到GND,将BOOT0设置为OFF,然后重新连接USB。
或者,您可以使用MicroPython命令pyb.bootloader() 进入DFU模式,而无需使用该开关。
当前,您需要拔出并重新插入电路板,才能从DFU模式切换回常规模式。
3. 登录开发板 REPL
构建和部署后,您可以通过USB串行访问MicroPython REPL(Python提示)。
# macOS:
screen /dev/tty.usbmodem*
# Linux:
screen /dev/ttyACM0 115200
Windows下可用 putty 登录。
2. DevEBox_F407VE 的移植
DevEBox_F407VE 也是常用的板子,比较小巧。现有工程 MCUDEV_DEVEBOX_F407VGT6 用的是 F407VGT6,1MB flash的版本,一般容易买到 512K F407VE 版本。
我手上的两块 DevEBox_F407VE 和MacBook Pro的USB DFU 连接都不是很容易。MacBook不能插电,还要多插拔几次。一般模式没问题。
1. 比对现有工程
从 MCUDEV_DEVEBOX_F407VGT6 移植。只需要改config MICROPY_HW_MCU_NAME 407VG为 407VE。
再做些想要的微调即可。
注意板上按键A0是对 3.3V的,内部要下拉,判定有按键的值为1。否则因A0也是WAKEUP会造成开机问题。
2. 复制工程修改
复制工程目录,并修改 mpconfigboard.h 文件:
cp -R boards/MCUDEV_DEVEBOX_F407VGT6 boards/MCUDEV_DEVEBOX_F407VET6
pico boards/DevEBox_F407VE/mpconfigboard.h
相关修改内容如下:
#define MICROPY_HW_BOARD_NAME "MCUDEV DevEBox_407VE"
#define MICROPY_HW_MCU_NAME "STM32F407VE"
#define MICROPY_HW_FLASH_FS_LABEL "Ebox_"
/* cyue 启用 THREAD */
#define MICROPY_PY_THREAD (1)
。。。
// 1 = use internal flash (1 MByte)
// 0 = use onboard SPI flash (2 MByte) Winbond W25Q16
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE 0//cyue 用板上SPI Flash
。。。
// A0 设置内部下拉,MICROPY_HW_USRSW_PRESSED 注意改为 1,和上拉key设定相反。
// KEY0 has no pullup or pulldown; Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN (pin_A0)
#define MICROPY_HW_USRSW_PULL (GPIO_PULLDOWN)
#define MICROPY_HW_USRSW_EXTI_MODE (GPIO_MODE_IT_RISING)
#define MICROPY_HW_USRSW_PRESSED (1) //cyue invert from pullup keys.
修改后储存。
3. 执行 DevEBox_407VE 的编译
make BOARD=MCUDEV_DEVEBOX_F407VET6 -j
4. 烧录
编译成功后,插上板上 BT0 和 3.3v 跳线,断电重连PC,再执行烧录。
有时候进不了 DFU,多插拔几次。。。
make BOARD=MCUDEV_DEVEBOX_F407VET6 deploy
5. 重开机登录 REPL
烧录完成后,拔下 BT0 和 3.3v 跳线头,断电重连PC,即可登录开发板的 REPL。
构建和部署后,您可以通过USB串行访问MicroPython REPL(Python提示)。
# macOS:
screen /dev/tty.usbmodem*
# Linux:
screen /dev/ttyACM0 115200
Windows下可用 putty 登录。
参考:原理图和板上脚位图


3. BARE_407VE
这块板子上没有多余IC、接口,USB外 只有一个LED(PB12),一个UART,一个SWD,没有SPI Flash 和 SD卡槽。只能使用内部的 FLash当文件系统了。512K的Flash规划约96K的空间给文件系统用。
1. 比对现有工程
从 MCUDEV_DEVEBOX_F407VGT6 移植。改MCU、时钟25M、LED脚位(PB12)、以及关闭SPI Flash。
SD卡功能保留,未来可在底板加。注意板上按键A0是对 3.3V的,内部要下拉,判定有按键的值为1。否则因A0也是WAKEUP会造成开机问题。
2. 复制工程修改
- 复制工程目录,并修改 mpconfigboard.h 文件:
cp -R boards/MCUDEV_DEVEBOX_F407VGT6 boards/BARE407VE_25M
pico boards/BARE407VE_25M/mpconfigboard.h
相关修改内容如下:
#define MICROPY_HW_BOARD_NAME "BARE407VE_25M"
#define MICROPY_HW_MCU_NAME "STM32F407VE"
#define MICROPY_HW_FLASH_FS_LABEL "BARE_"
/* cyue 启用 THREAD */
#define MICROPY_PY_THREAD (1)
// 1 = use internal flash (512K Byte, 90k left)
// 0 = use onboard SPI flash (2 MByte) Winbond W25Q16
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (1)
。。。
// HSE is 25MHz
#define MICROPY_HW_CLK_PLLM (25) // divide external clock by this to get 1MHz
#define MICROPY_HW_CLK_PLLN (336) // PLL clock in MHz
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2) // divide PLL clock by this to get core clock
#define MICROPY_HW_CLK_PLLQ (7) // divide core clock by this to get 48MHz
。。。
// LEDs
// LED D1 is the power LED and always on
#define MICROPY_HW_LED1 (pin_B12) // LED D1
#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_low(pin))
#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_high(pin))
修改后储存。
- 由于没SPI Flash定义,确认 boards/BARE407VE_25M/bdev.c 不被编入。
pico boards/BARE407VE_25M/bdev.c
#include "storage.h"
#if !MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
。。。
#end
修改后储存。
- 没有SPI Flash,不需要 预先拉升 CS 脚防掉Code:
pico boards/BARE407VE_25M/board_init.c
#include "py/mphal.h"
void Mcudev_Devebox_F407VE_board_early_init(void) {
// set SPI flash CS pin high
//mp_hal_pin_output(pin_A15);
//mp_hal_pin_write(pin_A15, 1);
}
3. 执行 BARE407VE_25M 的编译
make BOARD=BARE407VE_25M -j
4. 烧录
编译成功后,插上板上 BT0 和 3.3v 跳线,断电重连PC,再执行烧录。
make BOARD=BARE407VE_25M deploy
5. 重开机登录 REPL
烧录完成后,跳线改成 BT0 和 0v 连接后,按reset按钮或断电重连PC,即可登录开发板的 REPL。
构建和部署后,您可以通过USB串行访问MicroPython REPL(Python提示)。
# macOS:
screen /dev/tty.usbmodem*
# Linux:
screen /dev/ttyACM0
Windows下可用 putty 登录。
参考:PCB照片和板上脚位图


蓝牙
1 设定
mpconfigboard.mk :尾端加上
(尝试选btstack)
# cyue: trybluetooth
MICROPY_PY_BLUETOOTH ?= 1
MICROPY_BLUETOOTH_NIMBLE ?= 0
MICROPY_BLUETOOTH_BTSTACK ?= 1
#MICROPY_PY_LWIP = 1
#MICROPY_PY_USSL = 1
#MICROPY_SSL_MBEDTLS = 1
#MICROPY_VFS_LFS2 = 1
mpconfigboard.h :尾端加上 HCI port 设定
// cyue: add Bluetooth config
#define MICROPY_HW_BLE_UART_ID (PYB_UART_2)
#define MICROPY_HW_BLE_UART_BAUDRATE (115200)
#define MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY (3000000)
编译(DevEBox为例)
make BOARD=MCUDEV_DEVEBOX_F407VET6 -j
...
LINK build-MCUDEV_DEVEBOX_F407VET6/firmware.elf
text data bss dec hex filename
401504 56 39000 440560 6b8f0 build-MCUDEV_DEVEBOX_F407VET6/firmware.elf
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware0.bin
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware1.bin
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware.hex
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware.dfu
...
留言