MicroPython移植到STM32H750

news/2024/11/30 13:45:35/

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模块之类的。。。或许吧🕊🕊🕊

感谢您的阅读,下次再见


http://www.ppmy.cn/news/307491.html

相关文章

k-means 聚类算法

文章目录 k-means 聚类算法一、原理二、python实现聚类分析三、sklearn实现聚类分析四、 K-means算法优缺点 参考: 数据挖掘十大算法(二):K-means聚类算法原理与实现 K-means聚类分析算法原理、改进及实现 k-means 聚类算法 一…

Git、Github、Gitee的区别

⭐作者主页:逐梦苍穹 ⭐所属专栏:Git 目录 1、Git2、Gitee3、GitHub 什么是版本管理?   版本管理是管理各个不同的版本,出了问题可以及时回滚。 1、Git Git是一个分布式版本控制系统,用于跟踪和管理代码的变化。它是…

【Python】Python进阶系列教程-- Python3 网络编程(五)

文章目录 前言什么是 Socket?socket()函数参数 Socket 对象(内建)方法服务器端套接字客户端套接字公共用途的套接字函数 简单实例服务端客户端 Python Internet 模块 前言 往期回顾: Python进阶系列教程-- Python3 正则表达式(一)Python进…

NSS周常刷密码(3)

[LitCTF 2023]md5的破解 from hashlib import md5 from string import ascii_lowercase,digits import itertools f1 LitCTF{md5can3derypt213thoughcrsh} for i in itertools.product(ascii_lowercasedigits, repeat4):t .join(i)flag f1[:13] t[:2] f1[13:16] t[2] f…

AI算法成长练习第一篇——Task-Adaptive Negative Envision for Few-Shot Open-Set Recognition代码复现

论文代码复现 代码结构 Architectures AttnClassifier.py import torch.nn as nn import torch import torch.nn.functional as Fimport numpy as npclass Classifier(nn.Module):def __init__(self, args, feat_dim, param_seam, train_weight_baseFalse):super(Classifi…

华为无线视频服务器,华为发布全新视频解决方案Envision

【IT168 资讯】近日,在华为运营转型峰会(Operations Transformation Forum 2016),华为发布全新融合视频解决方案Huawei Envision,助力运营商发展全融合视频基础业务,使能视频商业成功。 ▲华为数字业务产品线总裁宋孝龙发布Huawei…

向 Web 开发人员推荐35款 JavaScript 图形图表库

图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等。可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web 应用和项目的可靠性。 在这篇文章中,我们收集了35款…

Linux深入浅出PyTorch(三)PyTorch模型定义

目录 PyTorch模型定义的方式1. nn.Module 类回顾2. Sequential3. ModuleList4. ModuleDict5. 三种方法的比较 利用模型块快速搭建复杂网络1. U-Net简介2. U-Net模型分析3. U-Net模型块实现4. 利用模型块组装U-Net PyTorch修改模型1. 修改模型层2.添加外部输入3. 添加额外输出 P…