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

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM