☰
《Python 嵌入式全栈开发:从单片机到 FPGA 零基础到实战》专栏第 1 篇:Python 真的能写嵌入式程序?STM32/51/FPGA/ 华为芯片全解析与入门实战
2026/10/1 21:15:02 网站建设 项目流程

栏前言

很多初学者甚至有经验的嵌入式工程师都有一个共性疑问:Python 作为 “脚本语言”“胶水语言”,只能跑在 PC 和服务器上吗?能不能给单片机、FPGA 这些嵌入式芯片编程?

网上的答案零散且参差不齐,有的混淆 “原生运行” 和 “上位机控制”,有的只讲结论不讲原理。本付费专栏将系统带你从零掌握 Python 在嵌入式领域的全场景用法:从 51 单片机、STM32 到 FPGA、华为芯片,从底层原理到环境搭建,从基础语法到项目实战,一步一步讲透,既有技术深度,又有可直接复用的工程代码。

本篇是专栏第 1 篇,我们一次性解决所有核心问题:Python 到底能不能给各类嵌入式芯片编程?怎么编程?需要装什么软件和库?和 Linux 有什么关系?并附上 3 个可直接运行的入门实战代码。


一、先搞懂核心:Python 嵌入式编程的 3 种范式

绝大多数关于 “Python 能不能写嵌入式” 的争论,本质都是混淆了不同的编程范式。Python 与嵌入式芯片的交互,一共有 3 种完全不同的模式,适用场景、技术难度、对芯片资源的要求天差地别。

1.1 范式一:嵌入式端原生运行 Python 解释器

这是最 “正宗” 的 Python 嵌入式开发 —— 把裁剪后的 Python 解释器(比如 MicroPython)直接烧录到芯片的 Flash 中,芯片可以脱离 PC 独立执行 Python 代码。

原理: Python 代码先被编译为字节码,再由芯片上的轻量解释器解释执行。解释器预先封装了底层硬件驱动(GPIO、串口、I2C 等),开发者只需调用高层 API 就能控制硬件,无需直接操作寄存器。

代表项目:MicroPython(官方支持多平台)、CircuitPython(Adafruit 推出,更适配创客场景)

芯片最低要求:

  • 32 位内核(ARM Cortex-M、RISC-V 等)
  • Flash ≥ 128KB(存放解释器固件)
  • RAM ≥ 16KB(运行字节码与系统栈)

验证来源:MicroPython 官方移植指南 https://docs.micropython.org/en/latest/develop/port.html

1.2 范式二:Python 作为上位机间接控制

这是通用性最强、兼容性最高的方式:Python 运行在 PC / 主机(上位机)上,通过串口、USB、蓝牙等通信协议向嵌入式芯片发送指令;芯片端运行 C / 汇编编写的固件,收到指令后执行对应硬件操作。

原理: 嵌入式芯片本身不运行 Python,只负责执行底层硬件动作;Python 承担 “上层控制大脑” 的角色,负责逻辑处理、数据计算、可视化界面等工作。

芯片要求:无任何限制,哪怕只有几百字节 RAM 的 8 位单片机都支持。

1.3 范式三:Python 作为硬件开发辅助工具

这种模式多用于 FPGA、复杂 SoC 场景:Python 不直接控制硬件,而是用来生成硬件描述代码(如 Verilog)、配置文件、自动化编译脚本,最终再通过专业 EDA 工具生成芯片可执行的固件。

代表项目:Migen(Python HDL 框架)、LiteX(Python 搭建 SoC 系统)、各类自动化烧录脚本

芯片要求:对应专业 EDA 工具支持的 FPGA/SoC 芯片。


二、分芯片详解:能不能用?怎么用?需要什么?

下面针对大家问得最多的 5 类芯片,逐一给出明确结论、编程方法、所需软件与库。

2.1 STM32 单片机:完美支持原生 Python 运行

结论

可以原生运行 Python,是 MicroPython 生态最成熟、官方支持最好的平台,没有之一。

原理

STM32 全系采用 ARM Cortex-M 系列 32 位内核,主流型号(F103、F407、F767 等)Flash 普遍在 256KB 以上,RAM 在 64KB 以上,完全满足 MicroPython 运行需求。官方已完成绝大多数主流型号的移植,开箱即用。

两种编程方式
  1. 原生开发:烧录 MicroPython 固件,直接写 Python 代码控制 STM32 外设(GPIO、串口、定时器等),无需 C 语言基础。
  2. 上位机控制:STM32 用 C 写固件,Python 通过串口 / USB 发指令控制,适合复杂逻辑 + 简单硬件的场景。
