1. MicroPython

这是一个基于RT-Thread的MicroPython移植教程,RT-Thread版本需要在3.0以上。

1.1. 功能介绍

设备上电后执行SD卡中指定的脚本文件,也可以使用上位机通过串口发送命令来执行脚本。

1.2. 制作脚本

野火配套开发板已经制作好了固件,可以直接使用,将对应开发板的程序下载到你的开发板中即可,开发板上需要插上SD卡哦

脚本的制作环境是VS Code的MicroPython插件,MicroPython的插件信息请参考:https://marketplace.visualstudio.com/items?itemName=RT-Thread.rt-thread-micropython

配置好了环境就可以开始使用MicroPython了。

1.2.1. python点亮第一个灯

众所周知,再玩python的时候,需要导入需要的包,micropython也是如此,machine.Pin 类是 machine 模块下面的一个硬件类,它提供了引脚的控制方法,导入它就可以简单的控制GPIO外设。

Pin.py
1
 from machine import Pin

这样我们就可以利用它实现LED的控制,比如下面这段代码,(“PB5”, 21)为引脚标识符,它由是一个由代号和引脚号组成的元组,21是B5的引脚号,绿色LED引脚是PB0自然它的引脚号就是16,蓝色LED引脚为PB1,所以引脚就是17了,依次类推。

Pin.OUT_PP是将引脚设置为输出模式,就这样将脚本运行,红色LED就被点亮了,

main.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 from machine import Pin


 def main():
     p_out = Pin(("PB5", 21), Pin.OUT_PP)  #霸道开发板的红色LED为PB5
     p_out.value(0)      #设为低电平


 if __name__ == '__main__':
     main()

编写完脚本之后将开发板通过USB转串口连接至电脑的USB,如图1 - 1所示,点击第二个类似插头的小图标,选择对应的COM口即可与开发板连接,

IDE

1 - 1

① 用于创建工程; ② 用于连接开发板; ③ 将写好的脚本同步到开发板中,(这里我们用的是SD卡保存脚本,脚本会同步到SD卡中); ④ 在线运行脚本; ⑤ 停止运行。

点击第四个图标,我们上面写的脚本就可以在开发板中运行,

LED

1.2.2. utime模块

utime 模块提供获取当前时间和日期、测量时间间隔和延迟的功能。

utime.py
1
 import utime

我们将定时器与LED结合起来,实现闪烁的效果,utime.sleep_ms是毫秒睡眠,utime.sleep_us是微秒睡眠。

main.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 from machine import Pin
 import utime

 LED1 = 21 #霸道版的LED_R为PB5 所以是编号是 21

 def main():
     print("Welcome to RT-Thread MicroPython!")
     p_out = Pin(("PB5", LED1), Pin.OUT_PP)

     for i in range(10):
         p_out.value(0)                 # 设为低电平
         utime.sleep_ms(1000)           # 延时1秒
         p_out.value(1)                 # 设为高电平
         utime.sleep_ms(1000)           # 延时1秒


 if __name__ == '__main__':
     main()

这样就可以控制开发板上的LED循环闪烁了。

详细的MicroPython 库使用方法请参考:https://www.rt-thread.org/document/site/submodules/micropython/docs/micropython-librarys/

1.3. 制作固件

对固件制作感兴趣的同学可以看一下下面的固件制作方法,自己做一个固件。

这里以野火STM32F103霸道开发板为例,与其他开发板制作方式基本相同。

1.3.1. 准备工作

从官网中下载RT-Thread的源码,下载地址为:https://github.com/RT-Thread/rt-thread

在RT-Thread源码中提供了众多开发板的bsp,这里我们将采用stm32f103-fire-arbitrary模板来制作固件,看图1 - 2。

badao_bsp

图1 - 2

这里我们还需要用到Env工具,这个工具的使用也比较简单,关于它的下载与使用请参考:https://www.rt-thread.org/document/site/programming-manual/env/env/

1.3.2. 使用Env配置工程

就算不熟悉Env工具也没关系,这里我们只需要简单配置几个地方就行。但是最好按照官网的教程将Env启动添加至右键中会方便很多。

进入stm32f103-fire-arbitrary中点击右键,在此处打开Env工具,看图1 - 3。

open_env

图1 - 3

打开后通过命令行输入 menuconfig 进入配置界面,看图1 - 4。

menuconfig

图1 - 4

menuconfig 常用快捷键如图1 - 5所示:

python_0

图1 - 5

输入 menuconfig 进入菜单界面,看图1 - 6。

env主界面

图1 - 6

通过上下键选择,回车键确认,我们先来配置MicroPython的软件包,看图1 - 7、1 - 8 、1 - 9、1 - 10。

python_1

图1 - 7

python_2

图1 - 8

python_3

图1 - 9

python_4

图1 - 10

通过上面的简单的操作,就配置好了micropython的软件包。

下面再配置SD卡外设,通过按Esc键不断返回上一层,回到菜单主界面,选中硬件外设,看图1 - 11,

sd_1

图1 - 11

进入板载外设选项中,看图1 - 12,

sd_2

图1 - 12

将光标移动至Enable SDCARD(sdio),通过空格选中它,看图1 - 13。

sd_3

图1 - 13

就这样SD卡就配置好了,最后我们还需要修改一些main线程的堆栈大小,必须大于4096,看图1 - 14,图1 - 15,

main_1

图1 - 14

main_2

图1 - 15

这样就基本设置完成了,通过Esc键返回并保存更改,回到命令行界面通过 pkgs –update 下载并安装软件包,图1 - 16,

update

图1 - 16

再通过 scons –target=mdk5 命令生成mdk5工程,或者用scons –target=iar 命令生成iar工程。

1.3.3. 修改程序

第50行的 MSH_CMD_EXPORT 是添加自定义命令,这里我们可以通过 START_MICRO_PYTHON 宏定义确定上电时直接进入micropython运行脚本,还是通过命令行运行脚本。

main.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 #include <rtthread.h>
 #include <rtdevice.h>
 #include <board.h>

 // 如果想上电时就执行 .py 文件,就将开启此宏定义。没有开启此宏定义时,就在命令行(/msh)中输入python xxx.py执行.py 文件
 //#define START_MICRO_PYTHON

 void micropython_thread();          // micropython线程
 void micropython_init(void);        // 创建micropython线程
 static struct rt_thread micropython;// micropython线程句柄
 static char micropython_stack[4096];// 线程栈大小

 int main(void)
 {
     #ifdef START_MICRO_PYTHON
         micropython_init();         // 初始化micropython线程
     #endif

     return RT_EOK;
 }

 /* 创建micropython线程 */
 void micropython_init()
 {
     rt_thread_init(&micropython,
                 "thread2",
                 micropython_thread,
                 RT_NULL,
                 &micropython_stack[0],
                 sizeof(micropython_stack),
                 2, 20);
     rt_thread_startup(&micropython);

     rt_thread_mdelay(100);
 }

 /* micropython线程 */
 void micropython_thread()
 {
     while(1)
     {
         extern void mpy_main(const char *filename);

         /* 在此处修改需要执行得 .py文件 */
         mpy_main(NULL);
     }
 }

 #ifndef START_MICRO_PYTHON
 MSH_CMD_EXPORT(micropython_init, micropython thread);
 #endif