micropython下载及安装编译过程

2023-10-30

本文根据 参考文献, 实现基于Black_F407VE开发板的micropython移植,为后期 stm32H743的 micropython作准备。 参考 http://docs.micropython.org/en/latest/

1.下载micropython源码

git clone https://github.com/micropython/micropython

ports/stm32/boards下看到micropython支持的处理器或开发板。

进入ports/stm32/boards目录,我们开发板芯片型号是STM32F407VE, 最相近有F4 系列即VCC_GND_F407VE。复制VCC_GND_F407VE并重重命名为Black_F407VE:

cd ports/stm32/boards
cp -r VCC_GND_F407VE Black_F407VE

回到micropython输入下列命令下源码中的一些子模块submoudle下载下来:

git init
git submodule update –init (跟网络速度有关,要点时间)

也可以从这里下载

2. 编译并分析

工具链编译

$ cd mpy-cross
$ make

进入stm32目录下编译执行,生成我们所需要的固件DFU或者HEX形式的:

cd ports/stm32/

每个板都需要一定的子模块支持,有时需要预编译子模块:

$ make BOARD=Black_F407VE submodules

然后再编译

$ make BOARD=Black_F407VE

编译成功,在stm32目录下会生成一个build-Black_F407VE文件夹,在文件夹中有对应的烧入或升级文件:

Firmware.elf, firmware.hex  是用于烧录的完整固件
firmware0.bin  是bootLoader程序文件
firmware1.bin  是程序app文件
irmware.dfu  是配合ST-DFU工具用的app文件

