[长文干货]MicroPython移植到野火STM32F429开发板

Posted Ray_1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[长文干货]MicroPython移植到野火STM32F429开发板相关的知识,希望对你有一定的参考价值。

最近通过参考网上的文章,成功将MicroPython移植到野火STM32F429开发板上,给大家分享一下自己的移植过程,可以作为STM32系列移植MicroPY的参考。

1.移植前准备工作

实验环境:WIN10 64位+Vmware Workstation虚拟机软件+Ubuntu20.04 64位 ,环境不一定要和我一致,只要是虚拟机系统是Linux系统就行

移植目标平台:野火STM32F429挑战者开发板

(1)安装Linux虚拟机

参考教程:虚拟机VMware最详细下载与安装教程!https://blog.csdn.net/zp17834994071/article/details/107137626?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162787456716780366589560%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162787456716780366589560&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-107137626.pc_search_result_control_group&utm_term=vmware%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187

为了便于在虚拟机和Windows直接传输文件,记得安装好VmwareTools,安装参考教程看这里:

https://blog.csdn.net/blessed_sy/article/details/81173746?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162788632916780264029069%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162788632916780264029069&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-81173746.pc_search_result_control_group&utm_term=vmwaretools&spm=1018.2226.3001.4187

(2)从git下载MicroPython源码,准备编译环境

打开Linux虚拟机的终端,并输入以下命令:

        安装git   

sudo apt-get install git

        git安装完成后,下载MicroPython源码

git clone https://github.com/micropython/micropython

源码下载完成后,你的虚拟机的主目录(home)就会多出一个micropython文件夹,源码就在这个文件夹中。当然你也可以用其他方式下载到源码,git下载不挂VPN的话很慢,网上方法很多,自行搜索。

2.找到F429的移植文件并修改

打开micropython文件夹,进入以下路径:micropython/ports/stm32/boards

可以看到mpy官方支持的stm32开发板文件,这里我们选择STM32F429DISC进行移植,这个和野火F429开发板最相近。 

复制STM32F429文件夹并重命名为FireF429-V1 (这个名字你可以随便取,只是后面编译的时候你要用你取的名字指定编译目标开发板,对应就行) 

手动复制重命名自己操作就行,若要使用命令行如下:

cd ports/stm32/boards
cp -r STM32F429DISC FireF429-V1

复制重命名完成后会多出一个刚刚你命名的文件夹

进入 FireF429-V1文件夹,对照野火官方的原理图修改这三个文件:

mpconfigboard.h是板子的硬件配置文件

pins.csv是mpy的引脚映射表

stm32f4xx_hal_conf.h是f4的HAL库配置文件

 (1)mpconfigboard.h修改

#define MICROPY_HW_BOARD_NAME       "FireF429-V1"
#define MICROPY_HW_MCU_NAME         "STM32F429"

#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_USB       (1)

// HSE is 8MHz
#define MICROPY_HW_CLK_PLLM (25)
#define MICROPY_HW_CLK_PLLN (336)
#define MICROPY_HW_CLK_PLLP (RCC_PLLP_DIV2)
#define MICROPY_HW_CLK_PLLQ (7)

#define MICROPY_HW_UART_REPL        PYB_UART_1
#define MICROPY_HW_UART_REPL_BAUD   115200

// 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_UART3_TX     (pin_B10)
#define MICROPY_HW_UART3_RX     (pin_B11)
#define MICROPY_HW_UART6_TX     (pin_C6)
#define MICROPY_HW_UART6_RX     (pin_C7)

// I2C buses
#define MICROPY_HW_I2C3_SCL (pin_A8)
#define MICROPY_HW_I2C3_SDA (pin_C9)

