本文主要介紹一下,在Linux環境下編譯micropython固件的方法和流程。
首先,我們先來看一下MicroPython的源碼結構。
github地址:https://github.com/micropython/micropython
1.png (77.93 KB, 下載次數: 50)
下載附件
2017-8-18 10:55 上傳
你會發現,micropython根據不同的MCU運行平臺進行了分類,比如esp8266目錄下就是esp8266-WIFI模塊上的micropython的源碼,stmhal是運行在stm32上的,還有cc3200等。
py/ | Python實現的核心部分,包括編譯器、運行時、核心庫 | | MicroPython 自帶的交叉編譯器,可以將python腳本編譯為mpy加密文件 | | | | 在TPYBoard和類似的STM32開發板上運行的MicroPython | | MicroPthon的最小集,用于移植到其他微處理器 | | | | | | | | 在Teensy 3.1上運行的MicroPython | | 在16 位 PIC 微控制器上運行的MicroPython | | 在ESP8266 WIFI模塊上運行的MicroPython | | | | | | | | |
開始編譯固件
本人的系統環境:ubuntu15.0464位系統
Ubuntu官網:http://cn.ubuntu.com/?_ga=2.2645 ... 95108721.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
復制代碼
2.png (112.54 KB, 下載次數: 56)
下載附件
2017-8-18 10:56 上傳
等待git完畢,進入stmhal/boards/目錄下,里面又根據不同型號的芯片進行了分類。
3.png (179.79 KB, 下載次數: 62)
下載附件
2017-8-18 10:57 上傳
3、開始編譯
切換到stmhal目錄
- cd /opt/micropython/stmhal
復制代碼
執行編譯命令,等待編譯完成。
BOARD參數為stmhal/boards/目錄下相應的開發板名稱。
本次教程用的是TPYBoardv102(藍色)開發板,兼容PYBV10,所以選擇PYBV10開發板繼續編譯。
若是TPYBoardv102(綠色)基礎板,同樣選擇PYBV10。
若是TPYBoardv102(黑色)開發板,需選擇PYBV11。
4.png (94.67 KB, 下載次數: 58)
下載附件
2017-8-18 10:57 上傳
編譯成功。生成的固件文件stmhal/build-PYBV10/firmware.dfu和firmware.hex。
4、燒寫固件
請參考教程: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的引用。
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,輸入以下內容:
5.png (24.44 KB, 下載次數: 66)
下載附件
2017-8-18 11:00 上傳
|