ESP8266 AT 模式下的 `+IPD` 分包陷阱 —— 一次异地 OTA 失败排查记录

嵌入式硬件工程师成长之路·2026(2):电阻与电容选型实战清单——常温能过、高温就漂的 6 个参数 常温测试全绿,45℃ 老化 8 小时就有 3 台采样点漂了 300mV?先别换料。本文按排查顺序拆解:热风枪定位、TCR 误差预算算出温漂只占 22mV,真凶是 X5R 电容的直流偏压衰减。附电阻封装、电容介质、降额系数三张对照表和 5 条避坑清单,单台 9 分钱修完。 阅读详情

ESP8266 AT 模式下的 +IPD 分包陷阱 —— 一次异地 OTA 失败排查记录

现象:同一版固件,实验室升级 100% 成功,现场设备 100% 失败。
排查结论:不是网络不通,是 TCP 分包导致模组的 +IPD 前缀被拼进了固件正文。
关键词:ESP8266 / AT 指令 / +IPD / TCP 分段 / MSS / 路径 MTU / OTA


一、问题现象

设备是 STM32 + ESP8266(AT 固件,普通模式 AT+CIPMODE=0),通过 WiFi 连后台做 OTA 升级。

环境结果
实验室(本地)完全正常,约 1 分钟升完
现场(异地)必然失败,十几台设备同时中招

失败时的串口日志:

OTA_STATUS_INIT
OTA_STATUS_PACK_GET 0/55
OTA_STATUS_PACK_RECE 0/55        ← 响应收到了
[getHttpResponse:181]             ← 解析函数返回"成功"(打印为空)
OTA_STATUS_PACK_FAIL 1/55 fail , retry=1
...  retry=2  3  4  5  全部同样失败
→ 放弃,升级失败

几个很误导人的特征:

  • 只有固件包失败。心跳、拉配置、查询版本这些请求全部正常
  • 失败不是偶发 —— 第 0 包连续 5 次全败,重试完全无效
  • 日志显示 PACK_RECE 打印了,说明响应确实到了,但后面内容校验不过
  • 换 AP、换网络环境,现象一模一样

二、排查过程

2.1 先排除掉一批方向

排查中最容易走弯路的是"先入为主"。我们依次排除:

方向怎么排除的
服务器返回了错误内容抓包对比,响应头 Content-Type / Content-Length 完全正常
数据在传输中损坏抓包提取正文与本地直连获取的逐字节比对,MD5 相同
设备连到了不同的服务器节点抓包里解析到的 IP 与实验室完全一致
模组硬件损坏现场十几台同时失败,且换过 AP 现象不变
请求内容有问题抓包里请求体与实验室逐字节一致
转发/代理链路有问题见 2.3 —— 这个方向试过但被误导了很久

2.2 关键转折:抓包

因为设备在异地、无法直接接串口,最初只能靠后台状态码猜。后来让现场同事
在设备所连的热点侧用 Wireshark 抓包,才拿到决定性证据。

抓包里最有价值的三组数据:

① 响应大小与分段

HTTP 响应头      880 字节
HTTP 正文        512 字节
─────────────────────────
合计            1392 字节

实际被拆成 两个 TCP 段:[1320, 72]

② MSS 协商值(对比两个环境)

方向实验室现场
设备 → 服务器MSS 14601460(相同)
服务器 → 设备MSS 1460MSS 1320 ← 唯一差异

③ 反复重试的分段点完全一致

5 次重试的 TCP 段尺寸都是 [1320, 72],切在正文的同一个位置
→ 说明这不是随机抖动,而是必然重现

2.3 一个值得记的弯路:代理转发测不出来

排查中我们一度用"经代理转发"的方式模拟现场网络,结果165 个包全部成功,
于是误以为"现场网络没问题"。

为什么代理转发测不出来?

因为MSS 是每条 TCP 连接单独协商的,只取决于这条连接两端之间的路径。

设备 ──[连接A]──> 转发入口 ──[连接B]──> 远端 ──> 后端
       本地, MTU 1500            跨 WAN
       ↑                         ↑
   设备只看到这条           代理自己消化