// SPI buses
//#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)
#if defined(USE_USB_HS_IN_FS)
// The HS USB uses B14 & B15 for D- and D+
#else
#define MICROPY_HW_SPI2_NSS  (pin_B12)
#define MICROPY_HW_SPI2_SCK  (pin_B10)
#define MICROPY_HW_SPI2_MISO (pin_C2)
#define MICROPY_HW_SPI2_MOSI (pin_C3)
#endif
//#define MICROPY_HW_SPI4_NSS     (pin_E11)
//#define MICROPY_HW_SPI4_SCK     (pin_E12)
//#define MICROPY_HW_SPI4_MISO    (pin_E13)
//#define MICROPY_HW_SPI4_MOSI    (pin_E14)
#define MICROPY_HW_SPI5_NSS     (pin_F6)
#define MICROPY_HW_SPI5_SCK     (pin_F7)
#define MICROPY_HW_SPI5_MISO    (pin_F8)
#define MICROPY_HW_SPI5_MOSI    (pin_F9)
//#define MICROPY_HW_SPI6_NSS     (pin_G8)
//#define MICROPY_HW_SPI6_SCK     (pin_G13)
//#define MICROPY_HW_SPI6_MISO    (pin_G12)
//#define MICROPY_HW_SPI6_MOSI    (pin_G14)

// CAN buses
#define MICROPY_HW_CAN1_TX (pin_A12)
#define MICROPY_HW_CAN1_RX (pin_A11)
#define MICROPY_HW_CAN2_TX (pin_B6)
#define MICROPY_HW_CAN2_RX (pin_B5)

// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN        (pin_A0)
#define MICROPY_HW_USRSW_PULL       (GPIO_NOPULL)
#define MICROPY_HW_USRSW_EXTI_MODE  (GPIO_MODE_IT_RISING)
#define MICROPY_HW_USRSW_PRESSED    (1)

// LEDs
#define MICROPY_HW_LED1             (pin_H10) // red
#define MICROPY_HW_LED2             (pin_H11) // green
#define MICROPY_HW_LED3             (pin_H12) // BLUE
#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_HS              (1)
#define MICROPY_HW_USB_HS_IN_FS        (1)
#define MICROPY_HW_USB_OTG_ID_PIN      (pin_B12)

// SDRAM
#define MICROPY_HW_SDRAM_SIZE  (64 / 8 * 1024 * 1024)  // 64 Mbit
#define MICROPY_HW_SDRAM_STARTUP_TEST             (1)
#define MICROPY_HEAP_START  ((sdram_valid) ? sdram_start() : &_heap_start)
#define MICROPY_HEAP_END    ((sdram_valid) ? sdram_end() : &_heap_end)

// Timing configuration for 90 Mhz (11.90ns) of SD clock frequency (180Mhz/2)
#define MICROPY_HW_SDRAM_TIMING_TMRD        (2)
#define MICROPY_HW_SDRAM_TIMING_TXSR        (7)
#define MICROPY_HW_SDRAM_TIMING_TRAS        (4)
#define MICROPY_HW_SDRAM_TIMING_TRC         (7)
#define MICROPY_HW_SDRAM_TIMING_TWR         (2)
#define MICROPY_HW_SDRAM_TIMING_TRP         (2)
#define MICROPY_HW_SDRAM_TIMING_TRCD        (2)
#define MICROPY_HW_SDRAM_REFRESH_RATE       (64) // ms

#define MICROPY_HW_SDRAM_BURST_LENGTH       2
#define MICROPY_HW_SDRAM_CAS_LATENCY        3
#define MICROPY_HW_SDRAM_COLUMN_BITS_NUM    8
#define MICROPY_HW_SDRAM_ROW_BITS_NUM       12
#define MICROPY_HW_SDRAM_MEM_BUS_WIDTH      16
#define MICROPY_HW_SDRAM_INTERN_BANKS_NUM   4
#define MICROPY_HW_SDRAM_CLOCK_PERIOD       2
#define MICROPY_HW_SDRAM_RPIPE_DELAY        1
#define MICROPY_HW_SDRAM_RBURST             (0)
#define MICROPY_HW_SDRAM_WRITE_PROTECTION   (0)
#define MICROPY_HW_SDRAM_AUTOREFRESH_NUM    (4)

