极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14645|回复: 0

MicroPython-TPYBoard固件编译教程

[复制链接]
发表于 2017-8-18 13:50:04 | 显示全部楼层 |阅读模式
  本文主要介绍一下,在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编译器

  打开终端执行命令

  1. sudo apt-get install gcc-arm-none-eabi

  2. sudo apt-get install gcc
复制代码


  2、下载micropython的源码包

  我放在了/opt目录下


  1. git clone --recursive https://github.com/micropython/micropython.git
复制代码



  等待git完毕,进入stmhal/boards/目录下,里面又根据不同型号的芯片进行了分类。



  3、开始编译

  切换到stmhal目录

  1. cd /opt/micropython/stmhal
复制代码


  执行编译命令,等待编译完成。

  1. 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()

  1. /// Turn the LED on
  2. mp_obj_t led_obj_on(mp_obj_t self_in) {
  3.     pyb_led_obj_t *self = self_in;
  4.     led_state(self->led_id, 1);
  5.     return mp_const_none;
  6. }
复制代码


  声明注册一下on函数,MP_DEFINE_CONST_FUN_OBJ_1最后的数字跟参数的数量相对应。

  1. STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
复制代码


  再往下可以看到led_locals_dict_table,将上面声明的函数添加到led模块函数字典中。

  1. STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {
  2.     { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj) },
  3.     { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj) },
  4.     { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj) },
  5.     { MP_ROM_QSTR(MP_QSTR_intensity), MP_ROM_PTR(&led_obj_intensity_obj) },
  6. };
  7. STATIC MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);
复制代码


  建立micropython对象,遵循以下原则。

  1. const mp_obj_type_t pyb_led_type = {
  2.     { &mp_type_type },
  3.     .name = MP_QSTR_LED,
  4.     .print = led_obj_print,
  5.     .make_new = led_obj_make_new,
  6.     .locals_dict = (mp_obj_dict_t*)&led_locals_dict,
  7. };
复制代码


  7、接下来我们在stmhal目录下新建一个tpyboard.c文件,内容如下:


  1. #include <stdio.h>

  2. #include "py/nlr.h"
  3. #include "py/runtime.h"
  4. #include "py/mphal.h"

  5. mp_obj_t tpyboard_obj_display() {

  6.     printf("Hello TPYBoard\n");
  7.     return mp_const_none;
  8. }

  9. STATIC MP_DEFINE_CONST_FUN_OBJ_0(tpyboard_obj_display_obj, tpyboard_obj_display);

  10. STATIC const mp_rom_map_elem_t tpyboard_locals_dict_table[] = {

  11.     { MP_ROM_QSTR(MP_QSTR_display), MP_ROM_PTR(&tpyboard_obj_display_obj) },

  12. };

  13. STATIC MP_DEFINE_CONST_DICT(tpyboard_locals_dict, tpyboard_locals_dict_table);
  14. const mp_obj_type_t pyb_tpyboard_type = {
  15.     { &mp_type_type },
  16.     .name = MP_QSTR_tpyboard,
  17.     .locals_dict = (mp_obj_dict_t*)&tpyboard_locals_dict,
  18. };
复制代码


  8、新建tpyboard.h文件,内容如下:

  1. extern const mp_obj_type_t pyb_tpyboard_type;
复制代码


  找到modpyb.c文件,将tpybaord子模块添加到pyb的pyb_module_globals_table[]子类表中。

  1. { MP_ROM_QSTR(MP_QSTR_tpyboard), MP_ROM_PTR(&pyb_tpyboard_type) },
复制代码


  记得在modpyb.c中添加tpyboard.h的引用。

  1. #include "tpyboard.h"
复制代码


  9、添加完毕后,将tpyboard.c文件添加到Makefile文件中,进行编译。我就直接放到了led.c\下面。

  1. SRC_C = \
  2.         main.c \
  3.         system_stm32.c \
  4.         stm32_it.c \
  5.         usbd_conf.c \
  6.         usbd_desc.c \
  7.         usbd_cdc_interface.c \
  8.         usbd_hid_interface.c \
  9.         usbd_msc_storage.c \
  10.         mphalport.c \
  11.         mpthreadport.c \
  12.         irq.c \
  13.         pendsv.c \
  14.         systick.c  \
  15.         pybthread.c \
  16.         timer.c \
  17.         led.c \
  18.         tpyboard.c \
  19.         pin.c \
  20.         pin_defs_stmhal.c \
  21.         pin_named_pins.c \
  22.         bufhelper.c \
  23.         dma.c \
  24.         i2c.c \
  25.         spi.c \
  26.         uart.c \
  27.         can.c \
  28.         usb.c \
  29.         wdt.c \
  30.         gccollect.c \
  31.         help.c \
  32.         machine_i2c.c \
  33.         modmachine.c \
  34.         modpyb.c \
  35.         modstm.c \
  36.         moduos.c \
  37.         modutime.c \
  38.         modusocket.c \
  39.         modnetwork.c \
  40.         extint.c \
  41.         usrsw.c \
  42.         rng.c \
  43.         rtc.c \
  44.         flash.c \
  45.         storage.c \
  46.         sdcard.c \
  47.         fatfs_port.c \
  48.         lcd.c \
  49.         accel.c \
  50.         servo.c \
  51.         dac.c \
  52.         adc.c \
  53.         $(wildcard boards/$(BOARD)/*.c)
复制代码


  10、执行命令开始编译,编译通过,重新将编译好的固件烧写到TPYBoard开发板上。

  11、烧写完毕后,用putty连接TPYBoardv102,输入以下内容:

  1. pyb.tpyboard.display()
复制代码




  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 07:20 , Processed in 0.041701 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表