MicroPython项目支持多个不同的MCU或平台,他们在 MicroPython的port 目录里面。当我们的项目能够在port 目录里面找到支持的单片机时,我们可以直接应用port 目录里面的工程,但是当port 目录里面没有支持我们的单片机时,就需要我们自己移植MicroPython到相应的的单片机上。
  通常来说,向单片机移植MicroPython时需要的工作有:
  1、设置工具链(配置 Makefile 等)
  2、初始化CPU和编写bootloader
  3、初始化一切开发和调试所需的基本驱动程序(例如 GPIO、UART)。
  4、编写特定的配置
  5、实现单片机的modules。
  下面以一个最小的MicroPython 固件为演示案例:
  在port 目录下创建一个example_port文件夹,该文件夹就是放置工程文件的地方。该文件夹最少要包含5个文件,分别为main.c、 Makefile、mpconfigport.h、 mphalport.c、 mphalport.h。结构如下:

ports/example_port/
├── main.c
├── Makefile
├── mpconfigport.h
├── mphalport.c
└── mphalport.h

  其中main.c文件是工程的主文件,Makefile是编译文件,mpconfigport.h文件的作用是MicroPython 配置文件,mphalport.c是单片机特有的一些其他配置,mphalport.c文件的作用是实现标准输入/输出。

一、各文件代码内容

1.1、main.c文件

#include "py/compile.h"
#include "py/gc.h"
#include "py/mperrno.h"
#include "py/stackctrl.h"
#include "lib/utils/gchelper.h"
#include "lib/utils/pyexec.h"// Allocate memory for the MicroPython GC heap.
static char heap[4096];int main(int argc, char **argv) {// Initialise the MicroPython runtime.mp_stack_ctrl_init();gc_init(heap, heap + sizeof(heap));mp_init();mp_obj_list_init(MP_OBJ_TO_PTR(mp_sys_path), 0);mp_obj_list_init(MP_OBJ_TO_PTR(mp_sys_argv), 0);// Start a normal REPL; will exit when ctrl-D is entered on a blank line.pyexec_friendly_repl();// Deinitialise the runtime.gc_sweep_all();mp_deinit();return 0;
}// Handle uncaught exceptions (should never be reached in a correct C implementation).
void nlr_jump_fail(void *val) {for (;;) {}
}// Do a garbage collection cycle.
void gc_collect(void) {gc_collect_start();gc_helper_collect_regs_and_stack();gc_collect_end();
}// There is no filesystem so stat'ing returns nothing.
mp_import_stat_t mp_import_stat(const char *path) {return MP_IMPORT_STAT_NO_EXIST;
}// There is no filesystem so opening a file raises an exception.
mp_lexer_t *mp_lexer_new_from_file(const char *filename) {mp_raise_OSError(MP_ENOENT);
}

1.2、Makefile文件

# Include the core environment definitions; this will set $(TOP).
include ../../py/mkenv.mk# Include py core make definitions.
include $(TOP)/py/py.mk# Set CFLAGS and libraries.
CFLAGS = -I. -I$(BUILD) -I$(TOP)
LIBS = -lm# Define the required source files.
SRC_C = \main.c \mphalport.c \lib/mp-readline/readline.c \lib/utils/gchelper_generic.c \lib/utils/pyexec.c \lib/utils/stdout_helpers.c \# Define the required object files.
OBJ = $(PY_CORE_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))# Define the top-level target, the main firmware.
all: $(BUILD)/firmware.elf# Define how to build the firmware.
$(BUILD)/firmware.elf: $(OBJ)$(ECHO) "LINK $@"$(Q)$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)$(Q)$(SIZE) $@# Include remaining core make rules.
include $(TOP)/py/mkrules.mk

1.3、mpconfigport.h文件

#include <stdint.h>// Python internal features.
#define MICROPY_ENABLE_GC                       (1)
#define MICROPY_HELPER_REPL                     (1)
#define MICROPY_ERROR_REPORTING                 (MICROPY_ERROR_REPORTING_TERSE)
#define MICROPY_FLOAT_IMPL                      (MICROPY_FLOAT_IMPL_FLOAT)// Fine control over Python builtins, classes, modules, etc.
#define MICROPY_PY_ASYNC_AWAIT                  (0)
#define MICROPY_PY_BUILTINS_SET                 (0)
#define MICROPY_PY_ATTRTUPLE                    (0)
#define MICROPY_PY_COLLECTIONS                  (0)
#define MICROPY_PY_MATH                         (0)
#define MICROPY_PY_IO                           (0)
#define MICROPY_PY_STRUCT                       (0)// Type definitions for the specific machine.typedef intptr_t mp_int_t; // must be pointer size
typedef uintptr_t mp_uint_t; // must be pointer size
typedef long mp_off_t;// We need to provide a declaration/definition of alloca().
#include <alloca.h>// Define the port's name and hardware.
#define MICROPY_HW_BOARD_NAME "example-board"
#define MICROPY_HW_MCU_NAME   "unknown-cpu"#define MP_STATE_PORT MP_STATE_VM#define MICROPY_PORT_ROOT_POINTERS \const char *readline_hist[8];

1.4、mphalport.h文件

static inline void mp_hal_set_interrupt_char(char c) {}

1.5、mphalport.c文件

#include <unistd.h>
#include "py/mpconfig.h"// Receive single character, blocking until one is available.
int mp_hal_stdin_rx_chr(void) {unsigned char c = 0;int r = read(STDIN_FILENO, &c, 1);(void)r;return c;
}// Send the string of given length.
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {int r = write(STDOUT_FILENO, str, len);(void)r;
}

