micropython下载及安装编译过程

本文根据 参考文献, 实现基于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:

micropython下载及安装编译过程_第1张图片

#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 引脚配置文件,第一列是名称,第二列是别名。
micropython下载及安装编译过程_第2张图片

删除蓝灯和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配置的:

micropython下载及安装编译过程_第3张图片

// 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

你可能感兴趣的:(MicroPython,python,c语言,stm32)