本站为个人非经营性网站,仅用于技术学习与分享,不提供任何商品、服务、报价或收费咨询。 合规信息

学习笔记

这里整理我在嵌入式固件、硬件设计、PCB、通信协议与可靠性验证方向的学习笔记,共 30 篇。 每一篇都来自我在个人实验项目中真实写过、调过、踩过坑的代码,写的是“当时为什么这么做”和“后来发现哪里不对”, 而不是教科书式的概念复述。全部为原创整理,采用 CC BY-NC-SA 4.0 许可协议。 每篇标注的日期是对应项目的实际时间(取自工程源码与版本记录),按时间倒序排列。

原创内容 · 30 篇 CC BY-NC-SA 4.0 来自真实项目 欢迎指正
2017 – 2026
已发布

我用过的几种 32 位单片机:特性、用途与编程差异

不排名、不推荐,只把我实际写过程序的几个系列摆在一起做对照:内核档位在代码里表现成什么差别、资源大小如何决定要不要上 RTOS、三套库风格与时钟树的写法差异、Flash 编程单位与唯一 ID 的处理,以及换平台时必须重新核对的一张清单。

32 位 MCU 内核档位 厂商库 移植
阅读全文 →
2023 – 2026
已发布

固件框架的几种写法:前后台、时间片、状态机与 RTOS 任务

框架不是“高级不高级”,而是“复杂度放在哪里”。把纯前后台、时间片轮询、状态机主导、RTOS 任务四种写法摆在一起,用“按键 + 采集 + 通信”这三件典型事做对照,并给出五维选型表和迁移时最容易出事的地方。

固件架构 前后台 时间片 RTOS 任务
阅读全文 →
2022 – 2026
已发布

DMA 传输与中断配置:从寄存器到“什么时候用哪种模式”

DMA 的难点不在配置寄存器,而在“什么时候能安全地碰它”——改长度、改地址、重新使能都必须在传输真正停止之后。整理配置一份 DMA 要定的八个参数、三种中断的分工、收发两条路径上的经典坑,以及通道冲突的真实经历。

DMA 中断 循环模式 双缓冲
阅读全文 →
2023 – 2026
已发布

串口接收的三种做法:轮询、中断与 DMA + 空闲中断

三种做法解决的是同一个问题:数据到了怎么第一时间拿走。给出各自的配置顺序、对照表与适用场景,并完整复盘一个真实事故——频繁拔插之后串口只收到一个字节,最后靠“填满 DMA 强制重启接收”恢复。

串口接收 空闲中断 DMA 故障恢复
阅读全文 →
2025 – 2026
已发布

LwIP 协议栈使用笔记:三种 API、配置项取舍与常见坑

先把三块地基铺好(网卡驱动接口、内存与缓冲、操作系统适配层),再讲 raw / netconn / socket 三种编程接口各自适合谁用、`lwipopts.h` 里真正要动手改的配置项、超时与重连、以及“网线没插时不能卡死”。

LwIP 协议栈 socket 配置
阅读全文 →
2023 – 2026
已发布

FreeRTOS 使用笔记:把项目里真正用到的部分讲清楚

只讲项目里真的用过的那部分:任务怎么建(动态还是静态)、优先级与栈怎么定、五种任务间通信方式怎么选、临界区与中断安全 API、堆大小怎么估,以及几种“RTOS 特有故障”各自能被观察到什么现象。

FreeRTOS 任务 任务间通信 栈与堆
阅读全文 →
2025 – 2026
已发布

多板卡系统的通信分层:什么时候用以太网,什么时候用 RS485

同一套系统里,人机面板与主控走以太网、主控与上位机走长连接、主控与现场执行机构走 RS485、 整机数据经无线上云。这不是“技术栈不统一”,而是每一层要解决的约束不同。 把选型判据摊开成一张五维表,并说明我为什么在两个项目里做出了相反的传输层选择。

通信分层 以太网 RS485 协议选型
阅读全文 →
2022 – 2026
已发布

拿到一份陌生固件工程的前 30 分钟

不管是接手别人的代码,还是半年后回头看自己的老项目,第一件事都不该是“先编译一遍”。 按固定顺序做七件事:确认真实编译清单、读出芯片资源、核对启动文件与链接脚本、 找时钟与引脚、建立版本时间线、识别没被调用的代码、交叉验证文档与代码。

代码阅读 工程速读 方法论
阅读全文 →
2020 – 2026
已发布

定时器与单位换算的坑:为什么注释不能信

整理多个固件工程时发现,最集中的一类缺陷既不是算法也不是架构,而是时间与单位: 注释写着 100 ms 实际跑 500 ms、栈大小“由 400 改为 1000”其实是十六进制、 同一个换算公式在同族代码里有四种写法、温度单位在注释和实现对不上。 归纳成五类并给出核算清单。

定时器 单位换算 代码审查
阅读全文 →
2026 / 05
已发布

