內容目錄

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的比较不会出问题,若遇到问题可以尝试 :

  1. 接上 USB Hub 隔离。
  2. MacBook暂时不用外部电源,用电池电源烧录。
  3. 按着 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
...

最後修改日期: 2022 年 12 月 21 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。