Micropython移植到STM32H750
tb上买了块stm32h750vbt6的核心板,想折腾一下,正好最近在学python,于是尝试在这块板子上移植一下micropython。然而官方貌似还没支持H750系列,那就自己整。话不多说,开始干活。
首先板子长这样
其实用什么板子无所谓,重要的是移植的过程。
开发环境:win10+Ubuntu20虚拟机,当然其他版本也ok,同时会用到STM32CubeMX工具,请准备好。
第一步 下载源码
从GitHub上下载源码
git clone https://github.com/micropython/micropython
这个过程可能需要几分钟时间
下载完成后看一下micropython目录下的内容
ls micropython/
先不要急着编译,还要把库文件下载下来。
cd micropython
git submodule update --init lib
简要介绍一下三个重要的目录,其他的请自行查看
mpy-cross/
相当于一个交叉编译器,把.py文件编译成.mpy文件,是个官方的工具
,编译整个项目前请先编译mpy-cross
lib/
该目录下存放各种库文件,比如后面要用到的STM32HAL库
ports/
硬件接口,与平台相关,支持stm32,esp系列等,移植时重点关注该目录
第二步 编译
先尝试编译一下,进入mpy-cross目录,直接make
cd mpy-cross/
make
如果中间缺少工具,那缺什么就装什么,后面也是一样。
这一步完了后,进入micropython/ports/stm32目录
直接make
make -j8多线程编译加快速度
cd /ports/stm32
make -j8
如果没安装交叉编译器会报这个错
/bin/sh: 1: arm-none-eabi-gcc: not found
安装就好了
sudo apt install gcc-arm-none-eabi
make完成以后会多出一个build-PYBV10目录,里边有编译出的固件,适用的板卡为官方PYB系列,但是这不是我们想要的。
然后清除
make clean
第三步 移植
先查看一下支持的stm32板卡有哪些
注意到有NUCLEO_H743ZI板卡支持,接下来以这个目录为模板进行移植。
将NUCLEO_H743ZI目录复制一份,命名随意,比如MYH750
先进入micropython/ports/stm32/board目录再复制
cp NUCLEO_H743ZI/ MYH750 -r
然后要修改mpconfigboard.h 以及 mpconfigboard.mk这两个文件
修改后的内容如下
mpconfigboard.h
#define MICROPY_HW_BOARD_NAME "MYH750"
#define MICROPY_HW_MCU_NAME "STM32H750"#define MICROPY_HW_ENABLE_RNG (1)
#define MICROPY_HW_ENABLE_RTC (1)
#define MICROPY_HW_ENABLE_USB (1)
#define MICROPY_HW_ENABLE_SDCARD (1)
#define MICROPY_HW_ENABLE_ADC (1)
#define FORCE_RESRT_MODE_1 (1)
#define MICROPY_HW_ENABLE_DCMI (1)
#define MICROPY_HW_RTC_USE_LSE (1)
#define MICROPY_PY_THREAD (1)#define MICROPY_HW_CLK_PLLM (5)
#define MICROPY_HW_CLK_PLLN (192)
#define MICROPY_HW_CLK_PLLP (2)
#define MICROPY_HW_CLK_PLLQ (5)
#define MICROPY_HW_CLK_PLLR (2)#define MICROPY_HW_CLK_PLL3M (25)
#define MICROPY_HW_CLK_PLL3N (192)
#define MICROPY_HW_CLK_PLL3P (2)
#define MICROPY_HW_CLK_PLL3Q (4)
#define MICROPY_HW_CLK_PLL3R (2)// UART config
#define MICROPY_HW_UART1_TX (pin_A9)
#define MICROPY_HW_UART1_RX (pin_A10)
#define MICROPY_HW_UART_REPL PYB_UART_1
#define MICROPY_HW_UART_REPL_BAUD 115200// USB config
#define MICROPY_HW_USB_FS (1)
mpconfigboard.mk
# MCU settings
MCU_SERIES = h7
CMSIS_MCU = STM32H750xx
MICROPY_FLOAT_IMPL = double
AF_FILE = boards/stm32h743_af.csv# When not using Mboot the ISR text goes first, then the rest after the filesystem
LD_FILES = boards/stm32h750.ld boards/common_ifs.ld
TEXT0_ADDR = 0x00000000
TEXT1_ADDR = 0x90000000
直接make的话会报如下错误:
arm-none-eabi-ld: cannot open linker script file boards/stm32h750.ld: 没有那个文件或目录
是因为缺少stm32h750.ld这个链接脚本
于是在board目录下创建一个stm32h750.ld,并写入以下内容
/*GNU linker script for STM32H750
*//* Specify the memory areas */
MEMORY
{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128KFLASH_ISR (rx) : ORIGIN = 0x00000000, LENGTH = 64K /* ITCMRAM 64K */FLASH_TEXT (rx) : ORIGIN = 0x90000000, LENGTH = 8M DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128KRAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512KRAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288KRAM_D3 (xrw) : ORIGIN = 0x38000000, LENGTH = 64KITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64KQSPIFLASH (rx) : ORIGIN = 0x90000000, LENGTH = 8M
}/* produce a link error if there is not this amount of RAM for these sections */
_minimum_stack_size = 2K;
_minimum_heap_size = 16K;/* Define the stack. The stack is full descending so begins just above last byteof RAM. Note that EABI requires the stack to be 8-byte aligned for a call. */
_estack = ORIGIN(RAM) + LENGTH(RAM) - _estack_reserve;
_sstack = _estack - 16K; /* tunable *//* RAM extents for the garbage collector */
_ram_start = ORIGIN(RAM);
_ram_end = ORIGIN(RAM) + LENGTH(RAM);
_heap_start = _ebss; /* heap starts just after statically allocated memory */
_heap_end = _sstack;
这部分参考了STM32CubeMX提供的例程以及stm32h743.ld
接下来还有几处小改动
首先把micropython/ports/stm32/boards/MYH750/目录下的
stm32h7xx_hal_conf.h里面的HSE值改一下,比如这块板子的晶振是25MHz的,HSE_VALUE=25000000
// Oscillator values in Hz
#define HSE_VALUE (25000000)
#define LSE_VALUE (32768)
#define EXTERNAL_CLOCK_VALUE (12288000)
然后是micropython/ports/stm32目录下的Makefile
第401行
将 ifeq ($(CMSIS_MCU),$(filter $(CMSIS_MCU),STM32H743xx))
改成 ifeq ($(CMSIS_MCU),$(filter $(CMSIS_MCU),STM32H743xx STM32H750xx))
再就是micropython/ports/stm32/adc.c
第145行
将 #elif defined(STM32H743xx)
改成 #elif defined(STM32H743xx)|| defined(STM32H750xx)
最后是micropython/ports/stm32/flashbdev.c
第105行
将 #elif defined(STM32H743xx)
改成 #elif defined(STM32H743xx)||defined(STM32H750xx)
到这里就可以试着编译一下。切换到micropython/ports/stm32目录
make BOARD=MYH750 -j8
编译完成
查看一下产生的bin文件
ls build-MYH750/*.bin -sh
可以看到产生了两个固件
16K build-MYH750/firmware0.bin 340K build-MYH750/firmware1.bin
其中firmware1.bin达到了340K,这部分需要放在外部flash,那么我们就需要一个boot程序,micropython自带的mboot我还不太会用,于是自己写一个,这里就直接给出来了。
链接: https://download.csdn.net/download/Slade99X/12451712
百度云:
链接: https://pan.baidu.com/s/1hJWNpB75sROkg_008-JKSA
提取码:835c
这个boot程序是个MDK工程,编译之后烧录到板子上,可以用st-link或者dfu方式。然后用读卡器把前面生成的两个bin文件拷到SD卡根目录,这时先别急着插入SD卡,先把板子的串口1接到电脑上,给板子上电,再插入SD卡,用串口终端软件查看。应该会显示如下内容:
到这里移植算是完成了,但是还存在一些问题,就是上电后不会自动运行main.py,这是因为我们用了自己的boot程序,而不是官方的mboot,要解决这个问题也不难,这里就不展开了。
总结
整个移植过程步骤挺繁琐的,但跟着走一遍的确可以加深对mpy工程结构的理解,如果真要拿mpy来做点东西的话,建议还是选择移植到官方支持的板卡,或者比较相近的板子也行,这样会方便很多😁
后边可能会写一些关于IAP的东西,或者是自己制作mpy模块之类的。。。或许吧🕊🕊🕊
感谢您的阅读,下次再见