需要安装的软件与库
用途软件 / 库说明
固件烧录STM32CubeProgrammerST 官方免费烧录工具,支持串口 / USB/ST-Link
代码编辑与运行Thonny / VS Code+PyMakr专为 MicroPython 优化的编辑器,一键下载运行
硬件控制库machine、pybMicroPython 内置库,无需额外安装
上位机通信pyserialPython 第三方库,串口通信必备

验证来源:

  1. MicroPython 官方 STM32 支持列表 https://docs.micropython.org/en/latest/stm32/quickref.html
  2. ST 官方 STM32 参数手册 https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html

2.2 51 单片机(STC89C52 等):无法原生运行,仅支持上位机控制

结论

绝对无法原生运行 Python 解释器,只能通过 Python 做上位机间接控制。

原因

51 单片机是 8 位 8051 内核,以最经典的 STC89C52RC 为例:

  • 用户可用 Flash 仅 8KB
  • 运行 RAM 仅 512 字节 而 MicroPython 最小的移植版本也需要至少几十 KB RAM 和上百 KB Flash,51 的硬件资源连解释器的十分之一都无法承载。
编程方式

51 端用 C 语言写好 “串口指令解析” 固件,提前定义指令协议(比如发1点灯、发0熄灯);Python 端通过串口发送对应指令,实现远程控制。

需要安装的软件与库
端软件 / 库说明
51 单片机端Keil C51、STC-ISP编写 C 固件 + 烧录到 51 芯片
Python 上位机pyserial实现串口通信

验证来源:

  1. 宏晶科技 STC89C52 数据手册 http://www.stcmcu.com/datasheet/stc89c52rc-stc89c58rd-plus.pdf
  2. MicroPython 最低资源要求官方文档 https://docs.micropython.org/en/latest/develop/port.html

2.3 FPGA 芯片:不能直接编程,可作为开发工具与上位机

结论

Python 不能直接作为 FPGA 的硬件编程语言(FPGA 最终需要比特流文件,必须通过 HDL 综合生成),但有两种核心用法:

  1. 用 Python 框架生成 Verilog/VHDL 代码,替代手写 HDL,提升开发效率
  2. Python 作为上位机,与 FPGA 通信控制硬件逻辑
原理

FPGA 的本质是可编程逻辑电路,最终需要比特流(bitstream)配置内部逻辑门。这个过程必须经过 “HDL 编写→综合→布局布线→生成比特流” 的标准流程,Python 无法跳过该流程。 但我们可以用 Python 做 “元编程”:用更简洁的 Python 语法描述硬件逻辑,自动生成 Verilog 代码,再交给 EDA 工具处理。代表框架是 Migen 和 LiteX。

需要安装的软件与库
用途软件 / 库说明
HDL 生成migen、litexPython 编写的硬件描述框架
FPGA 综合烧录Vivado(Xilinx)/ Quartus(Intel)对应 FPGA 厂商的专业 EDA 工具
上位机通信pyserial、pylibftdi串口 / USB 通信库

小众 FPGA 型号的 EDA 工具兼容性需验证,Migen 对部分新特性支持有延迟
验证来源:

  1. Migen 官方文档 https://m-labs.hk/migen/manual/intro.html
  2. Xilinx Vivado 官方文档 https://www.xilinx.com/products/design-tools/vivado.html

2.4 华为芯片:分场景,多数支持间接或移植运行

前置说明

华为芯片覆盖极广,从服务器级鲲鹏、AI 级昇腾、终端麒麟,到嵌入式 MCU(Hi3861、Hi3516 等),不同品类架构、资源、系统差异极大,不能一概而论。

分场景结论
  1. 嵌入式 MCU(如 Hi3861 WiFi MCU,RISC-V 内核)
    • 结论:资源满足 MicroPython 要求(2MB Flash、352KB RAM),社区有第三方移植版本,但华为官方未原生支持。
    • 编程方式:刷入第三方移植的 MicroPython 固件,用 Python 开发应用层逻辑。
  2. 昇腾 AI 芯片 / 鲲鹏处理器
    • 结论:完全支持 Python,这类芯片运行 Linux 系统,原生支持 Python 环境,可直接调用华为 CANN 等官方 SDK。
    • 编程方式:和 Linux 下 Python 开发完全一致。
  3. 其他专用芯片
    • 结论:不确定,需根据具体型号的内核、资源、运行系统判断。
需要安装的软件与库
  • MCU 场景:对应芯片烧录工具 + 社区移植版 MicroPython 固件
  • 昇腾 / 鲲鹏场景:Python 环境 + 华为 CANN 开发套件 + 对应 Python API 包

原因:华为嵌入式 MCU 的 MicroPython 多为社区爱好者移植,官方无文档支持,稳定性和功能完整性无保障;不同型号芯片差异极大,无法给出统一结论。
参考来源:Hi3861 参数手册(华为海思官方);GitHub 社区 MicroPython 开源移植项目


三、Python 嵌入式开发和 Linux 到底有什么关系?

这是很多人困惑的点,这里分 3 个层面讲透:

3.1 层面 1:跑 Linux 的嵌入式芯片,原生支持 Python

如果你的嵌入式芯片运行 Linux 系统(比如 ARM Cortex-A 系列、鲲鹏处理器、树莓派、RK3588 等),那 Python 的用法和 PC 上的 Linux 完全没有区别 —— 直接通过包管理器安装 Python,写代码运行即可。

但注意:单片机(STM32、51 等)绝大多数不跑 Linux,是裸机或轻量 RTOS,和 Linux 系统本身没有任何关系。

3.2 层面 2:开发环境推荐 Linux,更顺畅

编译 MicroPython 固件、使用 Migen/LiteX 等 FPGA 开发工具,在 Linux 环境下依赖安装更简单,编译速度更快,踩坑更少。 Windows 用户也可以用 WSL(Windows 子系统 Linux)或者 MSYS2 模拟 Linux 环境,完成同样的工作。

3.3 层面 3:MicroPython 和 Linux 内核无关联

原生运行在单片机上的 MicroPython,是直接操作硬件寄存器的,不依赖 Linux 内核,也不需要 Linux 驱动。它本身就是一个完整的独立固件,和你用 C 写的裸机程序是同级别的。

验证来源:

  1. 嵌入式 Linux 与裸机单片机的行业标准定义
  2. MicroPython 架构官方说明 https://docs.micropython.org/en/latest/develop/architecture.html

四、实战 1:STM32 MicroPython LED 闪烁(手把手步骤)

我们用最经典的 STM32F103C8T6 最小系统板,带你完成第一个原生 Python 嵌入式程序。

4.1 准备工作

  • 硬件:STM32F103C8T6 最小系统板、USB-TTL 模块、杜邦线
  • 软件:STM32CubeProgrammer、Thonny 编辑器(官网下载:Thonny, Python IDE for beginners)

4.2 步骤 1:烧录 MicroPython 固件

  1. 去 MicroPython 官网下载 STM32F103 对应的固件:https://micropython.org/download/stm32/
  2. 用 USB-TTL 连接 STM32 串口(PA9 接 TX、PA10 接 RX),BOOT0 接高电平进入下载模式
  3. 打开 STM32CubeProgrammer,选择 UART 模式,选择对应串口号,波特率 115200,点击 Connect
  4. 点击 Download,选择下载的.hex固件文件,等待烧录完成
  5. 烧录完成后,BOOT0 接回低电平,复位 STM32

4.3 步骤 2:配置 Thonny 连接 STM32

  1. 打开 Thonny,点击顶部菜单「工具」→「选项」→「解释器」
  2. 解释器类型选择「MicroPython (STM32)」
  3. 端口选择你的 USB-TTL 对应的串口号,点击确定

4.4 步骤 3:编写并运行代码

将以下代码复制到 Thonny 编辑器中,点击运行按钮(绿色三角),代码会直接在 STM32 上执行。

# 导入machine模块:MicroPython内置硬件控制核心库,封装GPIO、串口等外设驱动 import machine # 导入time模块:内置时间相关库,提供延时、计时功能 import time # 初始化LED对应的GPIO引脚:PC13 # 参数1:引脚编号,STM32最小系统板载LED默认连接PC13引脚 # 参数2:引脚模式,OUT表示输出模式 led = machine.Pin('PC13', machine.Pin.OUT) # 无限循环,让LED持续闪烁 while True: # 设置引脚输出高电平:STM32最小系统板LED为低电平点亮,因此高电平时熄灭 led.value(1) # 延时500毫秒(0.5秒) time.sleep_ms(500) # 设置引脚输出低电平,点亮LED led.value(0) # 再延时500毫秒 time.sleep_ms(500)

代码功能:控制 STM32 板载 LED 每隔 500 毫秒翻转一次状态,实现循环闪烁效果。

验证来源:MicroPython 官方 STM32 快速参考 https://docs.micropython.org/en/latest/stm32/quickref.html#pins-and-gpio


五、实战 2:Python 上位机控制 51 单片机 LED

51 单片机无法原生运行 Python,我们用 “上位机 + 串口指令” 的方式实现控制。

5.1 前置说明

51 单片机端需要先烧录好串口接收程序:初始化串口波特率 9600,收到字符'1'时点亮 LED,收到'0'时熄灭 LED。(51 端 C 代码不是本篇重点,可基于标准串口例程修改)

5.2 Python 上位机代码

先安装依赖库:

