在实际开发中,难免会遇到编译Micropython源码的情况:比如当前固件损坏、固件版本升级、需要裁剪固件节省空间等。本文介绍在Linux环境中编译Micropython源码并下载到TPYBoard运行的流程。
获取Micropython源码
Linux环境下获取Micropython源码非常简单,使用git clone:
git clone https://github.com/micropython/micropython.git
安装arm-none-eabi交叉编译器
到 官网 下载arm-none-eabi安装包,我使用的是gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2。
解压:tar jxvf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
解压后生成目录gcc-arm-none-eabi-5_4-2016q3,编译器指令在bin目录中。
将交叉编译器加入环境变量:
在/etc/profile文件末尾添加export PATH=/opt/mpy_compiler/gcc-arm-none-eabi-5_4-2016q3/bin:$PATH
执行source /etc/profile
输入arm-none-eabi-gcc -v验证编译器安装、设置结果,能够成功返回编译器信息则表示安装成功。
X86 Linux GCC版本约定
我使用的centos默认gcc版本为4.4.7,在编译mpy-cross过程中报错:py/objdict.c:473: error: dereferencing pointer ‘o’ does break strict-aliasing rules,原因是编译器版本太低,因此将gcc编译器升级到4.8。
升级步骤如下:
wget http://people.centos.org/tru/devtools-2/devtools-2.repo
mv devtools-2.repo /etc/yum.repos.d
yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
安装之后编译器指令路径为:/opt/rh/devtoolset-2/root/usr/bin
备份旧版本,为编译器建立新的软链接:
mv /usr/bin/gcc /usr/bin/gcc-4.4.7
mv /usr/bin/g++ /usr/bin/g++-4.4.7
mv /usr/bin/c++ /usr/bin/c++-4.4.7
ln -s /opt/rh/devtoolset-2/root/usr/bin/gcc /usr/bin/gcc
ln -s /opt/rh/devtoolset-2/root/usr/bin/c++ /usr/bin/c++
ln -s /opt/rh/devtoolset-2/root/usr/bin/g++ /usr/bin/g++
查看gcc版本:
[root@donkey bin]# gcc --version
gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
编译mpy-cross
mpy-cross是Micropython自身的交叉编译器,编译固件之前需要先编译mpy-cross。cd mpy-crossmake编译完成生成命令mpy-cross:
CC main.c
CC gccollect.c
LINK mpy-cross
text data bss dec hex filename
133582 784 872 135238 21046 mpy-cross
编译stmhal
stmhal为Micropython针对STM32的实现,因此编译该目录的代码生成固件。
目前Micropython支持STM32的多种型号,这些型号的定义在目录/stmhal/boards中,需要在Makefile中修改型号。本例中Makefile定义如下:
BOARD ?= PYBV10
进入stmhal目录进行编译:
cd stmhal
make
LINK build-PYBV10/firmware.elf
text data bss dec hex filename
321020 352 28088 349460 55514 build-PYBV10/firmware.elf
Create build-PYBV10/firmware.dfu
Create build-PYBV10/firmware.hex
编译后生成.dfu和.hex固件:
[root@donkey build-PYBV10]# pwd
/opt/micropython/stmhal/build-PYBV10
[root@donkey build-PYBV10]# ls firmware*
firmware0.bin firmware1.bin firmware.dfu firmware.elf firmware.hex firmware.map
[root@donkey build-PYBV10]# du -h firmware.dfu
316K firmware.dfu
下载固件
下载方式有SWD ST-Link和DFU两种,前者依赖ST-Link硬件,因此建议通过USB使用DFU模式烧写固件,该方法非常简便。
安装DfuSedemo工具,运行。
将TPYBoard开发板的BOOT0和3.3V引脚短接,BOOT0引脚即DFU。
按下RST键,释放RST键。
断开BOOT0和3.3V。
此时DfuSedemo工具左上角的"Available DFU and compatible HID Devices"会识别到开发板。
点击"Choose..." 选择编译好的.dfu文件,点击"Upgrade"进行固件烧写。
提示"Upgrade successful!"则固件烧写成功,重启TPYBoard,此时将运行新的固件。