STM32 高级定时器深度解析与电机控制实战指南

前言 在嵌入式系统开发中,定时器是最常用也最容易被低估的外设之一。很多开发者对定时器的理解仅仅停留在"定时中断"的层面,却不知道一个高级定时器所能实现的功能远远超出想象——它可以生成高精度 PWM 波形、精确测量脉冲信号、实现编码器接口、驱动步进电机和无刷电机,甚至可以不占用 CPU 资源完成复杂的波形生成。 STM32 的定时器系统设计得极其精巧,尤其是高级控制定时器(Advanced-control Timer),如 TIM1、TIM8 等,其内部包含了多达几十个寄存器,支持多种工作模式。对于电机控制这样的实时性要求极高的应用场景,高级定时器几乎是不可或缺的。 然而,正是因为其功能强大,高级定时器的学习曲线也相当陡峭。很多开发者对着参考手册上的寄存器描述看了几天,依然搞不清捕获/比较通道、互补输出、死区插入、刹车功能这些概念到底是怎么回事。更不用说将这些功能组合起来实现一个完整的 FOC(磁场定向控制)电机驱动了。 本文将从定时器的基本原理出发,层层深入,带你彻底理解 STM32 高级定时器的每一个功能模块。我们不仅会讲解理论,更会通过大量的代码示例,从简单的 PWM 输出开始,一步步实现基于高级定时器的 BLDC 无刷电机六步换向控制。 无论你是刚开始接触 STM32 的新手,还是希望深入理解定时器硬件原理的资深开发者,相信这篇文章都能给你带来新的收获。 一、STM32 定时器家族:不止是"计数"那么简单 很多人学习 STM32 定时器时的第一个困惑就是:为什么 STM32 要有这么多种定时器?从 TIM2 到 TIM17,编号一大堆,每个定时器的功能还都不太一样,很容易搞混。 实际上,ST 对定时器的分类是非常清晰的,按照功能从简单到复杂,可以分为以下几类: 1.1 基本定时器(Basic Timer):TIM6、TIM7 基本定时器正如其名,功能最简单,只有最核心的定时功能。它没有外部 IO 引脚,也没有捕获/比较通道,只能实现最基本的定时中断和 DAC 触发。 基本定时器的典型应用场景: 实现固定间隔的定时中断(如 1ms 系统滴答) 作为 DAC 的转换触发信号 简单的延时功能 如果你只需要"多少时间后做什么事",基本定时器就足够了,它的资源占用也最小。 1.2 通用定时器(General-purpose Timer):TIM2 ~ TIM5、TIM9 ~ TIM14 通用定时器是使用最广泛的一类定时器。它们具有 4 个独立的捕获/比较通道,可以实现: 输入捕获:测量外部脉冲的频率、占空比 输出比较:生成各种波形 PWM 输出:生成电机控制所需的 PWM 信号 单脉冲模式:生成精确的单脉冲输出 编码器接口:对接正交编码器 通用定时器又可以细分为两个子类: ...

May 14, 2026 · 8 min · 👁️ 0 · Tech Snippets

嵌入式 Linux 实时性优化与 PREEMPT_RT 补丁实战指南

前言 在工业控制、机器人、汽车电子等领域,确定性比平均性能更加重要。一个控制系统如果不能在规定的时间窗口内完成响应,即使平均响应时间再短,也可能导致灾难性的后果——生产线停摆、机器人失控、汽车 ADAS 失效。 传统的 Linux 内核虽然在吞吐量和平均延迟方面表现出色,但在最坏情况延迟(Worst-Case Latency)方面却不尽人意。在高负载情况下,普通 Linux 内核的调度延迟可能达到数十毫秒甚至数百毫秒级别,这对于要求微秒级确定性的实时应用来说是完全不可接受的。 这就是 PREEMPT_RT 补丁存在的意义。 PREEMPT_RT(Real-Time Preemption Patch)是一组针对 Linux 内核的补丁集,其目标是将 Linux 内核改造为一个完全可抢占的实时操作系统。经过二十多年的发展,PREEMPT_RT 已经从一个实验性项目成长为工业级实时解决方案的事实标准,大量关键代码甚至已经合入主线内核。 本文将从实时系统的基本概念出发,深入解析 PREEMPT_RT 的核心原理,带你从零开始打补丁、编译实时内核、配置系统、进行延迟测试,最终构建一个真正满足工业级要求的实时 Linux 系统。 一、什么是真正的实时系统? 在深入 PREEMPT_RT 之前,我们首先需要澄清一个普遍的误解:快 ≠ 实时。 很多开发者一听到"实时系统",第一反应就是"运行很快的系统"。这是一个根本性的错误认知。 1.1 实时性的本质:确定性 实时系统的核心特征不是"快",而是可预测性或确定性。系统必须能够保证:关键任务在截止时间之前完成。 让我们通过一个具体的例子来说明: 假设我们有一个工业机器人的运动控制系统,要求每 1 毫秒执行一次位置控制循环。如果控制系统的响应时间分布如下: 系统 A:平均响应 500 微秒,最坏情况 1.5 毫秒(偶尔超时) 系统 B:平均响应 800 微秒,最坏情况 950 微秒(从不超时) 哪个系统是"实时"的? 答案是 系统 B。尽管它的平均响应更慢,但它的最坏情况延迟始终小于截止时间,具有完美的确定性。而系统 A 虽然更快,但偶尔会超时,在实际工业场景中这可能导致机器人运动轨迹偏差、甚至发生碰撞。 1.2 实时系统的分类 根据对截止时间的要求严格程度,实时系统可以分为三类: 硬实时(Hard Real-Time) 绝对不能错过截止时间 错过 = 系统失败 典型场景:航空电子、汽车安全系统、工业控制 PREEMPT_RT 目标:在合理配置下达到硬实时级别 软实时(Soft Real-Time) ...

May 12, 2026 · 14 min · 👁️ 0 · Tech Snippets

RISC-V 架构深度解析与指令集编程实战指南