以太网 UDP 通信的工程化:心跳、掉线判定与重连

在 FreeRTOS + LwIP 上跑 UDP,实验室里通很容易,现场稳定很难。 记录 select 超时的用法、socket 出错后“关掉重建 + 延时”的恢复流程、 在线时重试三次而离线时只等一次的策略差别,以及“网线没插时不能卡死”这一条是怎么被提上日程的。

LwIP UDP 心跳 重连
阅读全文 →
2025 / 10
已发布

Modbus 主机的轮询调度与离线降级

写从站时以为难点在协议解析;写过主机才发现难点在时间——什么时候发、发给谁、 等多久、等不到怎么办、下一轮什么时候开始。整理多板卡系统里做主站的几个做法, 以及我改得最值的一条逻辑:离线设备不该享受在线设备的重试待遇。

Modbus 轮询调度 离线降级
阅读全文 →
2022 – 2025
已发布

PCB 布局检查清单:从原理图到打样前的自查

一份我自己在用的打样前检查清单,按“电源与上电时序、时钟与复位、模拟与基准、 通信接口与保护、可制造性与可测试性”五组展开。每一条都注明它对应的真实故障现象, 而不是只列一条“要注意 XX”。

PCB Layout DFM 检查清单
阅读全文 →
2023 – 2025
已发布

从样机走到量产,真正缺的是什么

“能跑起来”和“能稳定出货”之间隔着的不是技术难度,而是一堆看起来不重要的工程环节: 版本对应关系、产测流程、参数版本、出厂状态、看门狗、故障可观测性。 按我在几个项目里补过的窟窿逐条复盘。

工程方法 产测 版本管理 可追溯
阅读全文 →
2023 – 2025
已发布

RS485 收发方向控制:硬件自动、外设自动与软件手动

半双工为什么要“换挡”、换挡要花多久。三种做法逐一拆开:软件手动(GPIO 控制方向脚)、硬件自动(发送信号驱动方向脚)、外设自动(串口内置方向控制),并讲清两处延时各自在防什么、以及为什么“等错了标志会截断最后一个字节”。

RS485 方向控制 半双工 时序
阅读全文 →
2022 – 2025
已发布

定时器与 PWM 配置基础:从时基到互补输出

从时基配置四步讲到比较输出、互补输出与死区,再用比较中断翻转电平产生任意波形。重点放在两个真实的边界问题上:比较值等于周期值时会发生什么、改比较值时会不会多出一个脉冲。

定时器 PWM 互补输出 死区
阅读全文 →
2023 – 2025
已发布

串口通信的帧同步:四种“怎么知道一帧收完了”的做法

串口协议里最难的不是解析,而是判断一帧的边界。整理我在四个工程里实际用过的四种做法: 长度字段主动闭合、字节间超时(3.5 字符时间)、串口空闲中断与软件模拟空闲中断、帧头搜索。 给出对比表、各自的失效场景,以及方向脚切换与帧同步之间的耦合。

帧同步 空闲中断 DMA 超时判定
阅读全文 →
2025 / 10
已发布

压力传感器的标定与温度补偿:从线性拟合到二维多项式

从 24 位 ADC 码值到压力值的换算、零点与满量程标定、以及温度带来的漂移怎么补。 记录一层线性补偿(增益 + 偏移)和一层 21 系数五阶二维多项式温度补偿的实现方式, 以及“参数靠仿真得出、代码里留两套系数备份”的现实做法。

压力传感器 标定 温度补偿 ADC
阅读全文 →
2025 / 10
已发布

低功耗休眠、唤醒与喂狗的三件套

低功耗的工作量不在“调一个进休眠的函数”,而在把“系统一直在跑”这个隐含假设 从代码里一条一条找出来:看门狗没人喂了、系统滴答不再可靠了、串口得先能唤醒 CPU。 记录在小容量 MCU 上把休眠、唤醒与喂狗拼成一个闭环的过程。

低功耗 看门狗 休眠唤醒
阅读全文 →
2025 / 09
已发布

嵌入式参数存储设计:Flash 分区、双区备份与 CRC 校验

先把 Flash 寿命算清楚:手册标称最低 1000 次擦写,按每 10 分钟保存一次,不到两周就会写坏一页。 然后讨论“结构体 + 尾部 CRC”这个够用但很脆的方案、双区备份与原子切换的三种做法, 以及参数版本号为什么是必须留的一条后路。

Flash CRC 双区备份 参数管理
阅读全文 →
2025 / 09
已发布

Bootloader 跳转与 OTA:分区规划、向量表偏移与容易踩的坑

跳转这件事看起来只有三行代码,背后却有一堆前提。记录分区表怎么定、 为什么“跳过去之后 SysTick 不走了”、中断开关为什么会跨程序遗留、 Flash 寿命这笔账要在方案阶段算,以及两种“从 APP 回到 Bootloader”方案的侵入性取舍。