代理把上游响应整个收下来,再通过连接 A 一次性发出。窄口在代理处就终止了,
根本传导不到设备。

教训:代理转发会改写连接拓扑,把跨 WAN 的路径特性(MTU、分段、重传)屏蔽掉。
“走代理测试正常"不能推出"现场网络没问题”。

同类道理:“PC 测速正常"也不代表"设备正常” —— 路径和端点都不是同一个。


三、根因

3.1 TCP 分段是"发方"根据 MTU 决定的

先用一个比喻:

概念通俗说法
MTU一个「箱子」连箱子带运单最大能多大
MSS一个「箱子」里实际能装多少货(≈ MTU − 40)
MTU 1500  →  MSS 1460
MTU 1360  →  MSS 1320

两个环境要发的东西一模一样大(1392 字节),但:

实验室:1392 < 1460  →  一箱装得下,一次发完  ✓
现场:  1392 > 1320  →  一箱装不下,必须拆两箱 ✗

发送方确实在按 MSS 填满分段 —— 抓包里看到服务端发出的 IP 包总长正好 1360 = MTU。

3.2 关键:ESP8266 会给每个分段贴标签

这是问题的核心。ESP8266 在普通模式(AT+CIPMODE=0)下,
每收到一个 TCP 分段,就在串口输出一段,并在前面贴一个长度标签:

+IPD,1320:  <第一段:1320 字节>
+IPD,72:    <第二段:72 字节>

(+IPD,<len>: 读作"接下来 <len> 字节是数据")

整个串口流长这样:

[AT 回显]  \r\nRecv 178 bytes\r\n\r\nSEND OK\r\n\r\n
[帧头]     +IPD,1320:
[数据]     <880 字节 HTTP 头><正文前 436 字节>
[帧头]     +IPD,76:              ← 这个 8 字节前缀插在了正文中间!
[数据]     <正文后 76 字节>
[收尾]     \r\nCLOSED\r\n

3.3 代码为什么解析失败

解析代码原本假设:「串口缓冲里就是一整段连续的 HTTP 响应」——
这在单段情况下成立,在多段情况下就崩了:

body_start = 找到 "\r\n\r\n" 后 +4;              // 指向正文首字节 ✓
body_end   = body_start + content_length;        // +512
closed_pos = bufstr(body_end, ..., "CLOSED");    // 从 body_end 起找收尾标记
body_len   = closed_pos - body_start;

因为 +IPD,76: 这 8 字节被当成了正文内容,CLOSED 的实际位置被推后了约 10 字节:

数出 body_len = 524(512 真实正文 + 8 字节帧头 + 2 字节分隔)
期望 content_length = 512
→ 不相等 → 判失败

5 次重试结果完全一样,因为分段点是固定的,每次必然重现。

3.4 为什么只有固件包中招

请求响应大小会不会被拆段
心跳~150 B一箱 ✓
拉配置~300 B一箱 ✓
查询版本~194 B一箱 ✓
固件包1392 B超了 1320,必拆两箱 ✗

1392 恰好落在 1320~1460 这个区间 —— 这是为什么只有固件包出问题、
而且只在路径 MTU 较小的那个环境出问题。


四、修复

4.1 正确做法:解析前先做 +IPD 分帧剥离

在 HTTP 解析之前,把各分片的 payload 原位收拢成连续字节流,
后续解析逻辑一行不用改:

static bool isIpMarker(const char *p, const char *end)
{
    return ((end - p) >= 5) &&
           (p[0] == '+') && (p[1] == 'I') && (p[2] == 'P') && (p[3] == 'D') && (p[4] == ',');
}