前言 2026 年,芯片架构领域正在经历一场前所未有的变革。 过去三十年,ARM 架构凭借其低功耗、高效率的设计哲学,几乎垄断了整个移动设备和嵌入式市场。而 x86 架构则凭借强大的生态和软件兼容性,牢牢占据着桌面和服务器市场的主导地位。对于普通开发者来说,芯片架构似乎是一个遥不可及的话题——那是 Intel、ARM、高通这些巨头的游戏。 但一切都在 2010 年发生了改变。 加州大学伯克利分校的 Krste Asanović 教授带领他的团队,启动了一个看似疯狂的项目:从零开始设计一个全新的指令集架构(ISA),并且将其完全开源、免费授权。这个项目就是 RISC-V,读作 “Risk-Five”。 十五年后的今天,RISC-V 已经从一个学术项目成长为撼动整个芯片产业的力量。从最低端的 IoT 微控制器,到高性能服务器 CPU;从消费电子的 AI 加速卡,到超级计算机的计算节点——RISC-V 的身影无处不在。NVIDIA 的下一代 GPU 将集成 RISC-V 核心,Intel 的代工业务正在为客户生产 RISC-V 芯片,甚至连 ARM 自己都开始布局 RISC-V 相关业务。 为什么一个开源的指令集能够引发如此巨大的产业震动?RISC-V 到底解决了什么问题?它的技术优势在哪里?普通开发者又如何参与到这场架构革命中来? 本文将带你从零开始,深入解析 RISC-V 架构的设计哲学、指令集细节、汇编编程、特权机制,最终实现一个简单的操作系统内核。无论你是嵌入式工程师、系统程序员,还是对芯片架构感兴趣的普通开发者,读完这篇文章,你都将对 RISC-V 有一个全面而深刻的理解。 一、为什么 RISC-V 能够撼动 ARM 的地位? 在深入技术细节之前,我们需要先理解一个问题:在 ARM 和 x86 已经如此成熟的今天,为什么整个产业还要费心费力地去拥抱一个全新的架构? 答案藏在三个关键词里:成本、控制权、创新。 1.1 授权费用的天壤之别 让我们先算一笔账。如果你想设计一款基于 ARM 架构的芯片,你需要支付哪些费用? 首先是 架构授权费(Architecture License),这是使用 ARM 指令集本身的入门费。根据公开资料,ARM v8/v9 的架构授权费大约在 1000 万到 5000 万美元之间。注意,这只是让你"有权"设计兼容 ARM 指令集的 CPU,你还没有拿到任何实际的 CPU 设计。 ...

May 11, 2026 · 3 min · 👁️ 0 · Tech Snippets

YOLOv8 边缘设备部署与性能优化实战指南