注释:

  • Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。 BIN文件就是直接的二进制文件,一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可。可以直接在裸机上运行。

  • Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。 就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示。

    HEX文件由记录(RECORD)组成。在HEX文件里面,每一行代表一个记录。每条记录都由一个冒号“:”打头,其格式如下:

    :BBAAAATTHHHH…HHHHCC

    BB:字节个数。
      AAAA:数据记录的开始地址,高位在前,低位在后。
      TT: Type
      00数据记录,用来记录数据。
      01记录结束,放在文件末尾,用来标识文件结束。
      02用来标识扩展段地址的记录
      04扩展地址记录(表示32位地址的前缀)
      HHHH:一个字(Word)的数据记录,高字节在前,低字节在后。TT之后共有 BB/2 个字的数据 。
      CC: 占据一个Byte的CheckSum
      举例分析:
      :020000040000FA
      :10000400FF00A0E314209FE5001092E5011092E5A3
      :00000001FF

  • Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息,这些调试信息加在可执行的二进制数据之前。调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,只要axf除去调试信息后文件大小小于ram的大小即可。

  • ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:

    (1)适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。
      (2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。
      (3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。

  • 小结:可由elf文件转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。

  • DFU: 相当部分的 STM32芯片都带USB模块,有时我们会考虑利用STM32芯片的USB模块进行程序代码的下载或升级。USB协议中有专门针对设备固件升级的类协议,即可以通过DFU类协议进行产品固件的加载或更新。

用jlink工具或者stlink直接烧录firmware.hex文件来下载程序到开发板.

3.根据Black_F407VE修改配置文件

3.1 修改 stm32f4xx_hal_conf.h

使用 Black_F407VE开发板,修改 stm32f4xx_hal_conf.h 外部晶振为8M:

......
// Oscillator values in Hz
#define HSE_VALUE (8000000)   //修改这里
......

3.2 修改 board_init.c,

将A4 改成B0, 因为F_CS 连接在了 PB0:

在这里插入图片描述

#include "py/mphal.h"

void Black_F407VE_board_early_init(void) {
    // set SPI flash CS pin high
    mp_hal_pin_output(pin_B0);
    mp_hal_pin_write(pin_B0, 1);
}

3.3 修改 mpconfigboard.h

这也是需要修改最多的文件。

首先修改名称:

#define MICROPY_HW_BOARD_NAME       "Black_STM32F407VE"
#define MICROPY_HW_MCU_NAME         "STM32F407VE"
#define MICROPY_HW_FLASH_FS_LABEL   "F407VE"

由于使用了qspi 的flash w25q16, 修改以下:

// 1 = use internal flash (512 KByte)
// 0 = use onboard SPI flash (2 MByte) Winbond W25Q16
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)

HSE 为8M,要修改相关配置:

#define MICROPY_HW_CLK_PLLM (8) // divide external clock by this to get 1MHz

s使能RTC时钟为LSE,选择tamper引脚(PC13)RTC时钟64分频输出512HZ

#define MICROPY_HW_RTC_USE_CALOUT   (1)

串口、I2C、SPI、CAN引脚不用修改,修改key和led

// 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_A6) // red
#define MICROPY_HW_LED2             (pin_A7) // green
#define MICROPY_HW_LED_ON(pin)      (mp_hal_pin_low(pin))
#define MICROPY_HW_LED_OFF(pin)     (mp_hal_pin_high(pin))

修改winboard flash 及相关引脚:

// Winbond W25Q16 SPI Flash = 16 Mbit (2 MByte)
#define MICROPY_HW_SPIFLASH_SIZE_BITS (16 * 1024 * 1024)
#define MICROPY_HW_SPIFLASH_CS      (pin_B0)
#define MICROPY_HW_SPIFLASH_SCK     (pin_B3)
#define MICROPY_HW_SPIFLASH_MISO    (pin_B4)
#define MICROPY_HW_SPIFLASH_MOSI    (pin_B5)

修改初始化函数名称为 board_init.c中的名称:

#define MICROPY_BOARD_EARLY_INIT    Black_F407VE_board_early_init
void Black_F407VE_board_early_init(void);

修改SD卡的检测引脚,跳线帽短接E2与GND 可以更改为从内存卡启动。

// SD card detect switch
#define MICROPY_HW_SDCARD_DETECT_PIN        (pin_E2)
#define MICROPY_HW_SDCARD_DETECT_PULL       (GPIO_NOPULL)
#define MICROPY_HW_SDCARD_DETECT_PRESENT    (GPIO_PIN_RESET)

添加USB的检测。 如果上电后要选择进入micropython还是普通 方式,要添加以下内容: 如果进入py, 注意要将PA9与5V连接在一起,程序运行后在电脑资源管理器中会多一个USB 串行设备串口。

// USB config
......
#define MICROPY_HW_USB_VBUS_DETECT_PIN (pin_A9)
#define MICROPY_HW_USB_OTG_ID_PIN      (pin_A10)

3.4 修改 pin.csv

pins.csv这个文件是 pyb 里引脚的别名,是可用 CubeMX 导出 的csv 引脚配置文件,第一列是名称,第二列是别名。
在这里插入图片描述

删除蓝灯和boot1

BLUE_LED	PB9
BOOT1	PB2

添加LED1 LED2:

LED1	PA6
LED2	PA7

添加所有的引脚:

PA0	PA0
PA1	PA1
PA10	PA10
PA11	PA11
PA12	PA12
PA13	PA13
PA14	PA14
PA15	PA15
PA2	PA2
PA3	PA3
PA4	PA4
PA5	PA5
PA6	PA6
PA7	PA7
PA8	PA8
PA9	PA9
PB0	PB0
PB1	PB1
PB10	PB10
PB11	PB11
PB12	PB12
PB13	PB13
PB14	PB14
PB15	PB15
PB2	PB2
PB3	PB3
PB4	PB4
PB5	PB5
PB6	PB6
PB7	PB7
PB8	PB8
PB9	PB9
PC0	PC0
PC1	PC1
PC10	PC10
PC11	PC11
PC12	PC12
PC13	PC13
PC14	PC14
PC15	PC15
PC2	PC2
PC3	PC3
PC4	PC4
PC5	PC5
PC6	PC6
PC7	PC7
PC8	PC8
PC9	PC9
PD0	PD0
PD1	PD1
PD10	PD10
PD11	PD11
PD12	PD12
PD13	PD13
PD14	PD14
PD15	PD15
PD2	PD2
PD3	PD3
PD4	PD4
PD5	PD5
PD6	PD6
PD7	PD7
PD8	PD8
PD9	PD9
PE0	PE0
PE1	PE1
PE10	PE10
PE11	PE11
PE12	PE12
PE13	PE13
PE14	PE14
PE15	PE15
PE2	PE2
PE3	PE3
PE4	PE4
PE5	PE5
PE6	PE6
PE7	PE7
PE8	PE8
PE9	PE9
RED_LED	PA6
BLUE_LED	PA7

删除: SD 检测脚 和 swd的相关引脚

//SD	    PA8
//SD_SW	PA8
//SWCLK	PA14
//SWDIO	PA13

再次编译成功后生成 fireware.hex

4.下载调试

安装并打开串口调试工具,设置管理器中看到的USB 串行设备,打开串口,连接开发板。

成功连接,并且输出对应的提示信息。

下面输入命令验证一下:

Help()

操作IO口:

# main.py -- put your code here!
from pyb import Pin    #导入pyb的pin
led1=Pin.cpu.A6        #定义PA6为led1
led1.init(Pin.OUT_PP)  #上拉输出
led1.value(0)          #PA6置低led1打开
led2=Pin.cpu.A7        #定义PA7为led2
led2.init(Pin.OUT_PP)  #上拉输出
led2.value(0)          #PA7置低led2打开

在串口工具中用命令可控制:

>>> pyb.LED(1).on()
>>> pyb.LED(1).off()
>>> pyb.LED(2).off()
>>> pyb.LED(2).on()

5. 移植到 STM32H743

OPENMV4 使用芯片 STM32H743,手上有另一块开发板: STM32H743 ,板上集成了对应spi flash w26q64 有2片。

cd ports/stm32/boards
cp -r VCC_GND_H743VI Mini_H743VIT6

修改晶振 为 12M

#define HSE_VALUE (12000000)

启动多线程:

/* 启用 THREAD */ 
#define MICROPY_PY_THREAD           (1)

修改分频数,下图是基于25M配置的:

在这里插入图片描述

// The board has an 12MHz HSE, the following gives 400MHz CPU speed 12/3*200/2=400
#define MICROPY_HW_CLK_PLLM         (3)
#define MICROPY_HW_CLK_PLLN         (200)
#define MICROPY_HW_CLK_PLLP         (2)
#define MICROPY_HW_CLK_PLLQ         (4)
#define MICROPY_HW_CLK_PLLR         (2)

// The USB clock is set using PLL3
#define MICROPY_HW_CLK_PLL3M        (3)
#define MICROPY_HW_CLK_PLL3N        (60)
#define MICROPY_HW_CLK_PLL3P        (2)
#define MICROPY_HW_CLK_PLL3Q        (5)
#define MICROPY_HW_CLK_PLL3R        (2)

修改SD卡检测

#define MICROPY_HW_SDCARD_DETECT_PIN        (pin_D15)

修改SPI flash引脚

// SPI buses
//#define MICROPY_HW_SPI1_NSS         (pin_B12)
//#define MICROPY_HW_SPI1_SCK         (pin_B13)
//#define MICROPY_HW_SPI1_MISO        (pin_B14)
//#define MICROPY_HW_SPI1_MOSI        (pin_B15)
//#define MICROPY_HW_SPI2_NSS         (pin_B10)
//#define MICROPY_HW_SPI2_SCK         (pin_B2)
//#define MICROPY_HW_SPI2_MISO        (pin_D12)
//#define MICROPY_HW_SPI2_MOSI        (pin_D11)
#define MICROPY_HW_SPI2_NSS  (pin_B12)
#define MICROPY_HW_SPI2_SCK  (pin_B13)
#define MICROPY_HW_SPI2_MISO (pin_B14)
#define MICROPY_HW_SPI2_MOSI (pin_B15)

用户按键 C13

// USRSW is pulled low. Pressing the button makes the input go high.
#define MICROPY_HW_USRSW_PIN        (pin_C13)
#define MICROPY_HW_USRSW_PULL       (GPIO_NOPULL)
#define MICROPY_HW_USRSW_EXTI_MODE  (GPIO_MODE_IT_FALLING)
#define MICROPY_HW_USRSW_PRESSED    (0)

LED

// LEDs
#define MICROPY_HW_LED1             (pin_C0)   // red
#define MICROPY_HW_LED2             (pin_C1)   // green
#define MICROPY_HW_LED3             (pin_C2)    // blue
#define MICROPY_HW_LED4             (pin_E2) // IR
#define MICROPY_HW_LED_ON(pin)      (mp_hal_pin_low(pin))
#define MICROPY_HW_LED_OFF(pin)     (mp_hal_pin_high(pin))

回到stm32目录 然后再编译

$ cd ..
$ make BOARD=Mini_H743VIT6

编译成功,下载到开发板运行成功。

7.移植到 STM32F411

基于 WeActF411CE 移植成功。

工具链编译

$ cd mpy-cross
$ make

进入stm32目录下编译执行,生成我们所需要的固件DFU或者HEX形式的:

$ cd ../ports/stm32/boards

复制源码WeAct_F411CE

$ cp -r WeAct_F411CE my_WeAct_F411CE

回到stm32目录 然后再编译

~/micropython/ports/stm32 $ make BOARD=my_WeAct_F411CE

编译成功,在stm32目录下会生成一个build-my_WeAct_F411CE文件夹,在文件夹中有对应的烧入或升级文件:

8. 移植到 my_VCC_GND_H743VI

基于VCC_GND_H743VIE 移植成功。

工具链编译

$ cd mpy-cross
$ make

进入stm32目录下编译执行,生成我们所需要的固件DFU或者HEX形式的:

$ cd ../ports/stm32/boards

复制源码 VCC_GND_H743VI

$ cp -r VCC_GND_H743VI my_VCC_GND_H743VI

回到stm32目录 然后再编译

~/micropython/ports/stm32 $ make BOARD=my_VCC_GND_H743VI

编译成功,在stm32目录下会生成一个build-my_VCC_GND_H743VI文件夹,在文件夹中有对应的烧入或升级文件:

Firmware.elf, firmware.hex  是用于烧录的完整固件
firmware0.bin  是bootLoader程序文件
firmware1.bin  是程序app文件
irmware.dfu  是配合ST-DFU工具用的app文件

9. 使用工具进行调试

python tool
工具链编译

$ cd mpy-cross
$ make

进入stm32目录下编译执行,生成我们所需要的固件DFU或者HEX形式的:

$ cd ../ports/stm32/boards

复制源码 VCC_GND_H743VI

$ cp -r VCC_GND_H743VI my_VCC_GND_H743VI

回到stm32目录 然后再编译

~/micropython/ports/stm32 $ make BOARD=my_VCC_GND_H743VI

编译成功,在stm32目录下会生成一个build-my_VCC_GND_H743VI文件夹,在文件夹中有对应的烧入或升级文件:

Firmware.elf, firmware.hex  是用于烧录的完整固件
firmware0.bin  是bootLoader程序文件
firmware1.bin  是程序app文件
irmware.dfu  是配合ST-DFU工具用的app文件

9. 使用工具进行调试

python tool

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

micropython下载及安装编译过程 的相关文章

随机推荐

  • 【SQL基础】SQL增删改查基本语句

    目录 1 SQL 增删改查基本语句 2 select 语句 2 1 select 基本语句 2 2 Select where 语句 2 3 Select order by 语句 2 4 Select group by 语句 3 Select
  • 求解决,ubuntu16.04 文件“桌面/文档/下载/图片…”切换为英文,出现无法打开的空链接文件,错误报告以及显示

    文章参考 ubuntu下面 将汉字桌面 下载 换成 英文 https blog csdn net tanhuanzheng article details 103557287 ubuntu16 04 vmware虚拟机 1 我们可以先将目录
  • Ubuntu 16.04配置国内高速apt-get更新源

    Ubuntu 16 04下载软件速度有点慢 因为默认的是从国外下载软件 那就更换到国内比较好的快速更新源 就是这些软件所在的服务器 一般直接百度Ubuntu更新源就能出来一大堆 这时候最好是找和自己Ubuntu版本一致的更新源 我的Ubun
  • MFC入门基础(九)消息对话框、文件对话框

    一 消息对话框主要是两种CWnd MessageBox 和AfxMessageBox 下面是在按钮点击事件中添加MessageBox的效果 如下 void Ctest02Dlg OnBnClickedAddButton TODO 在此添加控
  • form表单 input输入框及属性

  • 启动Hadoop时一直提示输入密码的问题(SSH配置)

    目录 1 首先检查自己是否有配置本地ssh免密登录 2 另外一种方式 科普 什么是SSH 情况如下图所示 经常弹出要要我输入password 1 首先检查自己是否有配置本地ssh免密登录 a 下载SSH服务 yum install open
  • js vue 使用 map和computed巧妙设计可选列表和已选列表的联动

    需求说明 当已选列表中存在了可选列表的选项 则在可选列表中做出标记 使用map和computed的巧妙写法 otherFiledList是已选数据 fieldList是可选数据 已选数据是可选数据构成的 div i class el ico
  • 16. Dubbo原理解析-集群&容错之router路由服务

    Router服务路由 根据路由规则从多个Invoker中选出一个子集AbstractDirectory是所有目录服务实现的上层抽象 它在list列举出所有invokers后 会在通过Router服务进行路由过滤 Router接口定义 pub
  • 2016——大数据版图

    编者注 原文是 FirstMark Capital 的 Matt Turck 的文章 本文全面总结了大数据领域的发展态势 分析认为尽管大数据作为一个术语似乎已经过气 但是大数据分析与应用才刚刚开始兴起 在与 AI 人工智能等新兴技术的结合下
  • JSON格式转MAP的6种方法

    JSON字符串自动转换 Created by zkn on 2016 8 22 public class JsonToMapTest01 public static void main String args String str 0 zh
  • MySQL中的各种自增ID

    微信搜索 coder home 或扫一扫下面的二维码 关注公众号 第一时间了解更多干货分享 还有各类视频教程资源 扫描它 带走我 文章目录 背景 自增ID的数据类型 单位换算规则 自增ID取值范围 无符号位的计算方式 有符号位的计算方式 i
  • JDialog弹窗

    JDialog弹窗 package com chen lesson4 import javax swing import java awt import java awt event ActionEvent import java awt
  • python后端学习(二)TCP客户端和服务端

    TCP简介 TCP协议 传输控制协议 英语 Transmission Control Protocol 缩写为 TCP 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 TCP通信需要经过创建连接 数据传
  • 14 【接口规范和业务分层】

    14 接口规范和业务分层 1 接口规范 RESTful架构 1 1 什么是REST REST全称是Representational State Transfer 中文意思是表述 编者注 通常译为表征 性状态转移 它首次出现在2000年Roy
  • android EditText 实时监听输入框的内容

    在开发中很多时候我们都会用到EditText 对输入内容的实时监听也是不可或缺的 在android中为我们提供了TextWatcher这个类 我们只要extends这个类然后etColler addTextChangedListener e
  • C#基础知识框架整理

    目录 NET FrameWork框架 NET平台 类库 快速启动vs sln文件的使用 在解决方案里 csprog文件的使用 在项目文件夹里 排除语法错误 设置行号 设置字体 恢复出厂设置 自动切换运行的项目 C 的3种注释符 C 常用的快
  • 浙大计算机学院博士毕业论文要求,浙大在读博士需要3篇SCI 论文才能毕业,清华博士却不作要求!...

    原标题 浙大在读博士需要3篇SCI 论文才能毕业 清华博士却不作要求 最近 又进入了一年的秋招季 很多学子纷纷加入求职大军之中 但是今年却有不一样的声音 有在读研究生表示 学校对毕业要求提高 要在专业期刊发表论文 这成了比找工作更让人烦心的
  • Java整合七牛云进行文件的上传与下载

    一 七牛云的对象存储的介绍 七牛云对象存储 Kodo 是七牛云提供的高可靠 强安全 低成本 可扩展的存储服务 您可通过控制台 API SDK 等方式简单快速地接入七牛存储服务 实现海量数据的存储和管理 通过 Kodo 可以进行文件的上传 下
  • Filter与Listener

    目录 Filter 1 Filter概念 2 Filter快速入门 3 Filter细节 1 web xml配置 2 Filter执行流程 3 Filter生命周期方法 4 Filter配置详解 拦截路径配置 拦截方式配置 1 注解配置 2
  • micropython下载及安装编译过程

    本文根据 参考文献 实现基于Black F407VE开发板的micropython移植 为后期 stm32H743的 micropython作准备 参考 http docs micropython org en latest 1 下载mic