static u16 deframe(void)
{
    char *buf = rx_buf;
    char *end = buf + rx_len;
    char *src = buf + s_src;      // 增量进度:读到哪
    char *dst = buf + s_dst;      // 增量进度:结果写到哪

    while (src < end)
    {
        char *marker = src;

        if (!isIpMarker(src, end))
        { src++; continue; }      // 非标记字节(分隔符 / AT 回显)丢弃

        /* 解析 <len> */
        p = src + 5;
        while (p < end && *p >= '0' && *p <= '9') { need = need*10 + (*p-'0'); p++; }
        if (p >= end || *p != ':') { src = marker; break; }   // 帧头不全 → 回退等下一轮
        p++;

        if ((end - p) < need) { src = marker; break; }        // 数据不全 → 回退等下一轮

        memmove(dst, p, need);    // 原位收拢
        dst += need;
        src = p + need;           // 直接跳到本片末尾
    }
    s_src = src - buf; s_dst = dst - buf;
    return s_dst;
}

几个设计要点:

点说明
原位收拢dst <= src 恒成立(每消费一个标记至少跳过 6 字节),memmove 安全,不需要额外缓冲
增量处理记录进度,只消费"整块到齐"的分片;配合"解析→等数据→再解析"的循环
不完整帧帧头或数据未到齐时回退到标记起点,等下一轮再拼,不吞半截数据
兼容单段没有帧标记时原样返回,老行为不变

4.2 ★ 一个容易忽略的陷阱:帧标记的自指问题

这是整个修复里最容易踩、也最值得记住的一点。

一旦代码里写了 memcmp(p, "+IPD,", 5) 或 bufstr(..., "+IPD,"),
编译器就会在固件里生成 "+IPD," 字符串常量。
而这个固件本身会被 OTA 下载 —— 于是"解析用的标记"就出现在了"被解析的数据"里。

实测确认(用工具在编译产物里搜):

固件二进制里 '+IPD,' 出现 1 次 @ 0x4b54   ← 就是代码里的字符串常量

这正是同一套代码里已经踩过的另一个坑:收尾标记 CLOSED 也是代码自己的字符串常量,
它会在下载中的固件流里提前命中,导致响应没收完就返回。

标记来源后果
CLOSED标记在自家固件里(自指)在下载的固件数据中误命中
+IPD,(用字符串常量时)同上同上

同源于一个错误假设:「串口缓冲里的字节流 == 协议数据本身」。
在 AT 模式下这个假设不成立 —— 缓冲里还混着模组自己的帧和回显。

解法:改用逐字节字符比较

if (p[0] == '+' && p[1] == 'I' && p[2] == 'P' && p[3] == 'D' && p[4] == ',')

字符字面量进的是指令立即数,不产生 RO 字符串 —— 固件里不再有 +IPD,。

顺带说明:即使一时忘了这点,只要解析逻辑从不扫描 payload 内部,
也不会误解析(处理后 src 直接跳到本片末尾)。
但"payload 不被扫描"是个隐含不变量,一旦以后改了循环边界就可能被破坏 ——
从根上消除字符串常量更稳妥。


五、如何验证

5.1 用两条 ping 测路径 MTU

不用抓包也能测:对目标地址发带 DF 标志的包,二分找最大可通过尺寸
(ICMP 载荷 + 28 = 路径 MTU):

# Windows
ping -n 1 -f -l 1332 <目标IP>     # 载荷 1332 → MTU 1360
ping -n 1 -f -l 1372 <目标IP>     # 载荷 1372 → MTU 1400
  • 返回「需要拆分数据包」→ 路径 MTU 小于该值
  • 实验室基线:-l 1472 通过(MTU 1500)

5.2 本地复现:手工制造 TCP 分段

分段是"发方"的行为,不需要真实广域网就能复现 ——
在本地起一个 TCP 代理,把响应手工切开:

sendall(resp[:1320])     # 先发前 1320 字节
sleep(0.08)              # ← 关键:超过 TCP 合并窗口
sendall(resp[1320:])     # 再发剩下的

为什么必须 sleep:即使分两次 write(),只要间隔很短,
TCP 会自动合并成一个段发出(Nagle / 发送缓冲)。
要逼出两个真实分段,间隔必须超过合并窗口。

我们把代理的 SPLIT_AT 参数设为 0 做对照组,同一台设备、同一份固件:

配置结果
不分段55/55 全部成功
切成 [1320, 72]必然失败,5 次重试全败

唯一变量是"是否分段" —— 这排除了长链路、高时延、DNS 等所有其他解释。