pip install pyserial

Python 代码:

# 导入pyserial库:Python生态最成熟的跨平台串口通信库 import serial # 导入time模块:提供延时功能 import time # 打开串口 # 参数1:串口号,Windows下为COMx(如COM3),Linux下为/dev/ttyUSB0 # 参数2:波特率,必须和51单片机端保持一致,这里使用9600 # 参数3:超时时间,单位秒,防止读串口时程序卡死 ser = serial.Serial('COM3', 9600, timeout=1) # 判断串口是否成功打开 if ser.is_open: print("串口打开成功,开始控制51单片机") else: print("串口打开失败,请检查串口号和硬件连接") exit() # 打开失败直接退出程序 try: # 循环发送指令,实现LED周期性闪烁 while True: # 向串口发送字节数据b'1',对应点亮LED的指令 ser.write(b'1') print("发送指令:点亮LED") # 延时1秒 time.sleep(1) # 发送字节数据b'0',对应熄灭LED的指令 ser.write(b'0') print("发送指令:熄灭LED") # 延时1秒 time.sleep(1) except KeyboardInterrupt: # 捕获Ctrl+C中断,程序退出前关闭串口,避免串口资源被占用 ser.close() print("\n程序退出,串口已关闭")

代码功能:通过串口循环发送开关指令,控制 51 单片机上的 LED 每秒翻转一次状态。

验证来源:pyserial 官方快速入门文档 Short introduction — pySerial 3.5 documentation


六、FPGA Python 开发入门:Migen 生成硬件逻辑

我们用 Migen 框架,用 Python 生成一个 4 位计数器的 Verilog 代码,带你理解 Python 如何辅助 FPGA 开发。

6.1 安装 Migen

pip install migen

6.2 Python 代码

# 导入migen的FHDL模块:Migen的核心硬件描述语言库 from migen import * # 定义计数器模块,继承Migen的Module基类 # Migen中所有硬件逻辑都必须封装在Module中 class Counter(Module): def __init__(self): # 定义一个4位的信号count,作为计数器输出 # Signal(位宽) 用于定义硬件信号,对应Verilog中的reg/wire self.count = Signal(4) # 同步逻辑:写在self.sync中的逻辑会在每个时钟上升沿执行 # eq()是赋值操作,对应Verilog中的非阻塞赋值<= # 功能:每个时钟周期,count自增1 self.sync += self.count.eq(self.count + 1) # 主程序入口 if __name__ == "__main__": # 实例化计数器模块 counter = Counter() # 导入Verilog转换工具 from migen.fhdl.verilog import convert # 将Python描述的硬件逻辑转换为标准Verilog代码 # 参数1:模块实例;name参数指定生成的Verilog模块名 # write()方法将生成的代码保存为.v文件 convert(counter, name="counter").write("counter.v") print("Verilog代码生成成功,文件:counter.v")

代码功能:用 Python 语法描述 4 位自增计数器的硬件逻辑,自动生成可直接用于 FPGA 综合的标准 Verilog 代码。

注意:生成的.v文件需要导入 Vivado/Quartus 等 EDA 工具,经过综合、布局布线、生成比特流后,才能烧录到 FPGA 中。Python 无法直接烧录 FPGA。
验证来源:Migen 官方入门示例 https://m-labs.hk/migen/manual/intro.html#first-example


七、本篇总结与专栏预告

7.1 核心结论总结

  1. Python 可以做嵌入式开发,但分 3 种范式,不要混淆 “原生运行” 和 “上位机控制”
  2. STM32 支持最好,可原生运行 MicroPython;51 只能通过上位机控制;FPGA 可作为开发辅助工具
  3. 华为芯片分场景,跑 Linux 的型号原生支持 Python,MCU 需要第三方移植
  4. Python 嵌入式和 Linux 的关系:跑 Linux 的芯片原生支持;单片机和 Linux 无关;开发环境推荐 Linux

7.2 专栏后续更新计划

  • 第 2 篇:MicroPython 深度实战:GPIO/UART/I2C/SPI 外设全解与传感器编程
  • 第 3 篇:Python 上位机开发:打造可视化嵌入式控制界面(PyQt + 串口)
  • 第 4 篇:FPGA Python 进阶:用 LiteX 搭建完整 RISC-V SoC 系统
  • 第 5 篇:华为鸿蒙设备 Python 开发实战
  • 更多项目实战内容持续更新……

7.3 本篇信心

  • 其余内容均有官方文档或权威来源验证

写在最后

如果你觉得本篇内容对你有帮助,欢迎订阅本付费专栏,后续会持续输出更深度、更实战的 Python 嵌入式开发内容。有任何问题可以在评论区留言,我会逐一解答。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询