Skip to content

Commit 46656ab

Browse files
committed
[add] new docs for micropython package
1 parent c9ac0dc commit 46656ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2964
-0
lines changed

docs/figures/IoT_Board.png

1.9 MB
Loading

docs/figures/add_main_stack.png

42.8 KB
Loading

docs/figures/check_memory.png

7.02 KB
Loading

docs/figures/config_runtime.png

36.3 KB
Loading

docs/figures/mount_fs.png

43.9 KB
Loading
38.2 KB
Loading

docs/firmware-develop.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
## MicroPython 固件开发指南
2+
3+
如果手上没有官方支持固件的开发板,就需要自己来动手制作 MicroPython 固件了。由于 RT-Thread 官方提供了 MicroPython 软件包,并且 MicroPython 底层和硬件绑定时对接了 RT-Thread 驱动框架,所以我们可以很方便地在运行了 RT-Thread 的板卡上将 MicroPython 跑起来。
4+
5+
接下来我们以 `rt-thread\bsp\stm32\stm32f407-atk-explorer` 上的 MDK 工程为例,讲解如何在 BSP 的基础上制作 MicroPython 固件。
6+
7+
### 获取 MicroPython 软件包
8+
9+
先使用 `pkgs --upgrade` 命令更新软件包列表,然后通过 env 工具选中 MicroPython 软件包,最后使用 `pkgs -update` 命令将软件包拉取到本地。
10+
11+
![select_mpy_package](figures/select_mpy_package.png)
12+
13+
### 增大 main 线程栈
14+
15+
为了能后续在 main 线程中启动 MicroPython 运行时环境,需要增大 main 线程的栈大小,这里我们将栈大小增加到 8k。
16+
17+
![add_main_stack](figures/add_main_stack.png)
18+
19+
### 配置 MicroPython 运行环境堆大小
20+
21+
接下来根据板卡内存实际剩余情况来给 MicroPython 运行环境分配内存,这里填写的数值越大,就能运行更大代码量的 Python 程序。但是如果这里填写的数值超过了实际可分配内存,就可能会出现无法分配内存而报错。因此在配置此项目之前,需要对系统 RAM 资源的分配情况有一定了解。
22+
23+
#### 查看系统剩余内存
24+
25+
重新生成工程,编译下载后通过 `msh``free` 命令来查看内存使用情况。
26+
27+
![check_memory](figures/check_memory.png)
28+
29+
#### 配置系统
30+
31+
通过上一步查询的内存分配情况,对系统 RAM 资源有了一定的了解。在本次示例中,我们分配 20k 内存用于 MicroPython 运行时环境。后续如果想要运行更多 MicroPython 代码,可以将更多空余内存分配给 MicroPython 运行时环境,配置如下图所示:
32+
33+
![config_runtime](figures/config_runtime.png)
34+
35+
### 在根目录挂载文件系统
36+
37+
最后要确保系统中 `/` 目录挂载了文件系统。有了文件系统,后续才能使用 [**MicroPython 开发环境**](https://marketplace.visualstudio.com/items?itemName=RT-Thread.rt-thread-micropython) 将 Python 代码文件同步到板卡中来运行,本次示例中将使用 elm-fat 文件系统,需要对系统进行如下配置:
38+
39+
![mount_fs](figures/mount_fs.png)
40+
41+
配置完成后,记得要使用 `scons --target=mkd5` 重新生成工程,使配置在工程中生效。
42+
43+
### 在 main 线程中启动 MicroPython
44+
45+
最后要在 main 线程中启动 MicroPython,需要完成的功能如下:
46+
47+
1. 挂载文件系统到 `/` 目录
48+
2. 启动 MicroPython
49+
50+
上述功能可以通过修改 main 函数来实现,修改 main 代码如下所示:
51+
52+
```c
53+
#include <rtthread.h>
54+
#include <rtdevice.h>
55+
#include <board.h>
56+
#include <dfs_fs.h>
57+
#include <rtdevice.h>
58+
59+
#define FS_PARTITION_NAME "W25Q128"
60+
61+
/* defined the LED0 pin: PF9 */
62+
#define LED0_PIN GET_PIN(F, 9)
63+
64+
int main(void)
65+
{
66+
/* 挂载 elm 文件系统到 / 目录 */
67+
if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
68+
{
69+
rt_kprintf("Filesystem initialized!");
70+
}
71+
else
72+
{
73+
rt_kprintf("Filesystem initialization failed!");
74+
}
75+
76+
rt_thread_mdelay(100);
77+
78+
/* 运行 MicroPython 启动函数 */
79+
extern void mpy_main(const char *filename);
80+
mpy_main(NULL);
81+
82+
rt_kprintf("You can enter repl mode by typing python commands.");
83+
84+
/* 如果想要在 REPL 环境按下 CTRL+D 重启系统可以加上下面这一句 */
85+
/* rt_hw_cpu_reset(); */
86+
}
87+
```
88+
89+
重新编译工程下载到板卡中,就会在 main 线程中自动进入 MicroPython 的交互环境 REPL。此时如果先前没有在存储器上创建相应的文件系统,可能会导致文件系统挂载失败。此时可以使用如下两种方法在存储设备上创建文件系统:
90+
91+
- 按下 `CTRL + D` 进入 msh 使用 `mkfs -t elm W25Q128` 命令创建文件系统
92+
- 在 REPL 交互环境中输入 `import os`,`os.mkfs("elm", "W25Q128")` 命令来创建文件系统
93+
94+
注意: **W25Q128** 是本次示例中将要创建文件系统的块设备名称,并不是固定填写该名称。因此在使用上述命令创建文件系统前,需要确定当前系统中块设备的实际名称。
95+
96+
成功创建文件系统后,就可以使用 [ **MicroPython 开发环境**](https://marketplace.visualstudio.com/items?itemName=RT-Thread.rt-thread-micropython) 来进行应用开发了。
97+

docs/introduction.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# MicroPython 入门必读
2+
3+
本文档将初步介绍 MicroPython 的基本概念,RT-Thread MicroPython 的特性与优势,以及可以被用在哪些领域。
4+
5+
## 主要特性
6+
7+
- MicroPython 是 Python 3 编程语言的一种精简而高效的实现,它包含 Python 标准库的一个子集,并被优化为在微控制器和受限环境中运行。
8+
9+
- RT-Thread MicroPython 可以运行在任何搭载了 RT-Thread 操作系统并且有一定资源的嵌入式平台上。
10+
11+
- MicroPython 可以运行在有一定资源的开发板上,给你一个低层次的 Python 操作系统,可以用来控制各种电子系统。
12+
13+
- MicroPython 富有各种高级特性,比如交互式提示、任意精度整数、闭包函数、列表解析、生成器、异常处理等等。
14+
15+
- MicroPython 的目标是尽可能与普通 Python 兼容,使开发者能够轻松地将代码从桌面端转移到微控制器或嵌入式系统。程序可移植性很强,因为不需要考虑底层驱动,所以程序移植变得轻松和容易。
16+
17+
## MicroPython 的优势
18+
19+
- Python 是一款容易上手的脚本语言,同时具有强大的功能,语法优雅简单。使用 MicroPython 编程可以降低嵌入式的开发门槛,让更多的人体验嵌入式的乐趣。
20+
- 通过 MicroPython 实现硬件底层的访问和控制,不需要了解底层寄存器、数据手册、厂家的库函数等,即可轻松控制硬件。
21+
- 外设与常用功能都有相应的模块,降低开发难度,使开发和移植变得容易和快速。
22+
23+
## MicroPython 的应用领域
24+
25+
- MicroPython 在嵌入式系统上完整实现了 Python3 的核心功能,可以在产品开发的各个阶段给开发者带来便利。
26+
- 通过 MicroPython 提供的库和函数,开发者可以快速控制 LED、液晶、舵机、多种传感器、SD、UART、I2C 等,实现各种功能,而不用再去研究底层硬件模块的使用方法,翻看寄存器手册。这样不但降低了开发难度,而且减少了重复开发工作,可以加快开发速度,提高开发效率。以前需要较高水平的嵌入式工程师花费数天甚至数周才能完成的功能,现在普通的嵌入式开发者用几个小时就能实现类似的功能。
27+
- 随着半导体技术的不断发展,芯片的功能、内部的存储器容量和资源不断增加,成本不断降低,可以使用 MicroPython 来进行开发设计的应用领域也会越来越多。
28+
29+
### 产品原型验证
30+
31+
- 众所周知,在开发新产品时,原型设计是一个非常重要的环节,这个环节需要以最快速的方式设计出产品的大致模型,并验证业务流程或者技术点。与传统开发方法相比,使用 MicroPython 对于原型验证非常有用,让原型验证过程变得轻松,加速原型验证过程。
32+
- 在进行一些物联网功能开发时,网络功能也是 MicroPython 的长处,可以利用现成的众多 MicroPython 网络模块,节省开发时间。而这些功能如果使用 C/C++ 来完成,会耗费几倍的时间。
33+
34+
### 硬件测试
35+
36+
- 嵌入式产品在开发时,一般会分为硬件开发及软件开发。硬件工程师并不一定都擅长软件开发,所以在测试新硬件时,经常需要软件工程师参与。这就导致软件工程师可能会耗费很多时间帮助硬件工程师查找设计或者焊接问题。有了 MicroPython 后,将 MicroPython 固件烧入待测试的新硬件,在检查焊接、连线等问题时,只需使用简单的 Python 命令即可测试。这样,硬件工程师一人即可搞定,再也不用麻烦别人了。
37+
38+
### 创客 DIY
39+
40+
- MicroPython 无需复杂的设置,不需要安装特别的软件环境和额外的硬件,使用任何文本编辑器就可以进行编程。大部分硬件功能,使用一个命令就能驱动,不用了解硬件底层就能快速开发。这些特性使得 MicroPython 非常适合创客使用来开发一些有创意的项目。
41+
- 下面是使用 MicroPython 开发的一些 DIY 项目:
42+
- [显示温湿度的 WIFI 时钟](https://www.bilibili.com/video/av15929152?from=search&seid=16285206333541196172)
43+
- [OpenMV 智能摄像头](https://www.bilibili.com/video/av16418889?from=search&seid=16285206333541196172)
44+
- [快速实现人脸识别](https://www.bilibili.com/video/av73853903?from=search&seid=9793819178982436353)
45+
- [搭建 MQTT 服务器](http://www.360doc.com/content/17/1218/22/8473307_714341237.shtml)
46+
47+
### 教育
48+
49+
- MicroPython 使用简单、方便,非常适合于编程入门。在校学生或者业余爱好者都可以通过 MicroPython 快速的开发一些好玩的项目,在开发的过程中学习编程思想,提高自己的动手能力。

docs/micropython-librarys.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# MicroPython 库
2+
3+
### MicroPython 标准库
4+
5+
- [`Builtin functions and exceptions`](std-librarys/builtins.md) – 内置函数与异常
6+
- [`cmath`](std-librarys/cmath.md) – 复数运算函数功能
7+
- [`gc`](std-librarys/gc.md) – 控制垃圾收集器
8+
- [`math`](std-librarys/math.md) – 数学函数功能
9+
- [`sys`](std-librarys/sys.md) – 系统特定功能
10+
- [`uarray`](std-librarys/uarray.md) – 数组存储功能
11+
- [`ubinascii`](std-librarys/ubinascii.md) – 二进制与 ASCII 码转换功能
12+
- [`ucollections`](std-librarys/ucollections.md) – 集合与容器类型
13+
- [`uerrno`](std-librarys/uerrno.md) – 系统错误码
14+
- [`uhashlib`](std-librarys/uhashlib.md) – 哈希算法
15+
- [`uheapq`](std-librarys/uheapq.md) – 堆队列算法
16+
- [`uio`](std-librarys/uio.md) – 输入输出流
17+
- [`ujson`](std-librarys/ujson.md) – JSON 编解码
18+
- [`uos`](std-librarys/uos.md) – 基本的操作系统服务
19+
- [`ure`](std-librarys/ure.md) – 正则表达式
20+
- [`uselect`](std-librarys/uselect.md) – 在一组 streams 上等待事件
21+
- [`usocket`](std-librarys/usocket.md) – socket 模块
22+
- [`ussl`](std-librarys/ussl.md) – SSL/TLS 模块
23+
- [`ustruct`](std-librarys/ustruct.md) – 原生数据类型的打包和解包
24+
- [`utime`](std-librarys/utime.md) – 时间相关功能
25+
- [`uzlib`](std-librarys/uzlib.md) – zlib 解压
26+
- [`_thread`](std-librarys/_thread.md) – 多线程支持
27+
28+
### RT-Thread MicroPython 特定库
29+
30+
在 RT-Thread 移植的 MicroPython 版本中,实现了如下特定功能库:
31+
32+
- [`micropython`](spec-librarys/micropython.md) – 实现 MicroPython 内部功能访问与控制
33+
- [`rtthread`](spec-librarys/rtthread.md) – RT-Thread 系统功能模块
34+
- [`machine`](spec-librarys/machine.md) – 硬件控制模块
35+
- [Pin](spec-librarys/machine/Pin.md)
36+
- [I2C ](spec-librarys/machine/I2C.md)
37+
- [SPI](spec-librarys/machine/SPI.md)
38+
- [UART](spec-librarys/machine/UART.md)
39+
- [LCD](spec-librarys/machine/LCD.md)
40+
- [RTC](spec-librarys/machine/RTC.md)
41+
- [PWM](spec-librarys/machine/PWM.md)
42+
- [ADC](spec-librarys/machine/Pin.md)
43+
- [WDT](spec-librarys/machine/WDT.md)
44+
- [TIMER](spec-librarys/machine/Timer.md)
45+
46+
- [`network`](spec-librarys/network.md) – 网络功能配置模块
47+
- [wlan](spec-librarys/network/wlan.md)

docs/spec-librarys/machine.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
## **machine** – 与硬件相关的功能
2+
3+
**machine** 模块包含与特定开发板上的硬件相关的特定函数。 在这个模块中的大多数功能允许实现直接和不受限制地访问和控制系统上的硬件块(如CPU,定时器,总线等)。如果使用不当,会导致故障,死机,崩溃,在极端的情况下,硬件会损坏。
4+
5+
需要注意的是,由于不同开发板的硬件资源不同,MicroPython 移植所能控制的硬件也是不一样的。因此对于控制硬件的例程来说,在使用前需要修改相关的配置参数来适配不同的开发板,或者直接运行已经对某一开发板适配好的 MicroPython 示例程序。本文档中的例程都是基于 RT-Thread IoT Board 潘多拉开发板而讲解的。
6+
7+
### 函数
8+
9+
#### 复位相关函数
10+
11+
##### **machine.info**()
12+
显示关于系统介绍和内存占用等信息。
13+
14+
##### **machine.rest**()
15+
重启设备,类似于按下复位按钮。
16+
17+
##### **machine.reset_cause**()
18+
获得复位的原因,查看可能的返回值的常量。
19+
20+
#### 中断相关函数
21+
22+
##### **machine.disable_irq**()
23+
禁用中断请求。返回先前的 `IRQ` 状态,该状态应该被认为是一个未知的值。这个返回值应该在 `disable_irq` 函数被调用之前被传给 `enable_irq` 函数来重置中断到初始状态。
24+
25+
##### **machine.enable_irq**(state)
26+
重新使能中断请求。状态参数应该是从最近一次禁用功能的调用中返回的值。
27+
28+
#### 功耗相关函数
29+
30+
##### **machine.freq**()
31+
返回 `CPU` 的运行频率。
32+
33+
##### **machine.idle**()
34+
阻断给 `CPU` 的时钟信号,在较短或者较长的周期里减少功耗。当中断发生时,外设将继续工作。
35+
36+
##### **machine.sleep**()
37+
停止 `CPU` 并禁止除了 `WLAN` 之外的所有外设。系统会从睡眠请求的地方重新恢复工作。为了确保唤醒一定会发生,应当首先配置中断源。
38+
39+
##### **machine.deepsleep**()
40+
停止 `CPU` 和所有外设(包括网络接口)。执行从主函数中恢复,就像被复位一样。复位的原因可以检查 `machine.DEEPSLEEP` 参数获得。为了确保唤醒一定会发生,应该首先配置中断源,比如一个引脚的变换或者 `RTC` 的超时。
41+
42+
### 常数
43+
44+
- `IRQ` 唤醒值
45+
#### **machine.IDLE**
46+
#### **machine.SLEEP**
47+
#### **machine.DEEPSLEEP**
48+
49+
- 复位
50+
#### **machine.PWRON_RESET **
51+
#### **machine.HARD_RESET **
52+
#### **machine.WDT_RESET **
53+
#### **machine.DEEPSLEEP_RESET **
54+
#### **machine.SOFT_RESET**
55+
56+
- 唤醒
57+
#### **machine.WLAN_WAKE**
58+
#### **machine.PIN_WAKE**
59+
#### **machine.RTC_WAKE**
60+

0 commit comments

Comments
 (0)