#define MICROPY_HW_FMC_SDCKE1   (pin_B5)
#define MICROPY_HW_FMC_SDNE1    (pin_B6)
#define MICROPY_HW_FMC_SDCLK    (pin_G8)
#define MICROPY_HW_FMC_SDNCAS   (pin_G15)
#define MICROPY_HW_FMC_SDNRAS   (pin_F11)
#define MICROPY_HW_FMC_SDNWE    (pin_C0)
#define MICROPY_HW_FMC_BA0      (pin_G4)
#define MICROPY_HW_FMC_BA1      (pin_G5)
#define MICROPY_HW_FMC_NBL0     (pin_E0)
#define MICROPY_HW_FMC_NBL1     (pin_E1)
#define MICROPY_HW_FMC_A0       (pin_F0)
#define MICROPY_HW_FMC_A1       (pin_F1)
#define MICROPY_HW_FMC_A2       (pin_F2)
#define MICROPY_HW_FMC_A3       (pin_F3)
#define MICROPY_HW_FMC_A4       (pin_F4)
#define MICROPY_HW_FMC_A5       (pin_F5)
#define MICROPY_HW_FMC_A6       (pin_F12)
#define MICROPY_HW_FMC_A7       (pin_F13)
#define MICROPY_HW_FMC_A8       (pin_F14)
#define MICROPY_HW_FMC_A9       (pin_F15)
#define MICROPY_HW_FMC_A10      (pin_G0)
#define MICROPY_HW_FMC_A11      (pin_G1)
#define MICROPY_HW_FMC_D0       (pin_D14)
#define MICROPY_HW_FMC_D1       (pin_D15)
#define MICROPY_HW_FMC_D2       (pin_D0)
#define MICROPY_HW_FMC_D3       (pin_D1)
#define MICROPY_HW_FMC_D4       (pin_E7)
#define MICROPY_HW_FMC_D5       (pin_E8)
#define MICROPY_HW_FMC_D6       (pin_E9)
#define MICROPY_HW_FMC_D7       (pin_E10)
#define MICROPY_HW_FMC_D8       (pin_E11)
#define MICROPY_HW_FMC_D9       (pin_E12)
#define MICROPY_HW_FMC_D10      (pin_E13)
#define MICROPY_HW_FMC_D11      (pin_E14)
#define MICROPY_HW_FMC_D12      (pin_E15)
#define MICROPY_HW_FMC_D13      (pin_D8)
#define MICROPY_HW_FMC_D14      (pin_D9)
#define MICROPY_HW_FMC_D15      (pin_D10)

 这是我修改好的文件,可以直接粘贴过去使用,我修改了时钟配置,串口引脚,LED引脚和其余外设的引脚,我这里是根据野火提供的开发板资料里的底板原理图和F429英文数据手册对应修改的,大家移植其他板子时也按照相应资料对应修改就行。

初步的移植修改考虑时钟,串口USART和USB就行,跑起来以后再去修改其他引脚。

大家可以看看STM32F429DISC中的和我修改后的有什么不同。移植成功的关键在于修改时钟参数,野火F429的外部时钟是25Mhz,我这里将时钟输出设置为168M,是为了兼容USB外设的FS模式,这是F429的一个奇葩设计,大家可以参考火哥的教程,里面有提到,相关参考文章:https://blog.csdn.net/flyleaf91/article/details/52325499

这里的USB是使用的HS模式,大家移植过程中要注意看使用的HS还是FS,这两个引脚不同,主要看自己的板子引出的是哪些引脚。

(2)pins.csv修改

这个文件用office软件打开,对应着你在mpconfigboard.h文件中做的修改进行改动就行了。以下是我的修改,大家可以参考着修改。