Bootloader OTA 中断向量表 Flash 寿命
阅读全文 →
2023 / 11
已发布

点阵显示的内存预算:一次把 SRAM 算清楚

一次“显示错乱”的 bug,根因是算术:64×64 点阵、128 个汉字、双页缓存, 算下来需要 128 KB,而芯片只有 192 KB SRAM,还要放 RTOS 堆和栈。 从字号到字节数完整推导一遍,并讨论“用产品规格规避内存不足”这种做法的问题。

点阵显示 字库 内存预算 双缓冲
阅读全文 →
2023 / 11
已发布

芯片唯一 ID 与程序绑定:一个实用但容易反噬的做法

用 MCU 的唯一 ID 加一个常量做异或与乘法,生成校验字写进存储,开机重算比对—— 这是防止程序被整包复制烧到别的板子上最省事的做法。记录它的实现细节、 取 ID 时防止编译器优化的小技巧,以及它在产线换板、售后维修、看门狗喂狗上的反噬。

UID 授权校验 产测 风险分析
阅读全文 →
2023 / 10
已发布

分层状态机与故障优先级:把“设备现在怎么了”讲清楚

状态机的第一作用不是控制流程,而是让设备的状态可以被外部观察。 记录“一个状态一个 FreeRTOS 任务”这种写法的好处与坑、状态切换时的原子性问题、 任务创建失败的重试策略,以及用“数值区间”划分故障可清除等级的设计。

状态机 FreeRTOS 故障码 任务管理
阅读全文 →
2023 / 06
已发布

掉电检测与重启抑制:为什么“一掉电就复位”是错的

最早的掉电处理只有一句话:检测到没电就复位。逻辑上无懈可击,现场却变成 “屏幕反复重启、动作被打断”。记录这件事上的三次迭代——从加滤波到再加长滤波, 最后才想明白:抗误判和抢时间是两个相反的目标,用一个旋钮拧不出来。

掉电保护 电源监测 重启抑制
阅读全文 →
2023 / 06
已发布

计量脉冲的判向、倍频与消抖

流量计和编码器输出的脉冲,看起来只是“来一个边沿加一个数”。 但这条通道上的坑几乎都不在“加一”这个动作上,而在三个判断里: 这一下是正转还是反转、一个周期该算几个计数、这几个边沿到底是脉冲还是抖动。

计量脉冲 正交编码 消抖
阅读全文 →
2023 / 06
已发布

嵌入式存储的三层分工:片上 Flash、EEPROM 与外挂 Flash

一开始我以为“板子上多挂一颗存储芯片”是浪费。后来数据从几个整定值涨到了 日累计、班累计、明细流水、设置与异常日志,再加一份固件镜像,片内 Flash 一下就不够用了。 三层存储不是堆料,是按数据的“脾气”分工——记录划分这三层的判断依据。

存储设计 Flash EEPROM
阅读全文 →
2023 / 06
已发布

参数表设计:用一张四元组表撑起校验、格式化与权限

一台带显示的仪表,可设置项很容易堆到一百多项。每项只描述四个字段 (最小值、最大值、出厂值、类型标志),就能免费得到显示格式化、范围校验、 出厂恢复与权限分级四项能力。也如实写出这套做法的代价与踩过的坑。

参数管理 配置表 代码结构
阅读全文 →
2023 / 04
已发布

Modbus RTU 从站实现笔记:寄存器表、CRC 与异常码

以一块液位采集小板(HC32F030)为例,记录从站实现里真正费时间的几个环节:寄存器表怎么划、 为什么把“采集值 / 补偿值 / 精度值”拆成三个寄存器、0x03 与 0x10 之外的功能码要不要实现、 CRC 错误与参数错误为什么必须分开返回,以及 RS485 方向控制那一毫秒延时到底在防什么。

Modbus RTU RS485 异常码 CRC16
阅读全文 →
2023 / 04
已发布

采样数据的处理:环形缓冲、中值滤波与迟滞控制

为什么“取一次 ADC 值就用”一定会出问题。从 20 点环形缓冲的写法,到“排序后取中间三点平均” 这个兼顾抗脉冲与输出连续性的算法取舍,再到阈值为什么必须是一对而不是一个。 最后记录一个符号-数值表示法带来的坑。

ADC 中值滤波 迟滞比较 环形缓冲
阅读全文 →
2023 / 04
已发布

不用 RTOS 的固件怎么写:时间片轮询 + 消息队列

2 ms 节拍、60 个 tick 一轮、四个 15-tick 窗口——用一个节拍把两路液位和两路温度排开。 讨论“中断里只改一个变量、重活留给主循环”的设计,自己实现的 512 字节环形队列, 以及消费端关中断而生产端不关的原因。最后给出“什么时候该上 RTOS”的判断清单。

裸机 时间片 消息队列 临界区
阅读全文 →