micropython入门教程,micropython中文教程
任务点1。框架1。目录结构2 .测试文件夹3接口2。编译固件1。编译环境2。编译Micropython 3附带的交叉编译器3构建和升级。添加C接口module1.ports/stm32创建一个新的modtest.c,用户自定义模块主文件名自定义1.1代码实现1.2。模型说明2.modules.c添加到Makefile对应位置3 .注册到micropython的模块4 .添加C接口为模块1添加函数无参数函数。添加一个无参数的函数,我们命名为function1(这个名字最终显示在python级别)。参数为1的函数。添加一个带一个参数的函数接口进行编译和演示。
任务已经完成。固件编译接口分析的框架解释和计划中现有驱动程序的添加。分析移植自定义驱动程序以简化固件性能优化。框架1。目录结构。这个版本库的主要组件:-py/-核心Python实现,包括编译器、运行时和核心库-mpy-cross/-micro Python cross编译器,用来把脚本变成预编译的字节码。-ports/Unix/-在Unix上运行的MicroPython的版本。- STM32/-运行在PyBoard和STM32板上的MicroPython版本(使用ST - minimal/-一个minimal MicroPython版本的CubeHAL驱动程序。如果您想将MicroPython移植到其他微控制器,请从这个开始。-tests/-测试框架和测试脚本。-docs/-用户文档-extmod/一些抽象的C接口代码,不需要在各自平台的Core-lib/SDK依赖库中for port,可能是ssdyb,也可能是外部的,没关系-drivers/由软件实现的硬件驱动。基于py的架构使用标准C实现的Python模块(C Python),与芯片本身提供的SDK略有不同,兼容性很强。附加组件:-ports/- bare-arm/-用于ARM MCU的最低版本的MicroPython。主要用于控制代码大小- teensy/-运行在Teensy 3.1上的MicroPython版本(初始版本,但可以使用)- pic16bit/-用于16位pic微控制器的MicroPython版本- cc3200/-运行在TI CC3200上的MicroPython版本。-ESP8266/-运行在乐心ESP8266 SoC上的MicroPython版本- esp32/-运行在乐心ESP32 SoC上的MicroPython版本- nrf/-运行在Nordic nRF51和nRF52 MCU上的MicroPython版本-ext mod/-用C语言实现的附加(非核心)模块。-tools/-各种工具,包括pyboard.py模块。-examples/-一些Python脚本示例。2.tests文件夹run-tests-exp . sh run-tests-exp . py run-tests自动化测试接口脚本,micropython可以这样解释。在repl中执行的Python代码结果被返回并存储在。用于测试验证的exp(示例)。3.连接
有三种类型的接口。
模块(类)举例:机器类型(类)举例:machine . pin machine . UART function(函数)举例:machine。Pin.value II。编译固件1。编译环境Linux(UbuntuServer 18.04 LTS)Gccam-gcc编译链apt-get安装gcc apt-get安装gcc-arm-none-eabimake工具apt-get安装make 2编译Micropython自带的交叉编译器make -C mpy-cross。
***mpy-cross在主目录中* * *
3构建和升级1。进入端口/stm32/文件夹下2 .制作子模块获取子模块3 .制作电路板=PYBV11为给定板编译4.生成固件在build-PYBV11/下firmware.dfu5使用迪芙斯在环境上升级下载链接三。添加C接口模块1.ports/stm32新建modtest.c,用户自定义模块主文件文件名自定1.1代码实现# include stdio。h # include py/obj。h # include py/runtime。h # include py/builtin。h //定义的modtest全局字典,之后我们添加类型和功能就要添加在这里静态常量MP _ ROM _ map _ elem _ t modtest _ globals _ table[]={ { MP _ ROM _ QSTR(MP _ QSTR _ _ _ name _ _),MP_ROM_QSTR(MP_QSTR_modtest)},//这个对应大蟒层面的__姓名_ _属性};//这个可以认为是把modtest _全局_表格注册到mp _模块_modtest.globals里面去静态MP _ DEFINE _ CONST _ DICT(MP _ module _ modtest _ globals,modtest _ globals _ table);//这个是定义一个组件类型const MP _ obj _ module _ t MP _ module _ modtest={ .base={mp_type_module},globals=(MP _ obj _ dict _ t *)MP _ module _ modtest _ globals,};1.2.模型解释全局定义字典MP _ rom _ map _ elem _ t modtest _ globals _ table[]//定义的modtest全局字典,之后我们添加类型和功能就要添加在这里注册模块MP _ DEFINE _ CONST _ DICT(MP _ module _ modtest _ globals,modtest_globals_table) //这个可以认为是把modtest _全局_表格注册到mp _模块_modtest.globals里面去定义组件类型MP _ obj _ module _ t MP _ module _ modtest//定义一个组件类型2 .模块添加到文件相应位置
3 .模块注册到微丝体我们要把我们定义的组件注册到微丝体中去,这个是在mpconfigport.h文件中修改
外部构造结构_ MP _ obj _模块_ t MP _模块_机器;extern const struct _ MP _ obj _ module _ t MP _ module _ network;extern const struct _ MP _ obj _ module _ t MP _ module _ one wire;extern const struct _ MP _ obj _ module _ t MP _ module _ modtest;//这个是我们添加的,需要声明一下应用外部的struct # define MICROPY _ PORT _ BUILTIN _ MODULES \ { MP _ ROM _ QSTR(MP _ QSTR _ u machine),MP_ROM_PTR(machine_module) },\ { MP_ROM_QSTR(MP_QSTR_pyb),MP_ROM_PTR(pyb_module) },\ STM _ BUILTIN _ MODULE \ { MP _ ROM _ QSTR(MP _ QSTR _ uos),MP_ROM_PTR(mp_module_uos) },\ { MP_ROM_QSTR(MP_QSTR_utime),MP_ROM_PTR这个是我们添加的modtest SOCKET _ BUILTIN _ MODULE \ NETWORK _ BUILTIN _ MODULE \ { MP _ ROM _ QSTR(MP _ QSTR _ _ onewire),MP_ROM_PTR(mp_module_onewire) },\找到微型端口内置模块定义的地方按照格式添加我们定义的组件
定量结构模式测试这个名字要改成自定义的QSTR MP这个一定要保留,后面的modtest就是在大蟒中显示的组件名字
四。添加C接口给组件添加功能在第二步-添加组件中已经添加好了一个模块,但是没有实现任何功能,这一节为组件添加功能实现功能。
函数是分为有参数和无参数的,一下两部分分别为有参数和无参数的添加方式
无参数函数1.添加无参数的函数,我们给他起名为功能1(这个名字是最终在大蟒层面显示的) //这是我们定义函数静态MP _ obj _ t modtest _ function 1(){ printf( This is motest function:function 1 \ n );返回mp _ const _ none//不需要返回数据就返回它}//每一个我们和大蟒接口的函数都需要使用这个宏定义静态常量MP _ DEFINE _ CONST _ FUN _ OBJ _ 0(modtest _ obj _ function 1,modtest _ function 1);静态常量MP _ ROM _ map _ elem _ t modtest _ globals _ table[]={ { MP _ ROM _ QSTR(MP _ QSTR _ _ _ name _ _),MP_ROM_QSTR(MP_QSTR_modtest)},{MP_ROM_QSTR(MP_QSTR_function1),MP _ ROM _ PTR(modtest _ obj _ function 1)},//这条是我们添加的,把新建的函数注册进modtest里面去};所有我们和大蟒对接的函数都要是返回mp_obj_t类型的,如果该函数实际不需要返回任何数据我们最后就调用返回mp _常量_无
比较重要的一条就是这个了
静态常量MP _ DEFINE _ CONST _ FUN _ OBJ _ 0(modtest _ obj _ function 1,modtest _ function 1);Micropython为不同的参数类型提供了几个类似的宏定义。这里就不解释了。我们使用MP_DEFINE_CONST_FUN_OBJ_0,这意味着修改后的函数有0个参数。
最后一步是在modtest_globals_table中注册我们定义的函数。类似于之前注册的模块类型,这个名称中的MP_QSTR_function1将是我们在pythonfunction中显示的名称。
Python层我们调用modtest.function1()来执行函数中的打印内容。
参数函数1。添加一个带一个参数的函数接口。//参数类型应该是MP _ obj _ t modtest _ function 2(MP _ obj _ tdata){ printf( this function have one parameters:% d \ n ,MP _ obj _ get _ int(data))//请注意这里用来从参数中提取整数的方法返回MP _ const _ none//还是那句话,没有返回值}//这里使用的宏定义、面的名称不同,OBJ_1不同于静态常量MP _ define _ const _ fun _ obj _ 1(modtest _ obj _ function 2,modtest _ function 2);static const MP _ ROM _ Map _ Elem _ t ModTest _ Globals _ Table[]={ { MP _ ROM _ QSTR(MP _ QSTR _ _ name _ _),MP _ ROM _ QSTR (MP _ QSTR _ ModTest)},//在ModTest中注册新定义的函数我们给定义的函数添加了一个mp_obj_t类型的参数,实际上,mp_obj_t是一个空指针,因此它可以用来传递任何类型,无论是整数还是字符串。是什么类型的?我们使用mp提供的相应方法在函数内部提取它。比如这里我们认为传入类型是int类型,也就是我们用mp_obj_get_int(data)来提取整数。当然,micopython也提供了很多其他类似的。需要注意的是,提取的字符串在形式上看起来略有不同:mp_obj_str_get_str(arg)。
关于MP_DEFINE_CONST_FUN_OBJ_1,官方给出了7个接口。只需更改最后一个数字。
编译固件
证明
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。