PF4	PF4
PF5	PF5
PF2	PF2
PF3	PF3
PF0	PF0
PF1	PF1
PC14	PC14
PC15	PC15
PE6	PE6
PC13	PC13
PE4	PE4
PE5	PE5
PE2	PE2
PE3	PE3
PE0	PE0
PE1	PE1
PB8	PB8
PB9	PB9
PB6	PB6
PB7	PB7
PB4	PB4
PB5	PB5
PG15	PG15
PB3	PB3
PG13	PG13
PG14	PG14
PG11	PG11
PG12	PG12
PG9	PG9
PG10	PG10
PD7	PD7
PD6	PD6
PD5	PD5
PD4	PD4
PD3	PD3
PD2	PD2
PD1	PD1
PD0	PD0
PC12	PC12
PC11	PC11
PC10	PC10
PA15	PA15
PA14	PA14
PA13	PA13
PA12	PA12
PA11	PA11
PA10	PA10
PA9	PA9
PA8	PA8
PC9	PC9
PC8	PC8
PC7	PC7
PC6	PC6
PG8	PG8
PG7	PG7
PG6	PG6
PG5	PG5
PG4	PG4
PF6	PF6
PF8	PF8
PF7	PF7
PF10	PF10
PF9	PF9
PH1	PH1
PH0	PH0
PC1	PC1
PC0	PC0
PC3	PC3
PC2	PC2
PA1	PA1
PA0	PA0
PA3	PA3
PA2	PA2
PA5	PA5
PA4	PA4
PA7	PA7
PA6	PA6
PC5	PC5
PC4	PC4
PB1	PB1
PB0	PB0
PB2	PB2
PF12	PF12
PF11	PF11
PF14	PF14
PF13	PF13
PG0	PG0
PF15	PF15
PE7	PE7
PG1	PG1
PE9	PE9
PE8	PE8
PE11	PE11
PE10	PE10
PE13	PE13
PE12	PE12
PE15	PE15
PE14	PE14
PB11	PB11
PB10	PB10
PB13	PB13
PB12	PB12
PB15	PB15
PB14	PB14
PD9	PD9
PD8	PD8
PD11	PD11
PD10	PD10
PD13	PD13
PD12	PD12
PD15	PD15
PD14	PD14
PG3	PG3
PG2	PG2
SW	PA0
LED_GREEN	PG13
LED_RED	PG14
LED_BLUE	PD12

(3)stm32f4xx_hal_conf.h修改

这个文件就对应着你修改的时钟频率参数,修改第一个外部时钟参数就行了,这里我对应着修改到25Mhz

/* This file is part of the MicroPython project, http://micropython.org/
 * The MIT License (MIT)
 * Copyright (c) 2019 Damien P. George
 */
#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 (25000000)
#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

到这里,最重要的一步---移植文件就修改完成了,后续就是编译源码并下载到开发板就行了

3.编译源代码

编译之前需要先配置好交叉编译环境,安装gcc和gcc-arm-none-eabi交叉编译器,

在终端中依次输入命令完成交叉编译器的安装:

sudo apt-get install gcc
sudo apt-get install gcc-arm-none-eabi

回到源码目录micropython下,进入mpy-cross目录,先编译MicroPython cross-compiler(很多开发板需要先编译好mpy-cross 然后才能成功编译Micropython ),在终端中依次输入命令:

cd mpy-cross
make

回到micropython目录,输入下列命令将源码中的一些子模块submoudle下载下来:

git init
git submodule update --init

以上工作完成后,我们就可以开始编译刚刚修改好的STM32F429 Mpy源码啦!!!

进入stm32目录下执行以下命令进行编译,生成我们所需要的固件文件:DFU格式,HEX格式,ELF格式以及BIN格式。

cd ports/stm32/
make BOARD=FireF429-V1 PYTHON=python3

BOARD=FireF429-V1是用于指定要编译的开发板,与你之前复制重命名的文件夹名字要一致。PYTHON=python3参数可以不要,默认编译就是使用Python3,如果你的Linux虚拟机没有安装Python3请参照此文章安装:https://blog.csdn.net/L_15156024189/article/details/84831045?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162789161716780265464401%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162789161716780265464401&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-84831045.pc_search_result_control_group&utm_term=Linux%E5%AE%89%E8%A3%85python3&spm=1018.2226.3001.4187

