MicroPython-TPYBoard固件编译教程

11 篇文章 3 订阅
7 篇文章 0 订阅

本文主要介绍一下,在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

2

3

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

 

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

2

3

4

5

6

/// 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最后的数字跟参数的数量相对应。

 

1

STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);

  

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

 

1

2

3

4

5

6

7

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对象,遵循以下原则。

 

1

2

3

4

5

6

7

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文件,内容如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#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文件,内容如下:

 

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

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,输入以下内容:

 

1

pyb.tpyboard.display()

  

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值