ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

《Python 嵌入式全栈开发:从单片机到 FPGA 零基础到实战》专栏第 1 篇:Python 真的能写嵌入式程序?STM32/51/FPGA/ 华为芯片全解析与入门实战

《Python 嵌入式全栈开发:从单片机到 FPGA 零基础到实战》专栏第 1 篇:Python 真的能写嵌入式程序?STM32/51/FPGA/ 华为芯片全解析与入门实战 栏前言很多初学者甚至有经验的嵌入式工程师都有一个共性疑问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官方支持多平台、CircuitPythonAdafruit 推出更适配创客场景芯片最低要求32 位内核ARM Cortex-M、RISC-V 等Flash ≥ 128KB存放解释器固件RAM ≥ 16KB运行字节码与系统栈验证来源MicroPython 官方移植指南 https://docs.micropython.org/en/latest/develop/port.html1.2 范式二Python 作为上位机间接控制这是通用性最强、兼容性最高的方式Python 运行在 PC / 主机上位机上通过串口、USB、蓝牙等通信协议向嵌入式芯片发送指令芯片端运行 C / 汇编编写的固件收到指令后执行对应硬件操作。原理 嵌入式芯片本身不运行 Python只负责执行底层硬件动作Python 承担 “上层控制大脑” 的角色负责逻辑处理、数据计算、可视化界面等工作。芯片要求无任何限制哪怕只有几百字节 RAM 的 8 位单片机都支持。1.3 范式三Python 作为硬件开发辅助工具这种模式多用于 FPGA、复杂 SoC 场景Python 不直接控制硬件而是用来生成硬件描述代码如 Verilog、配置文件、自动化编译脚本最终再通过专业 EDA 工具生成芯片可执行的固件。代表项目MigenPython HDL 框架、LiteXPython 搭建 SoC 系统、各类自动化烧录脚本芯片要求对应专业 EDA 工具支持的 FPGA/SoC 芯片。二、分芯片详解能不能用怎么用需要什么下面针对大家问得最多的 5 类芯片逐一给出明确结论、编程方法、所需软件与库。2.1 STM32 单片机完美支持原生 Python 运行结论可以原生运行 Python是 MicroPython 生态最成熟、官方支持最好的平台没有之一。原理STM32 全系采用 ARM Cortex-M 系列 32 位内核主流型号F103、F407、F767 等Flash 普遍在 256KB 以上RAM 在 64KB 以上完全满足 MicroPython 运行需求。官方已完成绝大多数主流型号的移植开箱即用。两种编程方式原生开发烧录 MicroPython 固件直接写 Python 代码控制 STM32 外设GPIO、串口、定时器等无需 C 语言基础。上位机控制STM32 用 C 写固件Python 通过串口 / USB 发指令控制适合复杂逻辑 简单硬件的场景。需要安装的软件与库用途软件 / 库说明固件烧录STM32CubeProgrammerST 官方免费烧录工具支持串口 / USB/ST-Link代码编辑与运行Thonny / VS CodePyMakr专为 MicroPython 优化的编辑器一键下载运行硬件控制库machine、pybMicroPython 内置库无需额外安装上位机通信pyserialPython 第三方库串口通信必备验证来源MicroPython 官方 STM32 支持列表 https://docs.micropython.org/en/latest/stm32/quickref.htmlST 官方 STM32 参数手册 https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html2.2 51 单片机STC89C52 等无法原生运行仅支持上位机控制结论绝对无法原生运行 Python 解释器只能通过 Python 做上位机间接控制。原因51 单片机是 8 位 8051 内核以最经典的 STC89C52RC 为例用户可用 Flash 仅 8KB运行 RAM 仅 512 字节 而 MicroPython 最小的移植版本也需要至少几十 KB RAM 和上百 KB Flash51 的硬件资源连解释器的十分之一都无法承载。编程方式51 端用 C 语言写好 “串口指令解析” 固件提前定义指令协议比如发1点灯、发0熄灯Python 端通过串口发送对应指令实现远程控制。需要安装的软件与库端软件 / 库说明51 单片机端Keil C51、STC-ISP编写 C 固件 烧录到 51 芯片Python 上位机pyserial实现串口通信验证来源宏晶科技 STC89C52 数据手册 http://www.stcmcu.com/datasheet/stc89c52rc-stc89c58rd-plus.pdfMicroPython 最低资源要求官方文档 https://docs.micropython.org/en/latest/develop/port.html2.3 FPGA 芯片不能直接编程可作为开发工具与上位机结论Python 不能直接作为 FPGA 的硬件编程语言FPGA 最终需要比特流文件必须通过 HDL 综合生成但有两种核心用法用 Python 框架生成 Verilog/VHDL 代码替代手写 HDL提升开发效率Python 作为上位机与 FPGA 通信控制硬件逻辑原理FPGA 的本质是可编程逻辑电路最终需要比特流bitstream配置内部逻辑门。这个过程必须经过 “HDL 编写→综合→布局布线→生成比特流” 的标准流程Python 无法跳过该流程。 但我们可以用 Python 做 “元编程”用更简洁的 Python 语法描述硬件逻辑自动生成 Verilog 代码再交给 EDA 工具处理。代表框架是 Migen 和 LiteX。需要安装的软件与库用途软件 / 库说明HDL 生成migen、litexPython 编写的硬件描述框架FPGA 综合烧录VivadoXilinx/ QuartusIntel对应 FPGA 厂商的专业 EDA 工具上位机通信pyserial、pylibftdi串口 / USB 通信库小众 FPGA 型号的 EDA 工具兼容性需验证Migen 对部分新特性支持有延迟验证来源Migen 官方文档 https://m-labs.hk/migen/manual/intro.htmlXilinx Vivado 官方文档 https://www.xilinx.com/products/design-tools/vivado.html2.4 华为芯片分场景多数支持间接或移植运行前置说明华为芯片覆盖极广从服务器级鲲鹏、AI 级昇腾、终端麒麟到嵌入式 MCUHi3861、Hi3516 等不同品类架构、资源、系统差异极大不能一概而论。分场景结论嵌入式 MCU如 Hi3861 WiFi MCURISC-V 内核结论资源满足 MicroPython 要求2MB Flash、352KB RAM社区有第三方移植版本但华为官方未原生支持。编程方式刷入第三方移植的 MicroPython 固件用 Python 开发应用层逻辑。昇腾 AI 芯片 / 鲲鹏处理器结论完全支持 Python这类芯片运行 Linux 系统原生支持 Python 环境可直接调用华为 CANN 等官方 SDK。编程方式和 Linux 下 Python 开发完全一致。其他专用芯片结论不确定需根据具体型号的内核、资源、运行系统判断。需要安装的软件与库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 用户也可以用 WSLWindows 子系统 Linux或者 MSYS2 模拟 Linux 环境完成同样的工作。3.3 层面 3MicroPython 和 Linux 内核无关联原生运行在单片机上的 MicroPython是直接操作硬件寄存器的不依赖 Linux 内核也不需要 Linux 驱动。它本身就是一个完整的独立固件和你用 C 写的裸机程序是同级别的。验证来源嵌入式 Linux 与裸机单片机的行业标准定义MicroPython 架构官方说明 https://docs.micropython.org/en/latest/develop/architecture.html四、实战 1STM32 MicroPython LED 闪烁手把手步骤我们用最经典的 STM32F103C8T6 最小系统板带你完成第一个原生 Python 嵌入式程序。4.1 准备工作硬件STM32F103C8T6 最小系统板、USB-TTL 模块、杜邦线软件STM32CubeProgrammer、Thonny 编辑器官网下载Thonny, Python IDE for beginners4.2 步骤 1烧录 MicroPython 固件去 MicroPython 官网下载 STM32F103 对应的固件https://micropython.org/download/stm32/用 USB-TTL 连接 STM32 串口PA9 接 TX、PA10 接 RXBOOT0 接高电平进入下载模式打开 STM32CubeProgrammer选择 UART 模式选择对应串口号波特率 115200点击 Connect点击 Download选择下载的.hex固件文件等待烧录完成烧录完成后BOOT0 接回低电平复位 STM324.3 步骤 2配置 Thonny 连接 STM32打开 Thonny点击顶部菜单「工具」→「选项」→「解释器」解释器类型选择「MicroPython (STM32)」端口选择你的 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五、实战 2Python 上位机控制 51 单片机 LED51 单片机无法原生运行 Python我们用 “上位机 串口指令” 的方式实现控制。5.1 前置说明51 单片机端需要先烧录好串口接收程序初始化串口波特率 9600收到字符1时点亮 LED收到0时熄灭 LED。51 端 C 代码不是本篇重点可基于标准串口例程修改5.2 Python 上位机代码先安装依赖库pip install pyserialPython 代码# 导入pyserial库Python生态最成熟的跨平台串口通信库 import serial # 导入time模块提供延时功能 import time # 打开串口 # 参数1串口号Windows下为COMx如COM3Linux下为/dev/ttyUSB0 # 参数2波特率必须和51单片机端保持一致这里使用9600 # 参数3超时时间单位秒防止读串口时程序卡死 ser serial.Serial(COM3, 9600, timeout1) # 判断串口是否成功打开 if ser.is_open: print(串口打开成功开始控制51单片机) else: print(串口打开失败请检查串口号和硬件连接) exit() # 打开失败直接退出程序 try: # 循环发送指令实现LED周期性闪烁 while True: # 向串口发送字节数据b1对应点亮LED的指令 ser.write(b1) print(发送指令点亮LED) # 延时1秒 time.sleep(1) # 发送字节数据b0对应熄灭LED的指令 ser.write(b0) print(发送指令熄灭LED) # 延时1秒 time.sleep(1) except KeyboardInterrupt: # 捕获CtrlC中断程序退出前关闭串口避免串口资源被占用 ser.close() print(\n程序退出串口已关闭)代码功能通过串口循环发送开关指令控制 51 单片机上的 LED 每秒翻转一次状态。验证来源pyserial 官方快速入门文档 Short introduction — pySerial 3.5 documentation六、FPGA Python 开发入门Migen 生成硬件逻辑我们用 Migen 框架用 Python 生成一个 4 位计数器的 Verilog 代码带你理解 Python 如何辅助 FPGA 开发。6.1 安装 Migenpip install migen6.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, namecounter).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 核心结论总结Python 可以做嵌入式开发但分 3 种范式不要混淆 “原生运行” 和 “上位机控制”STM32 支持最好可原生运行 MicroPython51 只能通过上位机控制FPGA 可作为开发辅助工具华为芯片分场景跑 Linux 的型号原生支持 PythonMCU 需要第三方移植Python 嵌入式和 Linux 的关系跑 Linux 的芯片原生支持单片机和 Linux 无关开发环境推荐 Linux7.2 专栏后续更新计划第 2 篇MicroPython 深度实战GPIO/UART/I2C/SPI 外设全解与传感器编程第 3 篇Python 上位机开发打造可视化嵌入式控制界面PyQt 串口第 4 篇FPGA Python 进阶用 LiteX 搭建完整 RISC-V SoC 系统第 5 篇华为鸿蒙设备 Python 开发实战更多项目实战内容持续更新……7.3 本篇信心其余内容均有官方文档或权威来源验证写在最后如果你觉得本篇内容对你有帮助欢迎订阅本付费专栏后续会持续输出更深度、更实战的 Python 嵌入式开发内容。有任何问题可以在评论区留言我会逐一解答。
返回列表