安全边界:默认只使用官方开发板、说明书指定 USB/低压供电和板载 LED/按钮。未知电压、裸露电源、市电、大电流负载、不明模块或接线不确定时,立即断电并停止。
证据边界:本章主机实验验证模型与记录逻辑;真实电平、极性、波形和仪器接地必须回到当前板卡、芯片和仪器的官方文档。
01 · SAFETY AND BOUNDARIES
安全边界:先知道什么不能做
测量的第一步不是把表笔接上去,而是确认对象、能量来源、参考点、仪器额定范围和停止条件。本单元把安全从一句免责声明改成一张能被另一位读者复核的检查卡。
1.1.1 确认对象:板卡身份不是一句 STM32
概念拆解:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,面对一块只标着系列名的开发板,先列出能查到和查不到的字段可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
第二张清单是对象身份。记录板卡的完整型号,而不是只写“STM32”;记录文档标题和版本,而不是只写“看过网页”;记录正在使用的连接器和丝印,而不是只写“USB 口”。同一芯片可能出现在不同的开发板上,板载调试器、稳压器、LED、按钮和排针连接方式都可能改变。遇到教程中的引脚编号时,也不要默认它能迁移到自己的板子:先问教程使用的是什么板,自己手上又是什么板。这个步骤看起来很慢,实际会省掉大量由错误映射造成的排查时间。
1.1.2 供电路径:USB 不是所有引脚的许可
机制拆解:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,用手册上的供电图解释为什么同一块板不能任意选择电源脚可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
实际操作中,“先断电”也需要说明对象。若只从电脑拔掉一根 USB 线,但外部模块仍经另一根线、调试器或电池供电,目标节点可能没有真正掉电。相反,若一个系统经过明确设计的 USB 单供电路径,拔掉该线并等待板上指示熄灭,才可以把它作为本章的断电动作。这里不需要读者凭经验判断,而应让其从自己板卡的用户手册中找到供电示意、跳帽说明和连接器定义。找不到时,将“供电路径未确认”写进记录本身就是合格结果。
PYTHON · HOST MODELplan = {"board": "confirmed", "supply": "single-usb", "reference": "documented-gnd", "instrument": "within-rating"} required = ("board", "supply", "reference", "instrument") assert all(plan[key] for key in required) print("safe-to-observe", plan)
这段主机记录只检查观察前的字段是否已填写,不会验证真实电压、探头接地或板卡保护。请把一个字段改成空值,观察为什么应该停止。
PYTHON · EVIDENCE GATEobject_confirmed = True reference_confirmed = True host_model_passed = True def stop(reason): raise RuntimeError(reason) def report(message): print("REPORT:", message) def preserve_failure(): print("STOP AND RECORD: target evidence is incomplete") if not object_confirmed: stop("read the board manual") elif not reference_confirmed: stop("do not connect the probe") elif host_model_passed: report("host evidence only") else: preserve_failure()
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.1.3 参考点:电压永远是两点之间
量与单位:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
仪器条件:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,比较同一测试点相对板载 GND 与相对错误节点时读数为何不同可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常排查:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
记录迁移:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
电阻档是一个容易说明仪器边界的例子。电阻测量通常要求被测对象处于合适的断电和隔离条件,因为仪表会主动施加自己的测试信号。把电阻档接到仍在供电的电路上,不是“多得到一个读数”,而是改变了原本要观察的系统条件。此处本章不给出任何面向市电或复杂电源的操作步骤;读者只需要记住:先查仪表手册与被测板卡文档,满足不了条件就不测,并选择阅读原理图或运行主机模型作为替代学习路径。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 对象与供电 | 板卡型号、唯一供电入口 | 可以随意接任意电源脚 |
| 参考与工具 | 节点、GND、量程/倍率 | 读数天然安全 |
| 异常动作 | 断电、记录、查手册 | 反复插拔试错 |
1.1.4 仪器额定值:工具也有边界
量与单位:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
仪器条件:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,为一次低压直流观察记录插孔、量程、探头倍率和测量目标可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常排查:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
记录迁移:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
真正的安全文化还包含对失败的尊重。异常并不等于需要立刻修复,也不是证明自己操作能力差。发热、异味、异常声响、保护提示、USB 反复枚举或不确定的电压,都是系统在告诉你当前条件没有被理解。立即停止、断开电源、拍照或记录连接状态、回到最后一次确认安全的配置,再查手册和原理图,这一流程比继续试十次更专业。尤其不要把“程序刚刚改过”当成所有现象的唯一原因;硬件连接、仪表设置和供电路径同样是变量。
1.1.5 断电与接线:把动作顺序写清楚
机制拆解:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,设计一个只使用板载器件的上电前后检查流程可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
为了检验自己是否理解,请把下面三句话分别改写成可验证描述:“板子正常供电”“这个脚是高电平”“示波器看起来没问题”。改写后应包含对象、条件、工具和判据。例如,第一句可以写成“在板卡型号与跳帽状态已记录、仅由指定 USB 口供电、无外部模块连接的条件下,板载电源指示按用户手册所述出现,且调试器枚举状态与预期一致”。这仍然不是电气规格的证明,却是一条边界清晰的观察结论。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.1.6 探头地夹:测量系统会改变被测系统
量与单位:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
仪器条件:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,阅读 Tektronix 探头资料,标出不能用‘浮地’解决的风险可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常排查:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
记录迁移:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
安全边界不应该只在章节开头出现一次。每当学习对象变化,边界都要重新计算。把板载 LED 换成外部 LED,新增了极性、串联电阻、外部供电和共地问题;把板载按钮换成传感器模块,新增了模块供电、输出类型、逻辑兼容性和线缆连接问题;把 USB 供电换成外部电源,新增了输入范围、极性、保护和电流能力问题。也就是说,学习路线的每一步都应先问“我现在新增了哪些能量和连接关系”,而不是沿用上一实验的安全假设。
1.1.7 未知与停止:拒绝猜测也是工程动作
证据分层:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,写一份发现异常发热或 USB 掉线后的停止记录可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
对于团队协作,检查卡也能减少沟通歧义。不要说“我已经把地接好了”,而应说“探头参考线接到原理图标注的 GND 测试点 TPx;板卡仅由 CNx 的 USB 供电;外部模块未连接;仪表处于直流电压模式”。这种表达让其他人可以复查并指出风险,而不是只能相信操作者的经验。一个人独自学习时同样适用:几天后回到桌面,记录会替你恢复当时的条件。
1.1.8 本节交付:一张安全观察卡
运行步骤:对本章的安全边界:先知道什么不能做来说,对象身份、唯一供电入口、参考点、断电、仪表额定范围和停止条件组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在官方开发板、USB 供电、板载 LED/按钮与低压观察中,让没有现场上下文的读者判断你是否具备低风险观察条件可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把‘这是一块 STM32 板’当作完整身份,或把保护器件、GND 丝印和一次正常上电当成无限授权。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:在任何新板卡上先填对象—能量—参考—工具—停止五列,再决定是否允许下一步。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
当你需要查资料时,优先级也很重要。具体开发板的用户手册和原理图回答“这块板怎么供电、这个连接器是什么、跳帽默认状态如何”;具体 MCU 的数据手册回答“这个器件在这些条件下的额定值和电气特性是什么”;仪器手册回答“这个仪表的输入、类别、接地和模式有什么限制”;应用笔记可以帮助理解常见机制,但不能取代前面三类文档。论坛截图、短视频和他人接线照片最多只能作为线索,不能作为安全结论的最终依据。
请围绕“安全边界:先知道什么不能做”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
02 · QUANTITIES AND UNITS
电压、电流、电阻与功率
公式提供模型,规格提供制造商边界,测量提供某次现实条件下的观察。只有把这三者分开,读者才不会把一个漂亮的计算值误写成整块板卡的保证。
1.2.1 电压是差:先写参考点
概念拆解:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,比较标称 3V3 网络与相对板载 GND 的一次实际读数可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
电流的记录同样需要路径。电流表通常要串入被测支路,因而它的接入方式本身可能改变电路;在没有明确电路图、量程和测试目的时,不能把“测电流”当成随手接两支表笔的动作。本章的主机模型通过 I=V/R 说明理想电阻关系,只用于让读者检查单位与趋势:给定电压增大、固定电阻下模型电流随之增大;电阻增大、模型电流减小。它不描述所有真实元件,更不授予对具体供电或 GPIO 的接线许可。
1.2.2 电流是路径:不能只看一个数
机制拆解:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,分析为什么电流表接法错误会改变电路甚至造成短路可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
电阻的单位欧姆提醒我们,模型必须带量纲。把 330 当作“一个数”与把 330 Ω 当作电阻是不同的;把 0.005 当作“一个小数”与把它解释为 5 mA 也是不同的。计算前可以做一个快速量纲检查:V/R 是否得到 A,V×A 是否得到 W。量纲检查不能保证模型适用,却能发现一类很常见的错误,例如把毫安当安、把千欧当欧,或在代码中丢失单位。实验包故意使用以基本单位表示的浮点输入,以便读者在调用函数前明确写出转换。
PYTHON · HOST MODELdef current_a(voltage_v, resistance_ohm): if resistance_ohm <= 0: raise ValueError("resistance must be positive") return voltage_v / resistance_ohm print(f"{current_a(3.3, 330):.6f} A")
函数输出是理想模型中的安培数。它没有读取电源、负载、LED 温度或 GPIO 驱动能力;变量名把单位写出来,便于读者复算。
PYTHON · EVIDENCE GATEdef power_w(voltage_v, current_a): if voltage_v < 0 or current_a < 0: raise ValueError("this simple model expects non-negative inputs") return voltage_v * current_a assert round(power_w(3.3, 0.01), 4) == 0.033
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.2.3 电阻模型:公式先检查量纲
机制拆解:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,把 330Ω、3.3V 和约 10mA 写成可复核的计算记录可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
负载是所有这些量的共同条件。一个网络在空载时的电压,与接入 LED、传感器、调试器或仪表后的电压可能不同。读者不必在本章学习复杂的电源完整性理论,但应知道“测量本身也是连接”。当读数与预期不同,除了怀疑程序和元件,还应问:我是否改变了负载?表笔插在哪个插孔?仪表模式是否正确?板卡是否处于与手册相同的供电路径?这种排查顺序比直接替换硬件更节省时间,也更符合证据驱动的工作方式。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 电压 | 两节点、参考点、时间 | 一个节点有绝对电压 |
| 电流 | 支路、方向、串接方式 | 表笔并到电源两端 |
| 功率 | 同一条件下的 V 与 I | 单次读数代表整板功耗 |
1.2.4 功率与能量:组件不等于整板
概念拆解:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,解释 MCU、稳压器、调试器和 LED 为什么不能只靠一个乘法合并可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
这一单元的无硬件练习是运行实验包,先用纸笔或代码预测四个函数的结果,再运行测试。把供电电压从 3.3 改成 5.0、把电阻从 330 改成 660、把目标电流从 0.005 改成 0.010,每次只改变一个变量,并解释结果变化是否符合模型。验收不看你是否算出一个漂亮数字,而看你是否写清单位、输入条件和模型不覆盖什么。若你的预测与测试不一致,先检查单位和函数约束,而不是用“现实很复杂”跳过错误。
1.2.5 负载与容差:理想值如何被现实改变
量与单位:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
仪器条件:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,为一次读数写出最可能影响结果的三个变量可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常排查:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
记录迁移:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
电阻也不是永远固定不变的理想常数。真实元件有标称值、容差、温度特性、额定功率与频率相关行为;导线、接触点、面包板和仪表本身也可能给电路加入额外电阻。第 1 章不要求读者建立这些全部模型,但要求在使用理想公式时写明“这是理想化估算”。这样,当真实读数与计算不一致时,读者不会把差异简单归咎于“公式失效”,而会把元件容差、负载、供电和测量条件列为待检查变量。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.2.6 规格、估算、测量、限值四分法
证据分层:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,把数据手册的绝对最大额定值与正常工作目标分开可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
在软件中表示电量时,建议把单位写进变量名、注释或数据结构。比如 `supply_v`、`resistance_ohm`、`target_current_a`,比 `a`、`b`、`c` 更能防止误用。若某个接口必须接受毫伏或毫安,也应该在名字和文档中说明,并在边界处做一次明确转换。单位不是文档末尾的装饰;它是接口合同的一部分。后续阅读 ADC、PWM 或传感器数据时,这种习惯会让原始码值、物理量和显示单位不再混为一谈。
1.2.7 只改变一个变量:让趋势可以解释
运行步骤:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,先预测电流趋势,再运行主机测试并记录偏差原因可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
测量电流的风险尤其值得作为思维练习。电压测量常被理解为把仪表跨接在两个参考节点之间;电流测量却通常涉及让仪表成为支路的一部分。若不了解表笔插孔、模式、量程、支路位置和仪表额定值,就不应在真实电路上尝试。无硬件读者可以画出电源、负载、串联电阻与电流表的概念图,说明为什么“把电流表并到电源两端”不回答目标问题;这比未经准备的动手更符合本章安全边界。
1.2.8 本节交付:一份带单位的测量记录
运行步骤:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,提交一个计算值和一个不能由它推出的真实硬件结论可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
主机实验包的错误用例承担了一个重要角色:它让公式的适用条件可执行。除以零电阻、给出非正的目标电流、或让供电低于 LED 压降时,函数会拒绝计算,而不是静默返回一个看似合理的值。现实电路中的边界远比这些多,但软件模型用这种方式提醒读者:输入合同必须在计算前检查。以后设计传感器范围、通信长度和缓冲区时,都是同样的原则。
1.2.9 迁移预告:从电量到 GPIO 规格
迁移缺口:对本章的电压、电流、电阻与功率来说,电压差、电流路径、电阻关系、功率、量纲、容差、负载与时间窗口组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
目标机条件:在低压开发板上的供电轨、负载、LED 模型和可重复的主机计算中,标出下一章构建制品中仍然需要哪些硬件条件可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败记录:常见错误是把 3.3V、10mA 或 33mW 脱离参考点、路径和时间窗口,或把电流表当作并联电压表使用。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
下一步:在代码变量、表格列名和实验记录中显式写出单位与方向,再讨论数值是否满足合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
本单元完成后,读者应能读懂如下差别:规格表中的“最大值”是边界;原理图中的“标称值”是设计选择;代码中的“常量”是模型输入;万用表显示的是一个条件下的测量;计算结果是模型输出。这五类对象可以都写成数字,但不能相互替换。把它们分开,是避免错误接线和错误结论的基础。
请围绕“电压、电流、电阻与功率”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
03 · LOGIC LEVELS
逻辑电平:高和低为何需要阈值
数字接口把连续电压解释成离散状态,但‘高’与‘低’不是两个脱离器件的抽象标签。本单元从保证区间、未定义区、上拉下拉和未上电输入出发,建立不越界的逻辑判断。
1.3.1 连续电压如何变成离散状态
概念拆解:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,用一条从 0V 到供电电压的轴标出低区、中间区和高区可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
输出规格也不同于输入阈值。VOH 和 VOL 说明在给定条件下输出端保证能提供的高、低电平范围;它们会受到负载电流、供电电压和具体器件特性的影响。把一个输出连到另一个输入之前,需要同时检查输出在相应负载下能保证什么,以及输入需要什么阈值。不能只比较两个标称供电电压,也不能只看“都是 3.3V 设备”就认为所有路径必然兼容。
1.3.2 VIL 与 VIH:两个保证区间
机制拆解:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,把数据手册表格里的条件、温度和电源一起记录可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
内部上拉、内部下拉与外部电阻也不是可互换的万能选项。它们的阻值范围、上电时机、功耗、噪声耐受和板上连接关系均可能不同。第 1 章不要求读者为某一芯片选择具体阻值,但要求其知道必须从具体数据手册、原理图和应用条件出发。一个教程中能工作的配置,可能依赖那块板已有的外部电阻;搬到另一块板后,若忽略这个隐含条件,就会得到“偶尔按一次就触发”的故障。
PYTHON · HOST MODELdef classify_level(voltage_v, vil_max, vih_min): if voltage_v is None: return "floating" if voltage_v <= vil_max: return "low" if voltage_v >= vih_min: return "high" return "undefined" for value in (0.0, 1.0, 2.0, 3.3, None): print(value, classify_level(value, 0.8, 2.0))
阈值是实验模型的输入,不是任意 STM32 的规格。真实芯片必须替换为具体数据手册在指定电源、温度和封装条件下的保证值。
PYTHON · EVIDENCE GATEsamples = [0, 1, None, 1] PRESSED_LEVEL = 1 RELEASED_LEVEL = 0 state = "released" for sample in samples: if sample == PRESSED_LEVEL: state = "pressed-candidate" elif sample == RELEASED_LEVEL: state = "released-candidate" else: state = "unknown" assert state in {"pressed-candidate", "released-candidate", "unknown"}
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.3.3 未定义区:不知道比猜一个 0 更诚实
证据分层:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,设计一个测试让边界输入明确落在‘不应依赖’的分支可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
未上电时的 I/O 是一个必须保留的边界。某些器件在正常供电条件下可能具有特定输入容限,但当 VDD 缺失时,外部电压可能通过内部保护或其他路径产生非预期电流。ST 的 GPIO 硬件指南明确提示这类风险,并要求以具体芯片的限制为准。对本章读者而言,结论不是要记住一个通用上限,而是不要在板卡未供电、供电路径不明或外部模块仍带电时,假定 GPIO 仍可安全地接受任何电平。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 低保证区 | VIL(max) 与工作条件 | 所有低于供电一半都可靠 |
| 未定义区 | 输入落在两个保证区间之间 | 代码可以随意选 0/1 |
| 浮空 | 没有有效驱动与默认状态 | 保持上次逻辑值 |
1.3.4 上拉、下拉与浮空
机制拆解:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,比较按钮松开时上拉和下拉电路的默认逻辑可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
可以用三组样例检查理解。第一组:电压远低于低阈值,模型应分类为 low;第二组:电压远高于高阈值,应分类为 high;第三组:电压落在两个阈值之间,结果应为 undefined,而不是“取整后随便选一个”。第四组:传感器或读取层没有给出可信样本,结果应为 floating。这些样例让读者看到,可靠软件并不总是立即给业务逻辑一个二元答案;它也可以拒绝行动、保持安全状态或记录诊断信息。
1.3.5 极性:亮灯不等于高电平
概念拆解:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,从原理图或板卡手册找出 LED 阳极/阴极和 GPIO 关系可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
输入与输出的区别还体现在责任上。输入端的程序责任是解释采样值,并在不可信时采取设计过的策略;输出端的程序责任是请求一种状态,而硬件边界还要负责把请求转换为具体引脚配置和电平。若业务代码直接散布寄存器位、反相常量和板型编号,任何一次迁移都会迫使所有逻辑重新检查。若将这些细节限制在一个清楚命名的边界层,状态机就能保持“门是否打开”“按钮是否按下”“指示是否开启”这类稳定语义。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.3.6 未上电输入与容限
允许范围:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
停止条件:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,说明为什么不能用通用 5V 经验替代具体器件限制可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常处理:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
知识边界:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
逻辑兼容不是只看电压名义值。一个模块可能使用 5V 供电却有 3.3V 兼容的输出,也可能在某些方向上不兼容;一个 MCU 的某些引脚可能具有特殊功能、不同容限或模拟限制。对初学者最安全的规则是:没有目标 MCU 数据手册、模块文档和板卡原理图的共同支持,就不要把它们连接起来。本章不提供“万能电平转换”或“5V 一定能接”一类结论,因为这类结论忽略了方向、供电状态和具体器件。
1.3.7 阈值模型的主机实验
运行步骤:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,每次只改一个电压或阈值,并写出预期状态变化可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
调试逻辑输入时,应该先从语义和层次入手。若程序报告按钮一直按下,先问原始引脚读到了什么、极性是否转换正确、默认电阻是否存在、板载按钮连接到哪个网络、测试代码是否把业务状态和电平混在一起。不要一开始就反复改延时或添加随机的取反。分层记录可以让每一步都可观察:原始采样值、分类结果、去抖后的稳定状态、业务事件、输出请求和最终可见现象。
1.3.8 本节交付:一张逻辑输入判读表
运行步骤:对本章的逻辑电平:高和低为何需要阈值来说,VIL、VIH、输入容限、上拉、下拉、浮空、极性和未上电状态组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在按钮、GPIO、LED、3.3V/5V 接口和经过阈值判定的输入样本中,提交一条模型结论和一条必须等目标机确认的结论可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把中间电压强行分类,把某一系列的阈值推广到所有 MCU,或把内部上拉当成无条件的外部保护。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:先查器件保证区间与未上电条件,再把逻辑判定写成带极性、默认值和错误状态的合同。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
输入采样还可能与异步事件相遇。一个外部信号相对于 CPU 采样时钟的变化时刻不受软件控制,硬件和软件需要按照具体平台的机制处理同步、滤波或中断。本章不要求读者设计同步器或理解亚稳态电路,但要认识到“在某行代码读取一次”并不使外部世界停止变化。这也是为什么可靠输入合同包含采样频率、稳定时间、超时与错误状态,而不只是一句 `if (pin)`。
请围绕“逻辑电平:高和低为何需要阈值”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
04 · SIGNALS AND MEASUREMENT
信号与测量:从读数到记录
信号是随时间变化的关系。测量工具、探头、采样率、带宽、参考地和负载共同决定你看到的结果。本单元把波形观察写成带条件的记录,帮助读者知道每种仪器能证明什么。
1.4.1 直流、瞬态与变化信号
概念拆解:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,为板载 LED 和 GPIO 翻转分别选择肉眼、万用表或示波器证据可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
时间是测量条件,不是图表旁边可省略的背景。一次读取发生在启动后多久?固件处于什么模式?输入刺激何时施加?观察窗口多长?如果没有这些字段,“偶尔看到 LED 闪烁”无法支持“周期稳定”或“响应及时”的结论。即使没有示波器,读者也可以通过程序日志、定时器计数、主机模型轨迹和重复观察记录时间条件;关键是把“发生过”改写成“在这些条件与窗口内观察到”。
1.4.2 时间轴:周期、频率与占空比
机制拆解:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,用一段样本序列说明平均值为何掩盖短暂异常可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
探头也会成为电路的一部分。它具有输入阻抗、寄生电容、地线和物理接触方式;在某些高频或高阻抗场景,这些特性会改变被测节点。第 1 章不要求读者进行高频探测优化,但应形成一个基本判断:若测量后现象发生变化,不能立刻把变化归因于程序或芯片,也要考虑探头、连接和参考地是否改变了系统条件。测量不是透明窗口,而是一次受控交互。
PYTHON · HOST MODELsamples_ms = [0.0, 0.5, 1.0, 1.5, 2.0] period_ms = samples_ms[-1] - samples_ms[0] frequency_hz = 1000 / period_ms print({"period_ms": period_ms, "frequency_hz": frequency_hz})
样本序列只演示从边沿时间计算周期和频率。没有真实采样率、触发设置、探头和节点信息时,不能把这个结果称为板卡波形测量。
PYTHON · EVIDENCE GATEdef duty_cycle(samples): high = sum(samples) return high / len(samples) trace = [0, 1, 1, 0, 0, 1] assert 0 <= duty_cycle(trace) <= 1 print("windowed-duty", duty_cycle(trace))
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.4.3 采样率与带宽:看见不等于捕获
量与单位:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
仪器条件:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,为一个 1kHz 信号写出至少需要记录的仪器设置可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常排查:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
记录迁移:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
测量记录可用一个固定模板:被测对象和版本;供电与接线前提;测量工具、模式和设置;参考点与测试点;输入刺激;预期行为;实际结果;时间戳;异常;限制。模板的目的不是增加文书工作,而是让“我看到一个现象”转化成别人可以复查的实验。若读者只完成了其中一半,也应明确写下缺失项,而不是用空白默认它们正确。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 想知道什么 | 幅值/时间/边沿/噪声 | 贵仪器一定更合适 |
| 选择工具 | 问题、带宽、采样、参考 | 万用表能回答波形 |
| 留下什么 | 设置、输入、原始数据、限制 | 成功截图足够复查 |
1.4.4 探头与负载:测量也是连接
允许范围:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
停止条件:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,比较短地弹簧与长地线对高频噪声观察的影响可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
异常处理:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
知识边界:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
对于没有示波器的读者,本章仍有完整路径。使用实验包中的模型可检查阈值与错误输入;阅读官方文档可了解工具与接地边界;以一个假想 PWM 为例写出“若要证明频率,我还需要什么工具和设置”;再以程序日志或计数器输出练习构造时间记录。不要因为缺少某件仪器就跳过测量思维,也不要因为有仪器就越过安全边界。
1.4.5 噪声、抖动与异常边沿
证据分层:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,为一次异常边沿列出先查工具设置、供电还是固件的顺序可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
讨论信号时,先把自然语言中的“正常”“稳定”“有波形”替换成具体维度。幅值描述相对于明确参考点的电压范围;偏置描述波形围绕哪个直流基准变化;周期和频率描述重复节奏;占空比描述高、低或有效状态在一个周期中的比例;上升沿与下降沿描述转换过程;抖动描述相对时间位置的变化;噪声描述叠加的非理想成分;协议还会增加位序、帧结构、校验和超时。一个观察可能支持其中一两个维度,却不能自动覆盖全部维度。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.4.6 仪器选择决策卡
机制拆解:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,把‘想知道什么’映射到‘需要哪类证据’可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
频率和周期的关系 `f = 1 / T` 很简单,但数据来源并不简单。若日志显示两个时间戳相差一秒,先问时钟来源、记录粒度、打印开销、调度和缓冲是否影响了时间;若示波器屏幕显示一个周期,先问时基、采样和触发是否足以代表重复行为;若用计数器统计边沿,先问计数窗口和溢出规则。公式可以把已经可靠的量换一个单位,不能替代获得可靠量的过程。主机模型中的时间序列最适合练习这些定义,因为所有输入都可控;目标机才需要面对时钟、外设和观测工具的真实限制。
1.4.7 从截图到测量记录
运行步骤:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,把一张没有刻度的波形截图改写成可交接记录可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
边沿的语言也应当准确。上升时间、下降时间、过冲、振铃和毛刺都涉及时间分辨率与测量系统。探头地线较长、接触方式不当或带宽设置不同,可能让显示中的边沿看起来比被测对象更糟或更平滑。即使仪器已经正确配置,一张截图也通常只是一个窗口内的样本,不等于所有温度、电源、程序负载和板卡状态下的保证。学习阶段最重要的成果不是追求一条“完美方波”,而是知道一张波形图必须附带哪些条件、哪些解释仍然不能做。
1.4.8 本节交付:一条可复核波形说明
运行步骤:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,没有仪器时用主机样本序列完成替代路径并标注未测量可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
采样率、记录长度和时间尺度共同决定你能分辨什么。采样间隔过粗时,窄脉冲可能没有被采到,频率计算也会失真;记录窗口太短时,慢速变化或偶发事件可能不在画面里;窗口很长又可能牺牲细节。这里不需要背诵一个与仪器型号无关的数字,而需要形成设计问题:我的最短事件可能有多快?我希望观察多久?我是否需要看到事件前后的关系?这些问题同样适用于软件日志和逻辑分析,只是单位从屏幕格变成缓冲区、时间戳和采样任务。
1.4.9 迁移预告:信号将进入定时器与通信
迁移缺口:对本章的信号与测量:从读数到记录来说,直流、瞬态、周期、频率、占空比、边沿、带宽、采样率、噪声和负载组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
目标机条件:在GPIO 翻转、按钮边沿、串口波形、示波器探头与主机采样序列中,列出下一章构建产物中可能需要的时钟与引脚条件可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败记录:常见错误是把单次平均读数当成波形,把探头引入的噪声当成芯片故障,或只保留好看的截图而删掉失败条件。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
下一步:先写想要测量的量和时间窗口,再选择工具、设置、记录格式和可接受误差。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
还要区分随机噪声、确定性干扰和软件定义的非预期事件。随机噪声在重复采样中可能呈统计变化;确定性干扰可能和开关电源、通信或周期任务相关;软件事件则可能有明确日志和状态机路径。一个漂亮的排查记录会把假设列出来:如果它与 PWM 周期一致,预期在某种时间窗口出现;如果是探头接触问题,改变接触或参考时可能变化;如果是输入浮空,改变偏置合同后模型应表现不同。假设并非结论,只有配套的观察和限制才形成证据。
请围绕“信号与测量:从读数到记录”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
05 · HOST LAB AND TARGET BOUNDARY
低压实验:先验证判断模型
实验包先用 Python 标准库验证欧姆模型、逻辑阈值和错误输入,再把可迁移的记录字段带到真实板卡。主机路径不是目标机的替身,而是减少变量、训练断言和保留失败的安全入口。
1.5.1 实验包先看什么:目录与版本
运行步骤:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,让读者在新目录中不依赖作者电脑路径地启动测试可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
主机测试包含三类样例。正常样例验证理想公式与明确的高低阈值;边界样例验证电压处于未定义区时模型不会冒充可靠输入;错误样例验证零电阻、无效目标电流或不可能的简单 LED 供电关系会被拒绝。这样的测试结构与后续每一章相同:不仅测试“正确输入得到正确输出”,还测试边界与错误是否被清楚处理。
1.5.2 正常输入:先建立基线
运行步骤:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,解释每个通过项对应哪一条模型合同可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
“只改变一个变量”是本实验的核心规则。可把供电电压、串联电阻、目标电流或阈值中的一个改成新值,先写下预测,再运行测试,最后解释差异。若同时修改多个变量,即使结果变化也无法知道原因。这个规则看起来简单,却是以后调试定时器、通信协议、DMA 缓冲区和 RTOS 调度时最有用的纪律之一。
PYTHON · HOST MODELcase = {"name": "threshold-boundary", "input": 2.0, "expected": "high"} assert case["name"] and case["expected"] print(case)
先把输入、预期和边界写成记录,再运行实验包。通过只说明模型断言满足,不说明具体板卡的电气事实已经测量。
PYTHON · EVIDENCE GATEchanges = [("baseline", 3.3, 330), ("one-change", 3.3, 660)] for name, voltage_v, resistance_ohm in changes: print(name, voltage_v / resistance_ohm) # 解释变化时只改变 resistance_ohm
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.5.3 边界输入:让阈值与约束现形
机制拆解:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,预测改变一个输入后哪一个断言会先失效可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
目标机路径是可选的第二层验证,不是主机路径的替代品。若读者拥有官方开发板并已理解用户手册,可从板载功能开始。第一层证据是构建成功,第二层是烧录工具成功,第三层是复位后启动可观察,第四层才是输入输出行为满足合同。四层要分别记录:构建成功不能证明写入目标正确,烧录成功不能证明程序启动,程序启动也不能证明逻辑极性、时间或电平满足需求。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 主机通过 | 模型输入、断言、完整输出 | 真实电平已测量 |
| 目标机构建 | 目标、工具链、制品、日志 | 程序已经完成合同 |
| 行为验收 | 输入条件、现象、时间和版本 | 构建成功可替代观察 |
1.5.4 错误输入:失败也是交付物
证据分层:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,记录异常类型、触发条件、错误信息和恢复方式可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
实验输出也应被保存为证据。读者可以复制测试命令、Python 版本、测试输出和自己修改的一个变量;如果有目标板,还可保存构建日志、烧录日志、板型、固件版本和观察条件。不要提交私有路径、令牌、串口号或声称不存在的示波器数据。可复现不等于暴露个人环境,而是让别人有足够信息在新目录中执行同样的主机路径,并知道目标机路径需要哪些额外条件。
1.5.5 只改变一个变量:建立因果解释
机制拆解:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,把预测、实际输出和模型限制写在同一张实验单上可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
一个面向读者的实验包首先必须在陌生目录中有清楚的入口。第 1 章的包把可执行模型放在 `src/`,把宿主测试放在 `host_tests/`,把唯一推荐入口放在 `run_all_tests.py`;README 则说明 Python 版本、运行命令、输出应包含什么,以及没有硬件时怎样完成学习闭环。目录不是为了模仿大型工程,而是为了让读者不必猜测“应该运行哪一个文件”“这个脚本依赖什么”“失败后去哪里找测试”。当章节越来越复杂,入口与边界的清楚程度会比代码行数更重要。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.5.6 主机测试如何读:断言不是魔法
概念拆解:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,阅读测试失败时先定位断言和输入,而不是删掉测试可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
测试命令通过时,输出的意义也要准确。它说明测试文件在当前解释器、当前目录和当前源代码上执行,并且断言与实现一致。它没有证明测试覆盖了所有可能输入,也没有证明模型参数适用于你的板子。测试失败同理:失败并不自动表示模型“坏了”,它可能表示读者为了练习改变了输入、修改了函数、使用了不支持的解释器,或在错误目录执行。好的排查从失败标题、回溯中第一个本章文件、实际输入和预期值开始,而不是从删除测试、放宽断言或反复重装环境开始。
1.5.7 目标机四层证据
迁移缺口:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
目标机条件:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,为每一层指定日志、现象和不能替代的下一层可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败记录:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
下一步:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
第二类实验围绕数字输入分类。`DigitalInputSpec` 不代表任何特定 MCU 的数据手册;它是一张显式给出的合同卡。供电电压、最大保证低阈值和最小保证高阈值被写入对象,`None` 被分类为 floating,介于阈值之间的值被分类为 undefined。读者可以安全地替换这些模型参数,检查分类边界和异常路径。真正有价值的地方是观察函数没有把所有数字强行塞进 high/low:当信息不足时,模型留下了“不能可靠判断”的状态。
1.5.8 本节交付:一次可复现实验报告
运行步骤:对本章的低压实验:先验证判断模型来说,模型合同、测试夹具、正常/边界/错误、单变量、构建、烧录、启动和行为组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在解压后的实验包、主机测试、单变量改动、板载功能和目标机证据层中,没有目标板时把目标机字段标为未执行而不是留白可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是在作者目录运行、删掉失败测试、同时改多个变量,或把‘测试通过’写成‘板卡安全且长期可靠’。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:把主机实验的输入—输出—断言—限制字段原样带到目标机,再补齐板卡和测量条件。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
故障注入应当有礼貌地对待函数合同。对 `ohms_law`,零或负电阻没有形成当前理想模型允许的输入,函数抛出错误是期望行为;对 LED 串联电阻估算,若供电不高于假定压降或目标电流非正,拒绝比返回负电阻更有用。读者要记录“哪个输入违反了哪条合同”,而不是只记录 Python 报了什么异常。未来处理缓冲区长度、串口帧、传感器校准和文件格式时,同样的习惯会让错误信息从偶然崩溃变成可测试接口。
请围绕“低压实验:先验证判断模型”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
06 · DELIVERY AND SOURCES
交付与资料:让另一个读者也能复查
本章最后交付的不是‘成功’两个字,而是一份带对象、条件、方法、结果、限制和下一步的记录。资料卡把官方事实与本站教学解释分开,交付清单则让没有同一块板卡的读者仍能走完主机路径。
1.6.1 记录的最小字段:谁、何时、测什么
证据分层:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,将‘LED 亮了’改写成另一位读者可以复述的记录可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
测量记录再回答“我在什么条件下观察到了什么”。它应当把对象、固件版本、供电、仪表、模式、量程、参考点、测试点、输入刺激、预期范围、实际结果、时间和异常分开写。记录的语言也要避免夸张:一次直流读数可以支持“在此条件下读到该值”,不能直接支持“系统长期稳定”;一次 LED 观察可以支持“可见输出发生变化”,不能直接支持“逻辑阈值、功耗或时序全部正确”。
1.6.2 官方资料卡:事实从哪里来
概念拆解:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,比较板卡用户手册、GPIO 应用笔记和仪器资料的职责可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
资料卡还应记录访问日期。硬件文档、应用笔记、IDE 与板卡资料都会更新;一个 PDF 的版本、一个网页的稳定分支、甚至一个产品页面的推荐工具都可能变化。读者若使用不同修订或不同板型,应该重新核对原始来源并在自己的记录中注明差异。版本意识不是为了制造复杂度,而是承认嵌入式结论经常依赖具体对象。
PYTHON · HOST MODELrecord = {"object": "nucleo-board", "firmware": "unassigned", "tool": "host-python", "result": "model-only"} required = ("object", "tool", "result") assert all(record[key] for key in required) print(record)
系统卡用来交接对象、工具和证据范围;firmware 尚未绑定目标板时必须明确写出 model-only,而不是暗示已经烧录。
PYTHON · EVIDENCE GATEevidence = ["build", "flash", "boot", "behavior"] completed = {name: False for name in evidence} completed["build"] = True assert completed["build"] and not completed["behavior"] print("next-stop", [name for name, ok in completed.items() if not ok])
两段代码都只服务于本单元的判断模型。复制运行后请保存输出,并写出它不能替代的目标机证据。
1.6.3 证据分层:模型、规格、测量、现象
机制拆解:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
边界案例:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,解释为什么它们不能互相冒充可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
常见误判:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
实现迁移:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
目标机路径则必须附带更多条件:板卡型号、供电方式、用户手册/原理图、工具链版本、目标选择、构建命令或界面步骤、烧录日志、复位后启动现象,以及合同行为的验收。构建成功、烧录成功、启动成功和合同行为成功要在记录中分成四行。若只拥有前三行,正确结论是“已经完成前三层”,而不是“实验全部完成”。这会让后续的故障排查精确得多。
| 要回答的问题 | 应留下的证据 | 不能直接推出 |
|---|---|---|
| 事实来源 | 标题、发布者、版本、链接 | 教程印象就是规格 |
| 操作条件 | 板卡、工具、接线、时间 | 别人必然复现 |
| 结论边界 | 覆盖范围、未知项、停止点 | 一次成功就是长期保证 |
1.6.4 读者路径:没有硬件也能完成什么
运行步骤:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,用实验包测试、资料阅读和记录模板完成最小交付可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
交付也要保存失败。若主机测试因非法输入而抛出错误,记录错误名和触发条件;若目标机没有启动,记录上一次已知正常的版本、当前板卡状态、供电路径和日志,而不是清空一切重新开始。失败记录能让另一个人判断是否是模型合同、工具链、板卡选择、连接关系或行为逻辑的问题。删除失败痕迹只会让下一次重复同样的排查。
1.6.5 版本与许可:可复查也要可追溯
证据分层:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,说明文档更新后哪些结论必须重新核对可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
下一章将进入 C、编译、链接和内存。第 1 章带走的工作方法将继续适用:不要只问代码写了什么,也要问它运行在什么对象上、依赖什么供电与工具链条件、输出怎样被观察、结论有哪些证据和限制。掌握这些习惯后,读者在面对寄存器、启动文件、GPIO 或通信协议时,才不会把软件文本和真实设备世界割裂开来。
从左到右是思考顺序,不是把四类证据合并成一个“通过”。
1.6.6 失败复盘:不要只留下成功截图
证据分层:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
来源核对:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,写一段让同伴无需猜测就能接手的失败报告可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
结论边界:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
“可复现”至少有两个层次。计算复现表示另一位读者在清楚的环境条件下能运行同一主机入口,并得到相同或可解释的测试结果;观察复现表示另一位拥有相同板型、版本、工具和条件的读者能理解怎样检查同一目标机现象。它们都不是承诺任何机器、任何时间、任何硬件都得到相同数字。把可复现说成绝对保证,反而会掩盖操作系统、解释器、板卡修订、固件版本、仪器和环境所带来的差异。
1.6.7 交付清单:从实验到下一章
证据分层:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
读者路径:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,标出第 2 章构建与内存内容将复用的字段可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败复盘:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
交接动作:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
资料的版本也应是交付字段。文档有发布日期、修订号、板卡有硬件版本,软件工具有版本号,网页会改变内容。读者无需把整个互联网存档,但至少要保留标题、稳定链接、阅读日期和与本章有关的页码或主题。若以后使用的资料已更新,先比较变化是否影响供电路径、接口、阈值或工具步骤;若影响,更新自己的对象卡和结论。把“我参考了官方资料”具体化,才能让别人知道到底参考了哪一份、它是否适用于当前对象。
1.6.8 资料与解释的边界
概念拆解:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
场景推演:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,为一个可能随版本变化的结论加上核对提醒可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败与恢复:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移提示:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
可复现的命令也要避免依赖作者私人机器。README 中不应要求读者使用作者的绝对路径、账户名、串口号、密钥、付费许可证或已经存在的虚拟环境。第 1 章选择 Python 标准库,正是为了让一条 `python run_all_tests.py` 在受支持解释器和解压根目录中足够明确。若读者环境不能执行,错误信息应成为记录的一部分:是缺少 Python、版本不对、目录不对,还是文件损坏;不要把“我这里能跑”当作交付标准。
1.6.9 本章结业:提交一份可复查记录
运行步骤:对本章的交付与资料:让另一个读者也能复查来说,对象、输入、工具、条件、结果、限制、资料来源、版本和恢复步骤组成一条从条件到结论的链条:先确认事实,再选择模型或工具,随后记录观察,最后写出覆盖范围。公式、阈值和仪表读数只有在参考点、单位、时间、负载与版本明确时才有可解释性。
预期输出:在实验记录、官方手册、测量条件、ZIP 实验包和读者交接中,让读者能判断你证明了什么、没有证明什么以及下一步怎么做可能经过多个状态。电脑程序可以等待、重试或打印更多信息,真实设备却可能改变电平、能量、位置、温度或下一次采样窗口,所以成功路径和失败路径都要写出来。把“应该正常”改成带条件和观察方式的句子,读者才有机会复现。
失败处理:常见错误是把一块示例板卡的引脚、一个仪器的接地习惯或一个版本的结果泛化为所有读者的保证。一旦结果异常,先保存最后已知正常的输入、版本、连接、工具设置和时间,再只改一个变量。不要同时换板卡、换量程、换参数和换测试样例;好的失败记录会写出触发条件、已经排除的可能、仍然未知的事实和下一步停止在哪里。
迁移到目标机:用系统卡交接对象、版本、输入、工具、证据、未知项和停止条件,使下一位读者能从干净目录继续。迁移到 C、Cortex-M、RTOS 或嵌入式 Linux 时,保留行为合同和证据字段,只替换平台边界。没有目标机时,读者仍可完成主机模型、资料卡和限制说明;有目标机时,还必须补充板卡、供电、启动、测量与恢复记录。
目标机交付的最大误区是把工具消息压缩成一个“成功”。正确报告应该把这四类事件拆开。构建:源代码、目标和工具链是否生成制品;烧录:调试器或下载工具是否报告完成;启动:复位后是否出现与固件版本相符的受控现象;合同行为:在写明输入、输出、时间、次数和失败条件后,是否满足定义。每一层都可以独立失败,也可以在前一层成功后仍然未知。把它们拆开,验收者才能给出正确建议,而不是在“板子不行”这一句里猜测。
请围绕“交付与资料:让另一个读者也能复查”写出对象、输入或测量目标、状态/机制、输出、一个约束、一个失败路径和对应证据。没有目标板或仪器时,完整运行主机路径并把未执行字段标为未执行;拥有目标机时,也要补齐板卡、供电、工具、版本和观察条件。不要用一次通过或一张截图覆盖没有做过的验证。
资料卡(访问日期:2026-09-03):UM3256 Rev 2 支撑 Nucleo-64 板卡的供电选项、连接器和板载功能说明;AN4899 支撑 STM32 GPIO 配置、上拉下拉和低功耗边界;Tektronix 探头资料支撑保护接地、地夹和探头影响的说明;Fluke 资料支撑万用表检查和额定范围的安全提醒。本站的“证据分层”和“主机/目标机边界”是教学解释;具体板卡、芯片和仪器仍须按读者当前版本核对。