编译完成后,会在micropython/ports/stm32文件夹里生成一个编译好的文件夹build-FireF429-V1,里面有我们下载程序所需要的固件文件:DFU格式,HEX格式,ELF格式以及BIN格式。

打开build-FireF429-V1文件夹,可以找到四个下载用的文件。

 最后一步就是将程序下载到开发板验证就行啦!!

4.下载程序到开发板

上面生成的四个文件任意选择一种格式下载就行,注意:其中的bin要下载firmware1.bin才行!!!

我常用的是CoFlash软件通过CMSIS-DAP烧写bin或者elf格式文件的方式,用DfuSeDemo通过F429自带的自举bootloader下载DFU文件我也使用过,实测可以下载成功,只是这种方式比较麻烦,因为野火的F429开发板引出的是HS USB,而要下载dfu文件需要使用FS USB才能识别出来DFU模式,需要额外连线。

下面给一些文章参考这三种格式分别如何下载:

下载之前,记得将你要下载的文件发送到Windows。

(1)dfu格式下载:

https://blog.csdn.net/hbspring007/article/details/105967489?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162789256416780262584334%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162789256416780262584334&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-105967489.pc_search_result_control_group&utm_term=dfu%E4%B8%8B%E8%BD%BD&spm=1018.2226.3001.4187

https://blog.csdn.net/wxh0000mm/article/details/108240065?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162789256416780262584334%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162789256416780262584334&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-108240065.pc_search_result_control_group&utm_term=dfu%E4%B8%8B%E8%BD%BD&spm=1018.2226.3001.4187

因为我们已经有了DFU文件了,可以跳过参考教程里的文件格式转换部分。

F429进入DFU模式需要将boot0拉高,接3.3v,boot1拉低,接GND

接线可以参考以下截图:

 如果收拾有J-link或者cmsis-dap下载器的话,不建议用这种方式下载,太麻烦。

 特别注意!!!:下载完成后记得把boot0接回GND拉低,才能从flash启动,正常运行micropy!!!

(2)elf和bin格式下载:

CMSISI-DAP下载器:https://wenku.baidu.com/view/9e5a778f83c758f5f61fb7360b4c2e3f572725a5.html

 J-LINK等其他下载器,在Coflash软件上选择对应的下载器就行了,如下图:

 到此我们的MicroPython就成功下载到开发板啦!!!接下来我们验证一下是否能正常使用。

5.程序验证

程序下载完成后,给开发板断电。用两根USB线将开发板的USB HS和串口连接到电脑,如下图:

连接上电脑后,给开发板上电,如果程序正常运行,电脑会识别到一个名为PYBFLASH的U盘,

如下图所示:

打开设备管理器,可以看到两个串口设备:

 打开你的Putty终端,或者下载一个MobaXterm软件,(自行搜索如何连接串口,这个太太太基础了)通过串口连接到开发板(注意波特率设置为115200),可以看到如下界面,进行人机交互:

 至此说明我们已经移植成功啦!!!下面控制一下LED试试吧!

在串口终端输入pyb.LED(1).on()

可以看到开发板上的红灯亮起!

 移植完成!!!,可以开始你的micropython开发之旅啦!

micropython基础知识戳这里!!!:

https://blog.csdn.net/dmpnosvn28419/article/details/101463356

Ray-2021

如有错误请大家积极指出,我会尽快修改!

!!!!!!!转载请注明出处!!!!!!!

以上是关于[长文干货]MicroPython移植到野火STM32F429开发板的主要内容,如果未能解决你的问题,请参考以下文章

CubeMX移植野火ILI9341触摸画板笔记

CubeMX移植野火ILI9341触摸画板笔记

CubeMX移植野火ILI9341触摸画板笔记

野火STM32学习笔记

ST开发板评测使用Python来开发STM32F411

STM32CubeIDE 连接W5500模块作为TCPClient