MicroPython-TPYBoard固件编译教程
本文主要介绍一下,在Linux环境下编译micropython固件的方法和流程。
首先,我们先来看一下MicroPython的源码结构。
github地址:https://github.com/micropython/micropython
你会发现,micropython根据不同的MCU运行平台进行了分类,比如esp8266目录下就是esp8266-WIFI模块上的micropython的源码,stmhal是运行在stm32上的,还有cc3200等。
py/ |
Python实现的核心部分,包括编译器、运行时、核心库 |
mpy-cross/ |
MicroPython 自带的交叉编译器,可以将python脚本编译为mpy加密文件 |
unix/ |
在UNIX上运行的MicroPython |
stmhal/ |
在TPYBoard和类似的STM32开发板上运行的MicroPython |
minimal/ |
MicroPthon的最小集,用于移植到其他微处理器 |
tests/ |
测试框架和测试脚本 |
docs/ |
MicroPython官方的reStructuredText文档资料。地址:http://docs.micropython.org |
bare-arm/ |
在ARM上MicroPython的最小版本 |
teensy/ |
在Teensy 3.1上运行的MicroPython |
pic16bit/ |
在16 位 PIC 微控制器上运行的MicroPython |
esp8266/ |
在ESP8266 WIFI模块上运行的MicroPython |
extmod/ |
C 实现的模块 |
tools/ |
各种工具 |
examples/ |
Python脚本实例 |
READ.md |
说明文档 |
开始编译固件
本人的系统环境:ubuntu15.0464位系统
Ubuntu官网:http://cn.ubuntu.com/?_ga=2.264511627.56850772.1502953593-1795108721.1502953593
1、安装arm-none-eabi-gcc交叉编译工具和gcc编译器
打开终端执行命令
sudo apt-get install gcc-arm-none-eabi sudo apt-get install gcc
2、下载micropython的源码包
我放在了/opt目录下
git clone --recursive https://github.com/micropython/micropython.git
等待git完毕,进入stmhal/boards/目录下,里面又根据不同型号的芯片进行了分类。
3、开始编译
切换到stmhal目录
cd /opt/micropython/stmhal
执行编译命令,等待编译完成。
make BOARD=PYBV10
BOARD参数为stmhal/boards/目录下相应的开发板名称。
本次教程用的是TPYBoardv102(蓝色)开发板,兼容PYBV10,所以选择PYBV10开发板继续编译。
若是TPYBoardv102(绿色)基础板,同样选择PYBV10。
若是TPYBoardv102(黑色)开发板,需选择PYBV11。
编译成功。生成的固件文件stmhal/build-PYBV10/firmware.dfu和firmware.hex。
4、烧写固件
请参考教程:http://tpyboard.com/support/reference11/302.html
增加自定义类库
使用过micropython的小伙伴都知道,里面有一个重要的模块pyb。下面我们就尝试在micropython源码中新建一个名为tpyboard的pyb子类,里面添加一个简单的函数display,输出一句”HelloTPYBoard”。
5、首先大体来看一下stmhal目录下的各种.c和.h文件。基本上根据他们的名称就能判断出功能来。
6、先来参考一下led.c文件,了解一下大体的流程。
找到了led_obj_on函数,这就是我们平时用的pyb.LED(1).on()
/// Turn the LED on
mp_obj_t led_obj_on(mp_obj_t self_in) {
pyb_led_obj_t *self = self_in;
led_state(self->led_id, 1);
return mp_const_none;
}
声明注册一下on函数,MP_DEFINE_CONST_FUN_OBJ_1最后的数字跟参数的数量相对应。
STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
再往下可以看到led_locals_dict_table,将上面声明的函数添加到led模块函数字典中。
STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj) },
{ MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj) },
{ MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj) },
{ MP_ROM_QSTR(MP_QSTR_intensity), MP_ROM_PTR(&led_obj_intensity_obj) },
};
STATIC MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);
建立micropython对象,遵循以下原则。
const mp_obj_type_t pyb_led_type = {
{ &mp_type_type },
.name = MP_QSTR_LED,
.print = led_obj_print,
.make_new = led_obj_make_new,
.locals_dict = (mp_obj_dict_t*)&led_locals_dict,
};
7、接下来我们在stmhal目录下新建一个tpyboard.c文件,内容如下:
#include <stdio.h> #include "py/nlr.h"
#include "py/runtime.h"
#include "py/mphal.h" mp_obj_t tpyboard_obj_display() { printf("Hello TPYBoard\n");
return mp_const_none;
} STATIC MP_DEFINE_CONST_FUN_OBJ_0(tpyboard_obj_display_obj, tpyboard_obj_display); STATIC const mp_rom_map_elem_t tpyboard_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_display), MP_ROM_PTR(&tpyboard_obj_display_obj) }, }; STATIC MP_DEFINE_CONST_DICT(tpyboard_locals_dict, tpyboard_locals_dict_table);
const mp_obj_type_t pyb_tpyboard_type = {
{ &mp_type_type },
.name = MP_QSTR_tpyboard,
.locals_dict = (mp_obj_dict_t*)&tpyboard_locals_dict,
};
8、新建tpyboard.h文件,内容如下:
extern const mp_obj_type_t pyb_tpyboard_type;
找到modpyb.c文件,将tpybaord子模块添加到pyb的pyb_module_globals_table[]子类表中。
{ MP_ROM_QSTR(MP_QSTR_tpyboard), MP_ROM_PTR(&pyb_tpyboard_type) },
记得在modpyb.c中添加tpyboard.h的引用。
#include "tpyboard.h"
9、添加完毕后,将tpyboard.c文件添加到Makefile文件中,进行编译。我就直接放到了led.c\下面。
SRC_C = \
main.c \
system_stm32.c \
stm32_it.c \
usbd_conf.c \
usbd_desc.c \
usbd_cdc_interface.c \
usbd_hid_interface.c \
usbd_msc_storage.c \
mphalport.c \
mpthreadport.c \
irq.c \
pendsv.c \
systick.c \
pybthread.c \
timer.c \
led.c \
tpyboard.c \
pin.c \
pin_defs_stmhal.c \
pin_named_pins.c \
bufhelper.c \
dma.c \
i2c.c \
spi.c \
uart.c \
can.c \
usb.c \
wdt.c \
gccollect.c \
help.c \
machine_i2c.c \
modmachine.c \
modpyb.c \
modstm.c \
moduos.c \
modutime.c \
modusocket.c \
modnetwork.c \
extint.c \
usrsw.c \
rng.c \
rtc.c \
flash.c \
storage.c \
sdcard.c \
fatfs_port.c \
lcd.c \
accel.c \
servo.c \
dac.c \
adc.c \
$(wildcard boards/$(BOARD)/*.c)
10、执行命令开始编译,编译通过,重新将编译好的固件烧写到TPYBoard开发板上。
11、烧写完毕后,用putty连接TPYBoardv102,输入以下内容:
pyb.tpyboard.display()
MicroPython-TPYBoard固件编译教程的更多相关文章
- MicroPython最全资料集锦丨TPYBoard全系列教程之文档+例程源码
MicroPython成功将Python引入到嵌入式领域,近几年MicroPython的发展和普及也证明,Python无疑将在未来几年内快速抢占和蚕食C/C++的份额.包括现在比较火爆的机器人.无人机 ...
- ESP32-S3 搭建 micropython 开发环境,固件编译,烧录
简述 上手了一块乐鑫科技官方推出的ESP32-S3-DevKitC-1开发板,发现 ESP32-S3 的综合性能较比前两代有着非常明显的提升,wifi与蓝牙功能,更充足的外设扩展能力,可以看出其在未来 ...
- MicroPython TPYBoard v702实现HTTP应用功能
[Micropython]TPYBoard v702 HTTP应用功能 转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:Micro ...
- CM12同步源码及编译教程
同时提供基于安卓5.0的MKL魔趣猪扒饭编译教程~[玩机组出品]魔趣猪扒饭MKL50.1编译教程http://www.oneplusbbs.com/forum.php?mod=viewthread&a ...
- Android反编译教程
本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...
- 给hackrf加上1602LCD以及UART(附带固件编译方法)
代码库(在hackrf原代码库基础上只添了两个文件,改了一个文件): https://github.com/JiaoXianjun/hackrf-UART-1602LCD 目的主要是为了帮助想更改调试 ...
- DevExpress Components16.2.6 Source Code 重编译教程
DevExpress 是一个比较有名的界面控件套件,提供了一系列优秀的界面控件.这篇文章将展示如何在拥有源代码的情况下,对 DevExpress 的程序集进行重新编译. 特别提示:重编译后,已安装好的 ...
- WNDR4300v2 固件编译
WNDR4300v2 固件编译 1.从官网下载源码 从官网找到 https://kb.netgear.com/2649/NETGEAR-Open-Source-Code-for-Programme ...
- gRPC编译教程
windows平台的编译 一.编译openssl ① 安装perl(可以使用ActivePerl),执行perl Configure VC-WIN64A no-asm .在这里解释一下参数含义,VC- ...
随机推荐
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...
- 自学Python全栈开发第一次笔记
我已经跟着视频自学好几天Python全栈开发了,今天决定听老师的,开始写blog,听说大神都回来写blog来记录自己的成长. 我特别认真的跟着这个视频来学习,(他们开课前的保证书,我也写 ...
- 酷狗歌曲缓存kgtemp转mp3工具
一直用网易音乐听歌,不过网易的歌曲版权确实是少了一些,在酷狗上可以找到,但收费歌曲只能试听不能下载. 寻找方案 从设置里可以看出,酷狗会设置缓存目录,试听的歌曲存放到这个缓存里. 打开缓存目录: 可以 ...
- Android Studio怎样选择查看指定进程的log?
今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...
- C# 文件去仅仅读工具-线程-技术&分享
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Hive修改行级别数据
我们知道Hive0.14版本之前是不支持行级别的插入,更新,删除的,0.14版本之后可以通过修改相关配置得以支持,但是在不修改默认配置的情况下是不是完全没有办法呢?不是的,这里有个比较简单的方法,前提 ...
- SharePoint Framework 简介
作者:陈希章 发表于 2017年12月25日 前言 通过前面几篇文章,我相信大家对于SharePoint Online的开发有了更加全面的认识,上一篇 介绍的SharePoint Add-in的开发, ...
- Python爬虫Scrapy(二)_入门案例
本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...
- Bandit Wargame Level18 Writeup(interactive shell and .bashrc )
Bandit Level 18 → Level 19 Level Goal The password for the next level is stored in a file readme in ...
- Asynchronous vs synchronous client applications(MQTT)
来自我的CSDN博客 想查看英文原文的请点击原文网址.在上两篇翻译中,Homejim我给大家分别翻译了同步客户端应用程序和异步客户端应用程序.本人对这两个的区别也有困惑,因此将paho下的这个比较 ...