5.3 如果帧标记真的出现在数据里,怎么确认安全

用真实固件字节构造测试输入,把含有该字符串的那一段当作 payload,
验证去帧后数据逐字节完整。同时构造对抗性用例(伪造一个看起来合法的帧头放进 payload)。


六、经验清单

排查类

  1. 异地问题优先抓包。只有后台状态码时排查效率极低;一次抓包能省几天
  2. 对比两个环境的差异,而不是猜。把两个环境的数据摆在一起,差异项往往只有一个
  3. 注意方向。本例只有「服务器 → 设备」一个方向的 MTU 变小;
    反方向完全正常,只看单向会得出错误结论
  4. 代理转发有复现盲区 —— 它会改写连接拓扑,屏蔽路径特性
  5. PC 测速正常 ≠ 设备正常 —— 路径和端点都不是同一个

代码类

  1. 不要假设「一段缓冲 == 一条完整消息」。AT 模式下缓冲里混着模组自己的帧和回显
  2. 凡是"等某个标记出现"的写法,先问:这个标记会不会出现在数据里?
    —— 自指(自家固件里的字符串)和外插(模组插进数据的前缀)是同一类错误的两个面
  3. 用字符比较代替标记字符串,避免把自己的标记编进固件
  4. 协议层能自己定长度就用长度(如 HTTP 的 Content-Length),
    比靠标记字符串定位稳健得多

协议类

  1. TCP 是流,分段由发送方按路径 MTU 决定,应用层无法阻止
  2. MSS 是每条连接单独协商的,与后面的链路无关 —— 中间有代理时,
    窄口会被代理挡住
  3. ESP8266 的 +IPD 是"每段一个",不是"每响应一个"。
    这是 AT 模式下最容易踩的坑之一

附:相关 AT 指令背景

指令作用
AT+CIPMODE=0普通模式,收到数据以 +IPD,<len>:<data> 输出
AT+CIPMODE=1透传模式,数据原样吐出(无 +IPD),但 AT 指令失效、需 +++ 退出
AT+CIPMUX=0/1单连接 / 多连接(多连接时 +IPD 会带 <link_id>)
AT+CIPRECVMODE=1被动接收(需 AT 固件 ≥ 1.7.0):只上报 +IPD,<len> 通知,用 AT+CIPRECVDATA 主动取数据 —— 取出的是模组内部重组后的连续数据,可从根上规避本问题

关于被动模式:它看起来是更优雅的解法,但依赖 AT 固件版本。
模组采购批次不同、固件版本可能不一致时,
在 MCU 侧做分帧解析是兼容性最好的方案。

网络基础(二):数制转换与分类编址的IPv4地址 本文介绍数制转换、IP地址、分类编址的IPv4地址,希望对你有帮助! 阅读详情

相关推荐

从零到一:Bioconductor新手入门与R包安装实战

本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。

weixin_29061041的博客 418

(done) 嵌入式硬件电路图 (5) 重要的元器件特性之二极管三极管

TODO: here。

shimly123456的博客 176

Cadence IC618与Spectre231安装:环境变量与License配置详解

在Linux系统中部署Virtuoso等EDA工具时,环境变量与License管理是决定工具能否顺利启动的核心环节。环境变量决定了系统如何找到工具二进制文件以及工具如何定位自身资源,而License则通过FlexLM授权机制控制工具的使用权限。理解PATH、CDS_ROOT、CDS_LIC_FILE等关键变量的作用,掌握lmgrd服务与lmstat验证方法,能显著减少安装后启动失败的概率。无论是学生初装Cadence IC618与Spectre231,还是实验室工作站需要搭建可用的模拟设计环境,理顺环境变量

weixin_29192365的博客 372

(done) 嵌入式硬件电路图 (3) 重要的元器件特性之电阻

TODO: here。

shimly123456的博客 23

基于GEC6818开发板的C/C++贪吃蛇小游戏

f.开始游戏(进入游戏,并没有马上开游戏,需要点击播放才能开始)2.相关宏,全局变量(可以根据自己需要进行修改)k.显示文字前的相关初始化。k.自定义font.h文件。1.需要的主要头文件。l.在开发板上显示字1。m.在开发板上显示字2。a.显示固定大小图片。h.线程1:获得坐标。

