zoukankan      html  css  js  c++  java
  • 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
    ");
        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()
    

      

      

  • 相关阅读:
    设计模式 — 责任链模式
    BlockingQueue 阻塞队列(生产/消费者队列)
    DDD工作流持久化(十六)
    js中匿名函数和回调函数
    DDD模型领域WF到领域层(十五)
    DDD领域模型系统的工作流(十四)
    DDD领域模型数据访问权限之权限(十二)
    DDD领域模型数据访问之对象(十一)
    DDD领域模型数据访问权限之用户权限(十)
    DDD领域模型数据访问权限(九)
  • 原文地址:https://www.cnblogs.com/xxosu/p/7389871.html
Copyright © 2011-2022 走看看