二、添加module

  要添加一个自定义module名字为myport,首先在文件夹中添加module定义的文件名字为modmyport.c

#include "py/runtime.h"STATIC mp_obj_t myport_info(void) {mp_printf(&mp_plat_print, "info about my port\n");return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(myport_info_obj, myport_info);STATIC const mp_rom_map_elem_t myport_module_globals_table[] = {{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_myport) },{ MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&myport_info_obj) },
};
STATIC MP_DEFINE_CONST_DICT(myport_module_globals, myport_module_globals_table);const mp_obj_module_t myport_module = {.base = { &mp_type_module },.globals = (mp_obj_dict_t *)&myport_module_globals,
};MP_REGISTER_MODULE(MP_QSTR_myport, myport_module, 1);

  编写完modmyport.c文件后,还需要再次编辑 Makefile ,作用是添加modmyport.c到SRC_C列表中。如下所示:

SRC_C = \main.c \modmyport.c \mphalport.c \...SRC_QSTR += modport.c

移植 MicroPython相关推荐

  1. STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM

    文章目录 一.搭建编译环境 二.修改源码 1.复制源码 2.修改源码 2.1修改mpconfigboard.h文件 2.2修改stm32h7xx_hal_conf.h文件 2.3修改pins.csv文 ...

  2. 在STM32F401RE(小钢炮CANNON开发板)移植MicroPython

    版权声明:本文为博主原创文章,未经博主允许不得转载. 小钢炮开发板STM32F401RE的MCU支持MicroPython,手头恰好有一块.因为在众多支持MicroPython的STM32芯片中数他性 ...

  3. micropython移植教程_移植MicroPython到NUCLEO_L476RG开发板

    在最新的 MicroPython 源码中,已经加入了STM32L476DISC开发板,但是还没有NUCLEO-L476RG开发板.而我只有NUCLEO-L476RG开发板,要在NUCLEO-L476R ...

  4. micropython stm32f401_在STM32F401RE(小钢炮CANNON开发板)移植MicroPython

    首先在树莓派下载并安装gcc编译器. sudo apt-get install gcc sudo apt-get install gcc-arm-none-eabi 下载MicroPython源码(h ...

  5. esp32c3 nuttx 移植 micropython 尝试

    源码来自 https://github.com/apache/incubator-nuttx-apps/pull/840 和 https://github.com/apache/incubator-n ...

  6. MM32F3277 MicroPython移植过程中对应的接口文件

    简 介: 给出了在MM32移植MicroPython过程中基础语法中Pin相关的内容. 关键词: MM32F3277,machine,Pin §01 MacinePin /* machine_pin. ...

  7. STM32 进阶教程 1 - micropython 移植

    前言 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.具有如下特点: 1.易于学习:Python有相 ...

  8. STM32F767ZI-NUCLEO移植运行micropython过程记录

    注意,本教程移植microPython是通过烧写hex文件实现的,网上其他教程很多是介绍使用USB DFU方式(设备boot0至高电平,通过DfuSeDemo烧写),由于自己还不熟没有使用这种方式,后 ...

  9. 测试在MicroPython中对于main.py进行修改

    简 介: 编写了python脚本程序,它可以自动生成MicroPython内部执行程序,借助于STM32-BOOTLOADER通过REPL发送MicroPython, 由MicroPython完成对S ...

最新文章

  1. iphone屏蔽系统更新_iPhone 屏蔽系统更新教程,支持 iOS13 / iOS12 系统
  2. VS和Eclipse自动注释比较
  3. Pandas的学习(4.DataFrame之间的运算以及DataFrame和Series之间的运算)
  4. 如何洗脸才正确?洗脸也有讲究 - 生活至上,美容至尚!
  5. python编码效率高吗_【原创】杠精的日常-讨论python快排的效率
  6. [LOJ6278]数列分块入门 2
  7. MS SQL 语句中的字符串连接
  8. 清华大学计算机信息学院舒教授,清华大学出计算机与信息分社.ppt
  9. 基于OpenCV的银行卡号识别系统实现(一)----- 银行卡号识别步骤
  10. 反病毒工具-PEiD
  11. 香港保险和内地保险的利与弊,有什么区别?
  12. 优秀的 icon 的免费网站,看这篇就够了
  13. PHP h5付款到支付宝账户
  14. python re.compile() 详解——Python正则表达式
  15. 关于实验室信息管理系统(LIMS)三大问题
  16. 微信小程序使用echarts绘画动态图表
  17. 西乡中学2021艺体生高考成绩查询,2019年西乡中学特长生评分标准
  18. PlusFo小道消息独家报道,与黑子的争霸谁能更胜一筹
  19. Oracle进阶篇之查看执行计划
  20. 【Paddle打比赛】全球人工智能技术创新大赛-商品标题实体识别竞赛_副本

热门文章

  1. 块设备驱动之NOR FLASH驱动
  2. 《软件设计的6大设计原则》
  3. 引用传递(passing by references) 在C语言和C++中的区别
  4. 百度登录password参数
  5. Ubuntu19.10如何消除登录微信后弹出的Wine system tray窗口
  6. Arduino使用高感度声音模块
  7. 伪元素写竖线_CSS的伪类和伪元素
  8. 量化交易初级阶段——简单多因子策略实现指数增强
  9. DSP与单片机各自优势与比较
  10. python:基于朴素贝叶斯算法的垃圾邮件过滤分类