2301_77273301的博客 2133

Protobuf NDK以及QNX交叉编译

Protobuf 用处很广,尤其是通讯数据序列化,反序列化。TODO。

静虚待令,有物混成 1560

(done) 嵌入式硬件电路图 (1) 看图的脉络依据

TODO: here。

shimly123456的博客 44

在ubuntu上安装FastSufer【本机安装】

其实说是安装,只需要将文件下载并解压即可。推荐教程注意版本:在下面这个网址根据你的操作系统找到最新的版本安装。比如我的操作系统为Ubuntu 20.04.5,因此我安装ubuntu20-7.4.1的freesurfer打开~/.bashrc在~/.bashrc文件中添加以下三行关闭~/.bashrc更新~/.bashrc安装tcsh注意每次进入终端使用freesurfer时需要输入FREESURFER_HOME路径根据freesurfer的文件夹所在位置自己修改。

Xingwen_future的博客 2009

(done) 嵌入式硬件电路图 (4) 重要的元器件特性之电容

TODO: here。

shimly123456的博客 175

Jetson 平台编译安装 FFmpeg 7.1(支持 Nvmpi + SRT + x265)

摘要: 本文详细介绍了在NVIDIA Jetson平台上编译FFmpeg 7.1并集成关键功能的全过程。通过补丁方式加入Nvmpi实现硬件加速支持,同时编译集成x265编码器和SRT低延迟传输协议。步骤涵盖:1)安装x265编码器;2)配置SRT协议支持;3)编译jetson-ffmpeg的Nvmpi接口;4)定制化编译FFmpeg 7.1;5)验证模块集成情况。最终实现支持硬件编解码、高效HEVC压缩和可靠推流的增强版FFmpeg,为Jetson平台的音视频处理提供完整解决方案。

J。 345

手把手教您windows如何正确的开启局域网共享,如何解决“没权限、空密码访问等诸多问题”,含手动操作教程 + 傻瓜式一键设置工具(局域网共享+打印机管理),二选一总有一款能满足您!

😫 Windows共享总失败?别抓狂!这篇教程带你破解“空密码”访问的核心难题 🔑,四步搞定所有设置。文末还附赠“一键修复”神器 🚀,让文件共享丝滑如德芙!

XiaoqiangClub的博客 1453

(done) 嵌入式硬件电路图 (2) 熟悉常用元器件

常见电阻分为 贴片电阻 和 色环电阻。

shimly123456的博客 44

智能硬件产品 App 全球发布 第 1 章:全球 App 发布战略设计

本章阐述智能硬件 App 全球发布战略,涵盖市场分析、竞争格局、用户画像及资源配置。通过制定可执行的全球化推广路径,整合地区法规合规、渠道分发策略与营销活动设计,助力团队快速进入主流商店并确立品牌影响力。同时构建可量化的 KPI 监控体系,指导项目进度追踪与效果复盘,确保产品迭代持续优化,降低运营总成本。

moton2017的博客 156

嵌入式硬件选型|EY406-2131D1 双路互补脉冲长按复位 IC 方案解析

在锂电供电的嵌入式项目开发中,带无线模组的复合系统经常遇到复位不同步问题。主控完成复位,蓝牙、WiFi 射频模块未同步复位,模块状态不一致,出现配网失败、链路锁死等现象。软件长按复位方案在主控跑飞后直接失效,RC 延时电路受温漂、器件离散性影响,量产时序一致性较差。EY406-2131D1 是 SOT23-6 封装纯硬件逻辑复位芯片,依靠硬件计时实现长按识别与双路脉冲输出,可以作为这类场景的备选方案。

ELITECHIPLJW的博客 156

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 511

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 352

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

嵌入式:2.STM32底层基础(存储、寄存器、时钟、总线、GPIO、寄存器点灯)

存储系统用来存放程序、数据、设备状态,核心三大作用:存放程序代码、保存运行时数据(全局、局部、栈、堆)、数据持久化(比如W25Q64 Flash,可以搭配文件系统)。

