查看: 125|回复: 0

[教程] MicroPython-TPYBoard固件编译教程

[复制链接]

45

主题

0

好友

629

积分

举人

Rank: 4

  • TA的每日心情
    开心
    2016-9-7 16:50
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-8-18 10:48:37 |显示全部楼层
      本文主要介绍一下,在Linux环境下编译micropython固件的方法和流程。

      首先,我们先来看一下MicroPython的源码结构。

      github地址:https://github.com/micropython/micropython

    1.png

      你会发现,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
    复制代码
    2.png

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

    3.png

      3、开始编译

      切换到stmhal目录
    1. cd /opt/micropython/stmhal
    复制代码
    执行编译命令,等待编译完成。
    1. make BOARD=PYBV10
    复制代码
    BOARD参数为stmhal/boards/目录下相应的开发板名称。

      本次教程用的是TPYBoardv102(蓝色)开发板,兼容PYBV10,所以选择PYBV10开发板继续编译。

      若是TPYBoardv102(绿色)基础板,同样选择PYBV10。

      若是TPYBoardv102(黑色)开发板,需选择PYBV11。

    4.png

      编译成功。生成的固件文件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()
    复制代码
    5.png



    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-9-26 11:45 , Processed in 0.381921 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部