本文根据 参考文献, 实现基于Black_F407VE开发板的micropython移植,为后期 stm32H743的 micropython作准备。 参考 http://docs.micropython.org/en/latest/
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 (跟网络速度有关,要点时间)
也可以从这里下载。
工具链编译
$ 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文件来下载程序到开发板.
使用 Black_F407VE开发板,修改 stm32f4xx_hal_conf.h 外部晶振为8M:
......
// Oscillator values in Hz
#define HSE_VALUE (8000000) //修改这里
......
将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);
}
这也是需要修改最多的文件。
首先修改名称:
#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)
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
安装并打开串口调试工具,设置管理器中看到的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()
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
编译成功,下载到开发板运行成功。
基于 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文件夹,在文件夹中有对应的烧入或升级文件:
基于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文件
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文件
python tool