最近通過參考網上的文章,成功將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
如有錯誤請大家積極指出,我會盡快修改!
!!!!!!!轉載請注明出處!!!!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291721.html
標籤:其他