前言 2026 年,AI 算力正在经历一场深刻的范式转移。 当所有人都在追捧千亿参数大模型的时候,另一股更接地气的力量正在悄然壮大——边缘 AI。根据 IDC 的预测,到 2027 年,超过 50% 的数据处理将在边缘侧完成,而不是集中在云端数据中心。 这股趋势在计算机视觉领域表现得尤为明显。安防摄像头、工业检测设备、智能驾驶辅助系统、服务机器人……这些场景对目标检测算法不仅要求**低延迟、高可靠性、隐私安全,而这些恰恰是云端推理无法满足的痛点: 延迟问题:云端推理往返延迟通常在 100ms 以上,无法满足实时检测需求 带宽成本:4K 视频流每秒 10Mbps,24 小时上传是 100GB 以上 隐私安全:敏感场景不允许视频流离开设备 断网运行:工业场景必须支持离线工作 于是,如何在算力有限的边缘芯片上跑起 YOLO,就成了嵌入式 AI 工程师的核心课题。 YOLOv8 作为 Ultralytics 推出的新一代检测模型,在精度和速度上达到了新的平衡,但默认导出的 PyTorch 模型在边缘设备上根本跑不起来——300+MB 的显存占用、100ms+ 的推理时间,完全无法满足产品级要求。 本文将带你从零开始,完整走完 YOLOv8 从训练好的 .pt 模型到边缘设备部署的全过程:ONNX 导出、NCNN 转换、INT8 量化、NEON 优化,最终在树莓派 5 上达到 25 FPS 的实时检测速度。 ![YOLOv8 边缘设备部署流程 一、为什么边缘 AI 是未来? 1.1 云计算的天花板 很多初学者常常有一个常见的误区:“既然云端算力这么强,为什么不直接把视频传到云端做检测? 我在某智能安防项目踩过这个坑。一开始方案很简单:摄像头 RTSP 流拉流 → FFmpeg 编码 → HTTP 上传 → 云端 GPU 推理 → 结果返回。 ...

May 10, 2026 · 13 min · 👁️ 0 · Tech Snippets

从 RAG 到 Agent:企业级 LLM 应用架构实战指南

前言 2023 年被称为"大模型元年",ChatGPT 的横空出世让全世界见识到了大语言模型的惊人能力。然而,当企业真正尝试将 LLM 落地到业务场景时,很快就遇到了三座大山:知识过时、幻觉严重、无法与内部系统集成。 于是,RAG(检索增强生成)应运而生——通过将外部知识库的内容检索出来,与用户查询一起送入 LLM,既解决了知识时效性问题,又能在一定程度上减少幻觉。一夜之间,几乎所有的 AI 应用都声称"我们用了 RAG"。 但好景不长。随着业务复杂度的提升,开发者们发现 RAG 也有明显的天花板: 检索准确率的瓶颈:无论怎么优化分块策略、嵌入模型、重排序,总有 20%-30% 的查询无法检索到正确的上下文 无法处理多步任务:“帮我分析上个月的销售数据并生成图表"这种需要多步骤操作的请求,RAG 根本无从下手 缺乏状态管理:复杂对话中,上下文丢失、记忆混乱的问题时有发生 工具集成困难:想要调用数据库、API、代码解释器时,RAG 架构显得力不从心 正是在这样的背景下,LLM Agent 开始走进人们的视野。与 RAG 相比,Agent 的核心突破在于:从被动的"检索-回答"模式,转变为主动的"感知-规划-行动-反思"循环。一个优秀的 Agent 不仅能回答问题,还能分解目标、调用工具、执行任务、修正错误,最终完成复杂的工作流。 本文将带你系统性地了解从 RAG 到 Agent 的完整演进路径,从基础概念到架构设计,从代码实现到性能优化,最后给出企业级落地的最佳实践。无论你是正在考虑从 RAG 升级到 Agent,还是想要从零构建一套 LLM 应用体系,这篇文章都将为你提供一份可操作的实战指南。 一、RAG 的三代演进史 1.1 Naive RAG:最朴素的起点 几乎所有开发者接触 RAG,都是从"三段式"架构开始的: 索引阶段:文档加载 → 文档分割 → 向量化 → 存入向量数据库 检索阶段:用户查询向量化 → 相似度搜索 → 返回 Top-K 相关文档 生成阶段:查询 + 上下文 → Prompt Engineering → LLM 生成答案 ...

May 9, 2026 · 11 min · 👁️ 0 · Tech Snippets

STM32 定时器高级应用实战指南——PWM 输出、输入捕获、编码器模式与 HAL 库优化

前言 在嵌入式开发的世界里,定时器(Timer)堪称单片机的"瑞士军刀"。从简单的延时函数、周期性任务调度,到复杂的电机驱动控制、高精度脉冲测量、通信时序生成,定时器的身影无处不在。对于 STM32 这样的 Cortex-M 架构微控制器来说,定时器外设的丰富程度和灵活性,更是其区别于普通 8 位单片机的核心优势之一。 然而,很多开发者对 STM32 定时器的使用仅仅停留在"定时中断"这个最基础的层面——配置好自动重装载值,使能中断,然后在中断服务函数里翻转一下 LED。对于定时器的高级功能,如 PWM 输出、输入捕获、编码器接口等,要么知之甚少,要么只会通过 CubeMX 生成代码后"照着例子抄",遇到问题时根本不知道从何排查。 根据我多年的嵌入式开发经验,真正拉开单片机开发者水平差距的,往往不是会不会用某个外设,而是能不能把外设的性能发挥到极致。一个只会用定时器做延时的工程师,和一个能熟练运用编码器接口做闭环控制的工程师,其解决问题的能力和项目贡献度完全不在一个量级。 本文将从实际应用出发,系统讲解 STM32 定时器的四大高级功能:PWM 输出、输入捕获、编码器接口和输出比较。我们不会停留在寄存器层面的理论讲解,而是通过大量可直接运行的代码示例、实测数据和常见问题排查指南,带你真正掌握定时器的高级应用技巧。无论你是刚接触 STM32 的新手,还是有多年经验的老司机,这篇文章都会帮助你构建完整的定时器应用知识体系。 一、STM32 定时器家族概览 在深入具体应用之前,我们首先需要搞清楚 STM32 到底有多少种定时器,它们各自的特点是什么。很多初学者看到 STM32 的数据手册里 TIM1、TIM2、TIM8…一大堆定时器型号就头大,不知道该怎么选择。其实只要掌握了分类方法,一切就都清晰了。 1.1 定时器的分类与特点 STM32 的定时器按照功能复杂度可以分为四大类: 高级控制定时器(TIM1、TIM8):这是功能最强大的定时器,通常挂载在 APB2 总线上。除了基本定时功能外,还具备互补输出、死区时间插入、刹车输入等高级功能,专门为电机控制和开关电源设计。如果你需要做三相 BLDC 电机的 FOC 控制,或者需要带死区的 PWM 输出,高级定时器是唯一选择。 通用定时器(TIM2-TIM5,TIM9-TIM14):这是使用最广泛的一类定时器,挂载在 APB1 或 APB2 总线上。通用定时器具备完整的四大功能:定时中断、PWM 输出、输入捕获、编码器接口。其中 TIM2 和 TIM5 是 32 位计数器,其余是 16 位。对于 90% 以上的应用场景,通用定时器都是最佳选择。 基本定时器(TIM6、TIM7):功能最简单,只能做基本定时和 DAC 触发,没有输入输出通道。优点是资源占用小,中断优先级配置简单。通常用于周期性任务调度、ADC 采样触发等场景。 低功耗定时器(LPTIM):专为低功耗应用设计,可以在停止模式下继续运行,使用 LSE 或 LSI 作为时钟源。适合电池供电设备的周期性唤醒场景。 ...

May 8, 2026 · 10 min · 👁️ 0 · Tech Snippets

FreeRTOS 任务调度机制深度解析与实时性能优化指南

前言 在嵌入式系统开发领域,实时操作系统(RTOS)已经成为中高端项目的标配。从消费电子的智能手表、蓝牙耳机,到工业控制的 PLC、伺服驱动器,再到汽车电子的 ECU、ADAS 系统,RTOS 为这些对时间确定性有着严格要求的应用提供了可靠的运行基础。而在众多 RTOS 中,FreeRTOS 无疑是应用最广泛、社区最活跃的一个。 根据 2025 年嵌入式市场调查报告,FreeRTOS 在全球 RTOS 市场中的占有率超过 60%,被超过 100 款微控制器原生支持,累计出货设备超过 150 亿台。这个由 Richard Barry 在 2003 年创建的开源项目,如今已经成为嵌入式行业事实上的标准。亚马逊在 2017 年收购 FreeRTOS 后,进一步推动了其在 IoT 和边缘计算领域的发展。 然而,很多嵌入式工程师对 FreeRTOS 的使用停留在"会用"的层面——知道如何创建任务、如何使用信号量、如何发送消息,但对于任务调度器的内部工作机制、优先级继承的具体实现、上下文切换的时间开销等核心问题却知之甚少。这种认知上的盲区,往往导致系统出现难以排查的实时性问题:高优先级任务迟迟得不到执行、中断响应时间超出预期、系统负载突然飙升等等。 本文将从源码层面深入解析 FreeRTOS 的任务调度机制,带你理解任务优先级调度、时间片轮转、抢占式调度的底层实现原理。更重要的是,我们会通过大量实测数据和代码示例,教你如何系统性地优化 FreeRTOS 系统的实时性能。无论你是刚接触 RTOS 的新手,还是有多年经验的嵌入式工程师,这篇文章都会帮助你构建完整的 FreeRTOS 知识体系。 一、为什么选择 FreeRTOS? 在深入技术细节之前,我们有必要先理解 FreeRTOS 为什么能在众多 RTOS 中脱颖而出。与商业 RTOS(如 VxWorks、QNX、ThreadX)和其他开源方案(如 RT-Thread、Zephyr、uC/OS)相比,FreeRTOS 有几个不可替代的优势: 1.1 极简的内核设计 FreeRTOS 的核心代码量不到 1 万行,其中最核心的调度器代码只有约 2000 行。这种极简设计带来了几个显著的好处: 代码可读性高:一个有经验的工程师可以在一周内完整理解所有内核源码 ROM/RAM 占用极小:最小配置下,Flash 占用不到 4KB,RAM 占用不到 1KB Bug 率极低:经过 20 年的广泛使用,核心代码的稳定性已经得到充分验证 易于移植:移植层只需要实现 10 个左右的硬件相关函数 对比一下,Linux 内核的调度器子系统就有超过 5 万行代码,而 Zephyr 的核心代码量也超过 5 万行。对于资源受限的 MCU 来说,FreeRTOS 的极简设计是巨大的优势。 ...

May 7, 2026 · 7 min · 👁️ 1 · Tech Snippets

RISC-V 向量扩展 (RVV) 原理与实战优化指南

前言 2020 年代,AI 算力的需求呈现出爆炸式增长。从大语言模型的推理,到计算机视觉的实时处理,再到科学计算的海量数据处理,计算领域对数据并行处理能力的需求从未如此迫切。传统的标量 CPU 虽然通用,但面对海量重复运算时显得力不从心;GPU 虽然并行能力强大,但功耗和延迟问题使其难以在嵌入式和端侧场景中广泛应用。 正是在这样的背景下,RISC-V 向量扩展(RISC-V Vector Extension,简称 RVV) 应运而生。作为 RISC-V 指令集架构的官方标准扩展,RVV 提供了一套灵活、可扩展的向量处理机制,能够以远低于 GPU 的功耗和延迟,实现高效的数据并行计算。从低功耗的 IoT 设备,到高性能的服务器 CPU,RVV 正在成为 RISC-V 生态中最具变革性的技术之一。 RVV 的设计哲学与传统的 SIMD 扩展(如 x86 的 SSE/AVX、ARM 的 NEON/SVE)有着本质的不同。它不是简单地固定宽度的向量寄存器堆,而是引入了运行时可配置向量长度、向量寄存器分组、掩码操作等一系列创新设计,使得同一份 RVV 代码能够在不同硬件实现上高效运行,真正实现了"一次编写,处处加速"。 本文将从底层原理出发,带你深入理解 RVV 1.0 规范的设计精髓,通过完整的代码示例,手把手教你掌握 RVV 编程和优化技巧。无论你是芯片架构师、系统工程师,还是想要在 RISC-V 平台上优化算法性能的开发者,这篇文章都会为你提供完整的知识体系和实战指南。 一、为什么我们需要向量扩展? 在深入探讨 RVV 的具体细节之前,让我们先回答一个最基本的问题:为什么 CPU 需要向量扩展? 1.1 数据级并行的本质 现代计算任务中,绝大多数密集运算都具有一个共同的特征:对大量数据执行相同的操作。例如: 图像卷积:对每个像素点执行相同的乘加运算 矩阵乘法:大量的元素级乘累加操作 神经网络推理:张量之间的批量运算 信号处理:FFT、滤波等时域频域变换 这种"单指令,多数据"的模式,正是向量计算能够发挥巨大优势的场景。如果用传统的标量指令来处理这些任务,每个数据元素都需要取指、译码、执行一次,这会造成巨大的指令开销和控制开销。而向量指令可以在一条指令中处理数十甚至上百个数据元素,将指令吞吐量提升一个数量级。 1.2 传统 SIMD 的局限性 在 RVV 出现之前,主流 CPU 架构都有自己的 SIMD 扩展: ...

May 6, 2026 · 5 min · 👁️ 1 · Tech Snippets

基于 MCP (Model Context Protocol) 的智能 Agent 生态系统构建实战指南

前言 2026 年,AI Agent 的发展已经进入了一个全新的阶段。从早期的单轮对话,到如今能够自主完成复杂任务的智能体,AI 的能力边界正在被不断拓展。然而,在构建真正实用的 AI Agent 时,我们依然面临着一个核心难题:如何让大语言模型安全、高效地与外部世界进行交互? 传统的 Agent 框架如 LangChain、AutoGPT 等虽然提供了工具调用的能力,但它们普遍存在几个致命问题:工具定义分散、权限管理混乱、不同客户端之间无法复用、安全性难以保障。当你为 Claude Desktop 开发了一个文件操作工具后,想要在 Cursor 或 Cline 中复用几乎不可能,一切都要从头开始。这种碎片化的开发生态严重制约了 Agent 技术的普及。 正是在这样的背景下,Anthropic 提出了 MCP(Model Context Protocol)——一个开放的、标准化的协议,旨在彻底解决 AI 工具生态的碎片化问题。MCP 定义了一套统一的接口规范,使得任何遵循该协议的工具服务器都能被所有兼容的 LLM 客户端无缝使用。这就像是为 AI 世界建立了一个通用的"插座标准",从此电器不再需要特制插头。 本文将从底层原理出发,带你深入理解 MCP 的设计哲学和技术架构,通过完整的代码示例,手把手教你构建生产级别的 MCP 服务器。无论你是想要为自己的开发环境增强 AI 能力,还是想要构建企业级的 Agent 平台,这篇文章都会为你提供完整的解决方案。 一、为什么我们需要 MCP? 在深入技术细节之前,让我们先回答一个根本问题:现有的工具调用方案到底出了什么问题?为什么我们需要一个全新的协议? 1.1 传统工具调用的痛点 让我们以最常见的场景为例:你想要让 AI 助手帮你读取本地文件、执行终端命令、查询数据库。在没有 MCP 的时代,你需要怎么做? 如果你使用 Claude Desktop,你需要编写它特定格式的工具定义;如果你切换到 Cursor,又要重写一遍;如果是 VS Code 的其他 AI 插件,可能又是完全不同的格式。每换一个客户端,工具就要重新开发一次。 更糟糕的是安全问题。大多数工具调用方案都是"全有或全无"的——AI 要么拥有完整的文件系统访问权限,要么什么都做不了。你无法精细地控制它只能读取某个特定目录,只能执行某些白名单内的命令。 最后是可维护性问题。当你的工具逻辑更新时,你需要在所有客户端中同步更新,这在团队协作场景下几乎是不可行的。 1.2 MCP 的设计目标 MCP 的诞生正是为了解决上述所有痛点,它的核心设计目标包括: ...

May 6, 2026 · 14 min · 👁️ 1 · Tech Snippets

RK3588 边缘计算平台 AI 加速引擎 RGA 与 NPU 深度实战指南

前言 在 AI 技术快速落地的今天,边缘计算正成为一个不可忽视的重要方向。与云端推理相比,边缘计算具有延迟低、隐私性好、带宽占用少等天然优势。然而,要在嵌入式设备上实现实时 AI 推理,仅仅依靠通用 CPU 的算力是远远不够的。一张 4K 分辨率的图像包含超过 800 万像素,即使是最简单的颜色空间转换操作,如果全部由 CPU 完成,也需要耗费数十毫秒,这对于要求 30fps 以上的实时应用来说是无法接受的。 瑞芯微的 RK3588 芯片正是为了解决这一问题而设计的旗舰级边缘计算平台。它不仅集成了 8 核 ARM CPU 和 Mali-G610 GPU,更重要的是内置了专门的 AI 加速单元——6TOPS 算力的 NPU(神经网络处理器)以及 RGA(2D 图形加速引擎)。这两个硬件加速单元是 RK3588 能够实现实时 AI 视频分析的核心所在。 然而在实际开发中,许多开发者并没有充分发挥这些硬件加速能力。最常见的问题是用 CPU 做图像预处理然后送 NPU 推理,或者在各硬件单元之间进行了不必要的内存拷贝。这些做法不仅浪费了宝贵的硬件资源,还可能导致整个系统的性能下降 5-10 倍。 本文将从底层原理出发,深入解析 RK3588 的 RGA 2D 加速引擎和 NPU 神经网络加速器的工作机制,结合大量可运行的代码示例,带你掌握边缘计算平台的性能优化技巧。我们会详细讲解如何构建零拷贝的数据流水线,实现 VPU-RGA-NPU 的全硬件加速,最终达到 4K 视频下 30fps 以上的 AI 分析能力。 一、为什么边缘计算需要硬件加速? 在深入讲解 RGA 和 NPU 之前,我们首先需要理解为什么在边缘计算场景下硬件加速是必不可少的。 让我们来看一个典型的 AI 视频分析应用的处理流程: ...

May 5, 2026 · 8 min · 👁️ 1 · Tech Snippets

STM32 HAL 库深度解析与外设驱动开发实战指南

前言 在 ARM Cortex-M 单片机生态中,STMicroelectronics 的 STM32 系列无疑是最受欢迎的选择之一。从入门级的 STM32F103 到高性能的 STM32H7,覆盖了从简单的工业控制到复杂的边缘计算等各种应用场景。然而,随着 STM32 产品线的不断扩张,如何在不同系列之间保持代码的可移植性,成为了开发者面临的重要挑战。 ST 官方在 2014 年推出的 HAL(Hardware Abstraction Layer)库,正是为了解决这一问题而生。相比传统的标准外设库(Standard Peripheral Libraries),HAL 库提供了更高层次的抽象,统一了 STM32 全系列的 API 接口,使得从 F1 系列移植到 H7 系列的代码修改量大幅减少。 但是,HAL 库的引入也带来了不少争议。批评者认为 HAL 库封装过度、代码臃肿、执行效率低下。支持者则强调其跨平台的一致性和与 STM32CubeMX 工具链的完美集成。在实际项目中,我们应该如何权衡这些利弊?HAL 库的内部机制究竟是怎样的?如何在享受其便利性的同时避免性能损失? 本文将从源码层面深入解析 HAL 库的设计理念,结合大量实战代码,带你掌握 GPIO、UART、SPI、I2C、TIM 等常用外设的驱动开发技巧。我们不仅会讲解 HAL 库的正确使用方法,还会深入探讨其内部实现原理,帮助你在项目中做出最合适的技术选型。 一、HAL 库 vs 标准库 vs LL 库:如何选择? 在开始深入 HAL 库之前,我们有必要先理清 STM32 生态中几种主流的开发方式。很多新手在刚接触 STM32 时,往往会被各种库的选择搞得晕头转向。标准库、HAL 库、LL 库,甚至直接操作寄存器,到底应该用哪种方式? 1.1 标准外设库(SPL)的兴衰 标准外设库(Standard Peripheral Libraries)是 ST 最早推出的固件库,在 STM32F1/F2/F4 时代被广泛使用。它的特点是: ...

May 3, 2026 · 9 min · 👁️ 1 · Tech Snippets

基于 FreeRTOS 的嵌入式实时系统设计与调试实战指南

前言 在嵌入式系统开发领域,从简单的 8 位单片机跑超级循环,到复杂的 32 位 MCU 运行多任务操作系统,这是每个嵌入式开发者必然经历的成长路径。而 FreeRTOS 作为市场占有率最高的轻量级实时操作系统,几乎是嵌入式工程师必须掌握的核心技能之一。 然而,很多开发者对 FreeRTOS 的理解还停留在「能跑几个任务」的层面。真正要构建一个健壮、高效、可维护的实时系统,远不止调用 xTaskCreate 那么简单。任务优先级如何合理分配?死锁和优先级翻转如何避免?中断与任务之间如何安全通信?内存泄漏如何检测和预防?这些问题在实际项目中往往比实现功能本身更具挑战性。 本文将从实战角度出发,系统讲解 FreeRTOS 的核心设计理念,结合大量代码示例,带你深入理解实时系统的设计原则。从任务管理、同步机制、通信方式到调试技巧,每一个知识点都配有可运行的代码和详细的原理解析。无论你是刚开始接触 RTOS 的新手,还是想要深入理解内核实现的进阶开发者,都能从本文中获得有价值的参考。 一、为什么选择 FreeRTOS? 在众多 RTOS 选型时,我们有很多选择:从商用的 VxWorks、QNX,到开源的 FreeRTOS、Zephyr、RT-Thread,再到芯片厂商自家的 RT-Thread、AliOS Things 等等。那么 FreeRTOS 为什么能脱颖而出,成为绝大多数嵌入式领域的事实标准? 1.1 极致的轻量级设计 FreeRTOS 的核心内核代码只有几十个 C 文件,最小内存占用极低。一个最小配置下,ROM 占用通常在 6-10KB 左右,RAM 占用甚至可以低至几百字节。这使得它能够运行在资源极其有限的 MCU 上,从 8 位的 8051 到 32 位的 Cortex-M7 都能完美适配。 这种轻量级不是通过阉割功能换来的,而是精心设计的结果。内核采用「按需配置」的设计哲学,所有功能都是可裁剪的。你用不到的功能,就不会被编译进最终固件。 1.2 商业友好的许可证 FreeRTOS 使用 MIT 许可证,这意味着你可以完全免费地将其用于商业产品中,不需要公开你的源代码,也不需要支付任何专利费用。这对于商业公司来说是一个巨大的优势。对比之下,Linux 的 GPL 许可证在很多商业场景下会受到限制,而商用 RTOS 的授权费用往往高达数万甚至数十万美元。 1.3 广泛的芯片支持与社区生态 FreeRTOS 几乎支持所有主流的处理器架构:ARM Cortex-M/R/A、RISC-V、Xtensa、AVR、PIC、MSP430 等等。几乎你能想到的 MCU,官方都提供了移植好的端口代码。同时,由于市场占有率高,遇到问题很容易在社区找到解决方案,各种第三方组件、驱动、中间件也极其丰富。 ...

May 2, 2026 · 9 min · 👁️ 1 · Tech Snippets

AI Agent 工作流设计与自动化实战指南

前言 在大语言模型飞速发展的今天,单纯的问答已经远不能满足复杂场景的需求。AI Agent 作为一种能够自主理解任务、制定计划、调用工具并完成执行的智能体,正在成为下一代 AI 应用的核心形态。从最早的 AutoGPT 引发轰动,到如今 LangChain、CrewAI 等框架日趋成熟,AI Agent 的落地应用正在从概念验证走向生产环境。 然而,真正将 AI Agent 应用到实际工作流中,远不止是调用几个 API 那么简单。如何设计合理的 Agent 架构?如何处理任务分解与执行中的不确定性?如何保证工具调用的可靠性?如何在多 Agent 协作中避免冲突与死锁?这些都是每个开发者在构建生产级 Agent 系统时必须面对的问题。 本文将从实际应用出发,系统介绍 AI Agent 的工作流设计方法论,结合大量实战代码,带你从零构建一个能够完成复杂任务的自动化 Agent 系统。无论你是想在个人项目中引入 AI 自动化,还是在企业中落地 Agent 应用,本文都能为你提供可直接复用的思路与代码。 一、AI Agent 的核心设计理念 1.1 什么是真正的 Agent? 很多人对 AI Agent 的理解停留在"能调用工具的大模型",但这只是最表层的特征。一个完整的 Agent 应该具备以下四个核心能力: 自主规划能力:面对模糊的任务描述,能够将其分解为清晰的执行步骤,并动态调整计划。这是 Agent 与普通脚本最大的区别——脚本按固定流程执行,而 Agent 能根据实际情况动态决策。 工具使用能力:根据任务需要,自主选择并调用合适的工具,包括代码执行、网络搜索、API 调用、文件操作等。这是 Agent 突破大模型知识边界的关键。 记忆与反思能力:能够记住之前的执行结果,从中学习并调整后续策略。反思机制让 Agent 能够从失败中恢复,不断优化执行路径。 多轮迭代能力:一次执行往往不能得到完美结果,Agent 需要具备自我评估和迭代改进的能力,直到达到任务目标。 这四个能力层层递进,共同构成了 Agent 的智能基础。缺少任何一环,都只能算是"半成品"的 Agent。 1.2 ReAct 框架:思考与行动的循环 目前主流的 Agent 实现大多基于 ReAct(Reasoning + Acting)框架,其核心思想是让大模型在思考和行动之间交替进行,形成"思考-行动-观察-再思考"的循环。 ...

May 1, 2026 · 11 min · 👁️ 3 · Tech Snippets

基于 RK3506 的高效图像识别开发完整指南

前言 在嵌入式 AI 应用日益普及的今天,如何在成本、性能和功耗之间找到最佳平衡点,是每一个嵌入式开发者都需要面对的问题。瑞芯微 RK3506 作为一款面向工业控制、智能语音和多媒体交互场景的高性价比芯片,凭借其三核 Cortex-A7 架构和 2D 硬件加速能力,为边缘端的图像识别应用提供了全新的可能性。 本文将从零开始,完整介绍如何基于 RK3506 芯片进行高效的图像识别开发,包括开发环境的搭建、工具链的配置、图像采集与预处理、推理引擎的部署、调试方法以及性能优化的最佳实践。所有步骤均经过实际验证,确保读者可以按照本文一步步实现自己的图像识别应用。 一、RK3506 芯片概述 1.1 芯片核心规格 RK3506 是瑞芯微推出的一款面向工业级应用的高性价比 SoC,其核心规格如下: 规格项 参数说明 CPU 架构 三核 ARM Cortex-A7,主频可动态调节 2D 加速 内置 2D 硬件加速器,支持 1280x1280@60fps 显示输出 显示接口 MIPI DSI,支持高清显示屏 网络接口 双路 100M 以太网 工业总线 CAN FD 音频接口 PDM 麦克风输入,支持语音应用 工作温度 -40°C ~ 85°C 工业级温度范围 GPIO 40 引脚 Raspberry Pi 兼容接口 1.2 为什么选择 RK3506 做图像识别? 很多开发者可能会问:RK3506 没有内置 NPU,为什么要用它来做图像识别?答案在于以下几个方面: 第一,极致的成本控制。 在很多工业场景中,并不需要运行复杂的大模型,只需要完成特定的视觉任务,比如二维码识别、颜色检测、简单的物体分类等。对于这些应用,RK3506 的三核 CPU 完全能够胜任,而成本相比带 NPU 的芯片要低得多。 ...

April 25, 2026 · 8 min · 👁️ 4 · Tech Snippets

基于 OpenCV 的红色物体识别与多目标跟踪实战

前言 在计算机视觉领域,颜色检测是最基础也最实用的技术之一。红色作为一种醒目的颜色,在交通标志、安全警示、工业自动化等场景中应用广泛。今天我们来深入探讨如何用 OpenCV 实现红色物体的识别,并在此基础上实现多目标跟踪功能。 这篇文章不是简单的 API 调用演示,而是从原理出发,结合实际场景中的问题,一步步构建一个健壮的检测与跟踪系统。我们会遇到光照变化、噪声干扰、部分遮挡等实际问题,然后逐一解决。 一、为什么选择 HSV 颜色空间? 当我们谈论颜色检测时,很多新手第一反应是直接在 RGB 图像上做阈值处理。比如,红色物体的 R 通道值比较高,那么我们设定一个阈值,只保留 R > 200 的像素。但实际一试就会发现,这种方法效果非常差。 问题出在哪里?RGB 颜色空间虽然直观,但它把亮度和颜色信息混在一起了。同一个红色物体,在强光下和阴影下,RGB 值可能差异巨大,但人眼感知到的颜色其实是一样的。这就导致基于 RGB 的阈值检测非常不稳定。 这时候 HSV 颜色空间就派上用场了。HSV 把颜色信息分解成三个独立的通道: H (Hue, 色调):表示颜色的种类,取值范围在 OpenCV 中是 0-179 S (Saturation, 饱和度):表示颜色的鲜艳程度,0-255 V (Value, 明度):表示颜色的明亮程度,0-255 HSV 的优势在于,颜色信息主要由 H 通道决定,而 V 通道单独控制亮度。这意味着,即使光线变化导致 V 值波动,只要 H 值在我们设定的红色范围内,我们仍然能稳定地检测到目标。 二、红色在 HSV 空间中的特殊性 红色有个有意思的特性:它在色相环的两端都有分布。在标准的 0-360 度色相环中,红色出现在 0 度附近和 360 度附近。OpenCV 为了用 8 位表示,把这个范围减半成了 0-179,所以红色就分布在 0-10 和 170-179 这两个区间。 ...

April 23, 2026 · 6 min · 👁️ 3 · Tech Snippets

PCB 设计最佳实践 2026

引言 本文基于 2026 年最新行业资料整理,涵盖 PCB design guidelines 2026 的核心概念、开发流程和实战技巧。 PCB 设计流程 原理图设计 → 网表生成 元件布局 → 按功能模块分区 布线 → 先电源/地,后信号 DRC 检查 → 设计规则验证 输出 Gerber → 生产文件 布局原则 按功能分区:模拟/数字分开 缩短关键路径:高速信号优先 去耦电容靠近引脚:减小环路面积 布线规则 信号类型 线宽 间距 说明 电源 ≥20mil ≥10mil 大电流 地 ≥20mil ≥10mil 低阻抗 高速 8-10mil ≥8mil 阻抗控制 普通 6-8mil ≥6mil 一般信号 EMC 设计 多层板:完整地平面 屏蔽:敏感电路加屏蔽罩 滤波:电源入口加磁珠 + 电容 参考资料 PCB Design Guide & DFM Best Practices 2026 - KnownPCB Bytesnap Design publishes its 2026 guide for PCB … - Engineer Live 2026 Engineer’s Guide: 10 Powerful Free PCB Design Tools Worth Trying - 86PCB 本文基于网络公开资料整理,结合嵌入式开发实践经验编写。 ...

April 21, 2026 · 1 min · 👁️ 8 · Tech Snippets

嵌入式系统安全深度指南:从原理到实践

嵌入式安全概述 随着 IoT 设备爆炸式增长,嵌入式系统安全已成为关乎国家安全、企业命脉和个人隐私的核心议题。据统计,2025 年全球 IoT 设备数量突破 300 亿台,而其中超过 60% 的设备存在严重安全漏洞。从智能家居摄像头被黑客入侵,到工业控制系统遭受勒索软件攻击,安全事件频发警示我们:嵌入式安全不再是可选项,而是必选项。 本文深入探讨嵌入式安全开发的完整体系,涵盖安全启动、加密通信、安全存储、防攻击技术和安全开发生命周期,帮助开发者构建真正安全的嵌入式系统。 1.1 嵌入式安全威胁 landscape 威胁类型 典型攻击 影响 案例 固件篡改 恶意固件注入 设备被控制 Mirai 僵尸网络 数据窃取 内存 dump、总线嗅探 隐私泄露 医疗数据泄露 侧信道攻击 功耗分析、时序分析 密钥泄露 智能卡破解 物理攻击 探针、FIB、激光注入 系统突破 游戏机越狱 供应链攻击 恶意组件、后门植入 系统性风险 SolarWinds 事件 1.2 安全设计原则 嵌入式安全设计应遵循以下核心原则: 纵深防御(Defense in Depth):多层防护,单点失效不导致系统崩溃 最小权限(Least Privilege):每个组件只拥有完成任务所需的最小权限 失效安全(Fail Secure):系统故障时进入安全状态 安全默认配置(Secure by Default):出厂即安全,无需用户配置 安全更新(Secure Update):支持安全可靠的远程升级 安全启动(Secure Boot) 2.1 安全启动原理 安全启动的核心思想是信任链(Chain of Trust):从硬件固化的根信任开始,逐级验证每一级代码的完整性和真实性,确保只有可信代码能够执行。 ┌ │ ├ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ┌ │ │ │ └ ┌ │ │ └ ┌ │ │ └ ┌ │ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 硬 ( ─ ─ B ─ ─ B ─ ─ 应 ( ─ ─ ─ ─ ─ 件 R T ─ ─ o S ─ ─ o S ─ ─ 用 F ─ ─ ─ ─ ─ 根 o r ─ ─ o t ─ ─ o t ─ ─ 固 i ─ ─ ─ ─ ─ 信 o u ─ ─ t a ─ ─ t a ─ ─ 件 r ─ ─ ─ ─ ─ 任 t s ─ ─ l g ─ ─ l g ─ ─ m ─ ─ ─ ─ ─ t ┬ │ ▼ ─ o e ┬ │ ▼ ─ o e ┬ │ ▼ ─ w ─ ─ ─ ─ ─ o ) ─ ─ a ─ ─ a ─ ─ a ─ ─ ─ ─ ─ f ─ 验 ─ d 1 ─ 验 ─ d 2 ─ 验 ─ r ─ ─ ─ ─ ─ │ ─ 证 ─ e ─ 证 ─ e ─ 证 ─ e ─ ─ ─ ─ ─ ─ 签 ─ r ─ 签 ─ r ─ 签 ─ │ ) ─ ─ ─ ─ ─ ─ 名 ─ ─ 名 ─ ─ 名 ─ ─ ─ ─ ─ ─ ← ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ │ ┘ ┐ │ │ ┘ ┐ │ │ ┘ ┐ ← │ ┘ ─ ─ ─ 固 ─ ─ ─ 化 最 ─ ─ ─ 在 ← ← 终 ─ ─ 安 ─ 执 ─ ─ 全 ─ R 一 二 行 ─ ─ 启 ─ O 级 级 代 ─ ─ 动 ─ M 引 引 码 ─ ─ 信 ─ 导 导 ─ ─ 任 ─ 中 程 程 ─ ─ 链 ─ , 序 序 ─ ─ ─ 不 ( ( ─ ─ ─ 可 验 验 ─ ─ ─ 篡 证 证 ─ ─ ─ 改 二 应 ─ ─ ─ 级 用 ─ ─ ─ 引 固 ─ ─ ─ 导 件 ─ ─ ─ ) ) ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ ─ ─ ─ ─ ─ ─ ─ ┐ ┤ │ │ │ │ │ │ │ │ │ │ │ │ │ ┘ │ │ │ 2.2 加密算法选择 安全启动依赖非对称加密算法进行签名验证: ...

April 20, 2026 · 13 min · 👁️ 2 · Tech Snippets

嵌入式开发:Embedded C Programming Best Practices

引言 本文基于 2026 年最新行业资料整理,涵盖 embedded C programming best practices 的核心概念、开发流程和实战技巧。 embedded C programming best practices 概述 嵌入式系统开发需要掌握硬件、软件和系统集成的综合技能。 开发流程 需求分析 → 确定功能、性能指标 硬件选型 → MCU、传感器、通信模块 原理图设计 → 电路设计、仿真验证 软件架构 → 分层设计、模块化 编码实现 → C/C++、RTOS、驱动 调试测试 → 单元测试、系统集成 生产部署 → 批量生产、OTA 升级 常用工具 IDE:Keil、IAR、STM32CubeIDE、VS Code 调试器:J-Link、ST-Link、DAP-Link 示波器:Siglent、Rigol、Keysight 逻辑分析仪:Saleae、Kingst 学习路线 C 语言基础 → 指针、结构体、内存管理 单片机原理 → GPIO、中断、定时器 外设驱动 → UART、SPI、I2C、ADC RTOS → 任务、信号量、消息队列 项目实战 → 综合应用 参考资料 Embedded C Programming | Tips and Best Practices | IIES Embedded C Programming | Tips and Best Practices | IIES Best Practices for Embedded C Programming: Ensuring Efficiency, Reliability, and Maintainability 本文基于网络公开资料整理,结合嵌入式开发实践经验编写。 ...

April 20, 2026 · 1 min · 👁️ 0 · Tech Snippets

实时检测指定颜色和形状的物体:算法方案对比与实现

引言 在工业检测、机器人视觉、智能分拣等应用场景中,我们经常需要实时检测特定颜色和形状的物体。例如: 冰壶比赛自动计分系统:检测冰面上的圆形冰壶 工业零件分拣:检测红色圆形螺丝、蓝色方形螺母 自动驾驶交通标志识别:检测圆形红圈禁令标志 AGV 小车导航:识别地面彩色圆形二维码 本文将从简单到复杂,介绍几种常见的实现方案,对比它们的性能,并提供完整的开源参考代码,帮助你根据实际场景选择最合适的方案。 方案对比总览 我们主要对比四种主流方案: 方案 原理 计算量 准确率 适合场景 MCU 能否运行 颜色分割 + 轮廓检测 阈值分割 + 形状分析 极低 对颜色形状变化敏感 背景简单、光照稳定 ✅ Cortex-M7 可以 颜色空间转换 + Hough 变换 Hough 圆/直线检测 低 圆形检测较好 固定形状检测 ✅ Cortex-M4 可以 Blob 分析 + 特征匹配 连通域分析 + 形状分类 中 中等 多目标批量处理 ✅ Cortex-M7 可以 深度学习目标检测 YOLO/SSD 直接检测 高 鲁棒性强 复杂背景、光照变化 ❌ 需要 MCU+NPU 或 Linux 下面详细介绍每种方案的实现。 方案一:颜色分割 + 轮廓检测 1.1 算法流程 原始图像 RGB/BGR 颜色空间转换 RGB → HSV 颜色阈值分割 二值掩码 形态学处理 腐蚀 + 膨胀 查找轮廓 cv2.findContours 形状特征计算 面积、周长、圆形度 输出:符合颜色和形状要求的目标 颜色分割 + 轮廓检测流程图 1.2 核心原理 颜色空间转换:从 RGB 转到 HSV 颜色空间,更容易按颜色分割 阈值分割:对 H/S/V 三个通道设置范围,得到二值掩码 形态学处理:腐蚀 + 膨胀去除噪声 轮廓查找:找到所有连通区域 形状特征计算:计算面积、周长、圆形度、矩形度等特征 特征匹配:筛选符合指定形状的目标 1.3 完整 Python 实现 import cv2 import numpy as np def detect_color_shape( image, color_lower=np.array([0, 120, 70]), color_upper=np.array([10, 255, 255]), shape_type="circle", min_area=100, max_area=10000, circularity_threshold=0.8, aspect_ratio_range=(0.9, 1.1) ): """ 检测指定颜色和形状的物体 参数: image: 输入 RGB/BGR 图像 color_lower: HSV 颜色下限 color_upper: HSV 颜色上限 shape_type: "circle" / "square" / "rectangle" min_area: 最小面积(像素) max_area: 最大面积(像素) circularity_threshold: 圆形度阈值(0~1,越大越圆) aspect_ratio_range: 宽高比范围(方形接近 1) 返回: detections: 检测结果列表 [(x, y, w, h, contour), ...] mask: 颜色分割掩码(用于调试) """ # 1. 颜色空间转换:BGR → HSV hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 2. 颜色阈值分割 mask = cv2.inRange(hsv, color_lower, color_upper) # 3. 形态学处理去除噪声 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 4. 查找轮廓 contours, hierarchy = cv2.findContours( mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) detections = [] for contour in contours: # 计算轮廓面积,过滤太小/太大的 area = cv2.contourArea(contour) if area < min_area or area > max_area: continue # 计算轮廓周长 perimeter = cv2.arcLength(contour, True) # 多边形逼近 approx = cv2.approxPolyDP(contour, 0.04 * perimeter, True) # 获取外接矩形 x, y, w, h = cv2.boundingRect(contour) # 形状判断 matched = False if shape_type == "circle": # 圆形度 = 4π * 面积 / (周长^2) # 完美圆形 = 1,越不规则值越小 circularity = 4 * np.pi * area / (perimeter * perimeter) if circularity >= circularity_threshold: matched = True elif shape_type == "square": # 宽高比接近 1,且顶点数约为 4 aspect_ratio = float(w) / h if (len(approx) == 4 and aspect_ratio >= aspect_ratio_range[0] and aspect_ratio <= aspect_ratio_range[1]): matched = True elif shape_type == "rectangle": # 顶点数约为 4 即可 if len(approx) == 4: matched = True elif shape_type == "triangle": if len(approx) == 3: matched = True if matched: center_x = x + w // 2 center_y = y + h // 2 detections.append((center_x, center_y, w, h, contour)) return detections, mask 1.4 使用示例 # 检测红色圆形物体 # HSV 红色范围(两种分段,因为红色在 H 通道首尾) lower_red1 = np.array([0, 120, 70]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 120, 70]) upper_red2 = np.array([180, 255, 255]) # 读取图像 image = cv2.imread("test_image.jpg") # 第一次检测 detections1, mask1 = detect_color_shape( image, lower_red1, upper_red1, shape_type="circle", min_area=500 ) # 第二次检测(另一红色区间) detections2, mask2 = detect_color_shape( image, lower_red2, upper_red2, shape_type="circle", min_area=500 ) # 合并结果 all_detections = detections1 + detections2 combined_mask = mask1 | mask2 # 在原图上绘制结果 for (x, y, w, h, contour) in all_detections: cv2.drawContours(image, [contour], -1, (0, 255, 0), 2) cv2.circle(image, (x, y), 3, (0, 0, 255), -1) cv2.putText(image, "Red Circle", (x-20, y-h-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imwrite("result.jpg", image) print(f"检测到 {len(all_detections)} 个红色圆形物体") 1.5 常见颜色 HSV 范围参考 颜色 H 下限 H 上限 S 下限 S 上限 V 下限 V 上限 红色 0/170 10/180 120 255 70 255 橙色 11 25 120 255 70 255 黄色 26 35 120 255 70 255 绿色 36 70 120 255 70 255 青色 71 99 120 255 70 255 蓝色 100 124 120 255 70 255 紫色 125 155 120 255 70 255 粉色 156 169 120 255 70 255 黑色 0 180 0 255 0 46 灰色 0 180 0 43 47 221 白色 0 180 0 30 222 255 注意:不同相机的白平衡和亮度设置不同,实际使用时需要根据你的图像微调范围。建议用 OpenCV 窗口滑动条调参: ...

April 15, 2026 · 8 min · 👁️ 3 · Tech Snippets

STM32 项目实战教程 2026

引言 本文基于 2026 年最新行业资料整理,涵盖 STM32 microcontroller projects 的核心概念、开发流程和实战技巧。 STM32 系列选择 ST 提供多个 STM32 系列: 系列 内核 频率 应用 F0 Cortex-M0 48MHz 入门级 F1 Cortex-M3 72MHz 通用型 F4 Cortex-M4 180MHz 高性能 H7 Cortex-M7 550MHz 旗舰级 开发环境 推荐使用 STM32CubeIDE: # 安装 STM32CubeMX chmod +x STM32CubeMX.sh ./STM32CubeMX.sh # 生成项目 # 1. 选择 MCU 型号 # 2. 配置时钟、GPIO、外设 # 3. 生成初始化代码 GPIO 控制 // 点亮 LED void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void LED_On(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); } 常用外设 UART:串口通信 SPI:高速外设(Flash、显示屏) I2C:传感器(温湿度、加速度计) ADC:模拟信号采集 Timer:PWM 输出、输入捕获 参考资料 STM32 Projects: 100+ STM32F103C8 Based Projects with Code STM32 (STM32F103C8) Projects & Tutorials STM32 Projects for beginners and advanced level - Steppeschool 本文基于网络公开资料整理,结合嵌入式开发实践经验编写。 ...

April 14, 2026 · 1 min · 👁️ 1 · Tech Snippets