外观
MicroPython LED 示例
2025-10-29
概述
本示例演示如何在 RC3506 开发板上使用 MicroPython 控制 LED,通过自定义 C 扩展模块 my_led 封装 RT-Thread GPIO 操作,实现 LED 的开关与翻转功能,帮助用户掌握在 MicroPython 中编写自定义硬件驱动模块的方法。
MicroPython C 扩展模块简介
MicroPython 允许开发者使用 C 语言编写扩展模块,将底层硬件操作封装为 Python 对象和方法。 相比纯 Python 实现,C 扩展模块执行效率更高、占用内存更少,适合对实时性和资源有严格要求的嵌入式场景。 模块通过标准的类型注册机制挂载到 MicroPython 全局命名空间,Python 侧可直接 import 使用。
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
LED 模块相关代码
led_obj_t 结构体:定义 LED 对象,包含引脚号和有效电平两个属性,不同 LED 的硬件差异都封装在里面;my_led_make_new:构造函数,Python 侧创建 LED 对象时调用,根据传入的编号(RED / BLUE)配置对应引脚,并将 LED 设为默认熄灭;mp_module_my_led:将整个 LED 类型注册为一个 Python 模块,Python 侧通过import my_led使用;
my_led_module.c
typedef struct _led_obj_t
{
mp_obj_base_t base;
rt_base_t pin;
rt_bool_t active_level;
} led_obj_t;
// 创建LED对象:根据编号选择引脚和有效电平
STATIC mp_obj_t my_led_make_new(const mp_obj_type_t *type, size_t n_args,
size_t n_kw, const mp_obj_t *all_args)
{
mp_arg_check_num(n_args, n_kw, 1, 1, false);
led_obj_t *self = m_new_obj(led_obj_t);
self->base.type = type;
switch (mp_obj_get_int(all_args[0]))
{
case BOARD_LED_RED:
self->pin = LED1_PIN_NUM;
self->active_level = PIN_HIGH;
break;
case BOARD_LED_BLUE:
self->pin = LED2_PIN_NUM;
self->active_level = PIN_LOW;
break;
default:
mp_raise_ValueError("Invalid LED, only support RED and BLUE");
}
rt_pin_mode(self->pin, PIN_MODE_OUTPUT);
my_led_set_state(self->pin, !self->active_level); // 默认熄灭
return MP_OBJ_FROM_PTR(self);
}
// 注册方法和常量到LED类型
STATIC const mp_rom_map_elem_t my_led_locals_dict_table[] =
{
{ MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&my_led_on_obj) },
{ MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&my_led_off_obj) },
{ MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&my_led_toggle_obj) },
{ MP_ROM_QSTR(MP_QSTR_BLUE), MP_ROM_INT(BOARD_LED_BLUE) },
{ MP_ROM_QSTR(MP_QSTR_RED), MP_ROM_INT(BOARD_LED_RED) },
};
STATIC MP_DEFINE_CONST_DICT(my_led_locals_dict, my_led_locals_dict_table);
// 定义LED类型
const mp_obj_type_t my_led_type =
{
{ &mp_type_type },
.name = MP_QSTR_LED,
.make_new = my_led_make_new,
.locals_dict = (mp_obj_dict_t*)&my_led_locals_dict,
};
// 注册模块到全局命名空间
STATIC const mp_rom_map_elem_t my_led_module_globals_table[] =
{
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_my_led) },
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&my_led_type) },
};
STATIC MP_DEFINE_CONST_DICT(my_led_module_globals, my_led_module_globals_table);
const mp_obj_module_t mp_module_my_led =
{
.base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&my_led_module_globals,
};运行示例
操作步骤:
- 将程序下载到开发板
- 打开串口终端连接开发板
- 在 MSH 命令行中输入
python进入 MicroPython 交互式环境 - 输入
import my_led导入 LED 模块 - 创建 LED 对象并调用 on/off/toggle 方法控制 LED
预期结果:
- 运行
my_led.LED(my_led.LED.RED):创建红色 LED 对象,LED 默认熄灭 - 运行
led.on():红色 LED 点亮 - 运行
led.off():红色 LED 熄灭 - 运行
led.toggle():LED 状态翻转(亮变灭、灭变亮) - 传入非法编号(如
my_led.LED(3)):抛出ValueError异常
rtt 终端
msh />python
MicroPython v1.13-148-ged7ddd4 on 2020-11-03; Universal python platform with RT-Thread
Type "help()" for more information.
>>> import my_led
>>> led_red = my_led.LED(my_led.LED.RED)
>>> led_red.on()
>>> led_red.off()
>>> led_red.toggle()
>>> led_red.toggle()
>>> led_blue = my_led.LED(my_led.LED.BLUE)
>>> led_blue.on()
>>> led_blue.off()
>>> led_invalid = my_led.LED(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Invalid LED, only support RED and BLUE