2401_86731574的博客 371

从寄存器层面重学STM32(7)——定时器理论

本文系统梳理了STM32定时器的架构与工作原理,以时基单元为核心,涵盖计数模式、预分频、影子寄存器及定时周期计算。重点解析输出比较(PWM生成)与输入捕获(脉冲测量)机制,阐明CCR与CNT比较逻辑及波形生成流程。深入探讨通用定时器的从模式(如编码器、触发、门控等)与主模式(TRGO同步),明确主从定时器间信号传递关系。结合寄存器配置(CR1、SMCR、CCMR、CCER等),总结定时器在中断、DMA、PWM输出、信号捕获中的应用,实现精准定时与事件控制。

2403_88517351的博客 319

K210+STM32+LVGL:手搓边缘AI智能安防监控网关

在传统的物联网或嵌入式毕设中,“智能安防”往往沦为“温湿度+蜂鸣器”的简单堆砌。由于单片机(如STM32)算力有限,无法在本地运行复杂的视觉AI模型,导致很多项目只能在云端处理图像,带来高延迟和隐私风险。本文将分享一个真正的边缘计算安防网关项目。我们采用“K210视觉协处理 + STM32F407主控 + LVGL高颜值UI”的分布式架构,完美解决了单芯片算力不足的痛点。项目不仅实现了明火与陌生人脸识别,还加入了多源传感器融合、5秒智能防抖、以及硬件与UI的双向闭环控制,是一套工业级标准的开源方案。

202

【官方原创】LAT1721 使用STM32CubeIDE 调试STM32N6 XIP应用的一种方法

本文我们以STM32Cube_FW_N6_V1.3.0包中Template_FSBL_XIP为例,介绍一种使用STM32CubeIDE在DEV模式下直接调试应用的方法,不需要切换Boot模式。

2501_92678806的博客 564

水深水位传感器(STM32)

本文介绍基于STM32F103C8T6的水深水位传感器实验,采用HS-S37A模块通过导电原理实现水位检测。传感器输出模拟电压,经ADC采集后在OLED显示实时数据。程序通过多次采样求平均值,提升测量稳定性。适用于花盆积水、漏水报警等场景,适合教学与物联网开发。项目代码完整,含初始化、读取与显示功能,资料可于文末获取。

qq_44016222的博客 140

STM32——GPIO篇

本文系统讲解STM32F103 GPIO的原理与应用,涵盖概念、电气特性、推挽/开漏输出、寄存器控制及输入模式。重点解析了GPIO与引脚的关系、钳位保护、MOS管工作原理、寄存器配置(CRL/CRH、ODR、BSRR等)、上下拉输入及施密特触发器的作用,构建从硬件到软件的完整知识体系,助力深入理解嵌入式开发中的核心外设机制。

wiketsy的博客 239

STM32移植FreeRTOS(Cmake+CubeMX)

说明:基于STM32F103C8T6最小系统开发板。

2402_84642203的博客 174

STM32智能窗户防控系统 云平台

本系统基于STM32F103C8T6,集成温湿度、光照、烟雾、雨滴、人体红外传感器,通过OLED显示数据,支持手动与自动模式。自动模式下依优先级控制步进电机开窗(三档)、风扇通风及蜂鸣器报警;支持阈值调节、ESP8266接入机智云平台,实现远程监控与控制。配备按键与APP双端操作,具备云端数据同步与高清演示视频,功能完整,适用于智能安防场景。

送外卖的工程师 353

STM32 电流采样为什么在开关沿抖:低边电阻、PWM 触发与 ADC 窗口

给 F103 驱动板加电流环时,采样值总在开关沿乱跳,改 PID 和加滤波都没用。这篇从示波器波形讲起,说明低边采样电阻、运放、PWM 触发与 ADC 注入组怎样对齐,以及采样窗口和 RC 滤波为什么不能互相替代。

Sakura_j_h_的博客 178

【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置

【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置

ResumeProject的博客 414
上一篇: rockpis固件编译记录
JCYAO_
博客等级 码龄7年 90粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值