[长文干货]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虚拟机
为了便于在虚拟机和Windows直接传输文件,记得安装好VmwareTools,安装参考教程看这里:
(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格式下载:
因为我们已经有了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开发板的主要内容,如果未能解决你的问题,请参考以下文章