MicroPython移植到STM32H750

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 = 128K
    FLASH_ISR (rx)  : ORIGIN = 0x00000000, LENGTH = 64K    /* ITCMRAM 64K */
    FLASH_TEXT (rx) : ORIGIN = 0x90000000, LENGTH = 8M  

    DTCMRAM (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K
    RAM (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
    RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
    RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
    ITCMRAM (xrw)     : ORIGIN = 0x00000000, LENGTH = 64K
    QSPIFLASH (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 byte
   of 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模块之类的。。。或许吧🕊🕊🕊

感谢您的阅读,下次再见

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值