基于STM32与SPI MRAM的工业级掉电数据记录方案
最近在给一台工业传感器做数据记录模块方案锁定在 STM32L041C6 加一片 MR25H40CDF。这颗 MR25H40CDF 是 4Mbit 的 SPI MRAM换算下来 512KB 非易失存储而 STM32L041C6 是常见的 Cortex-M0 超低功耗 MCU两者都是 1.8V 供电体系搭在一起很顺。这个组合主要解决嵌入式里最头疼的一类问题既要在掉电时保住参数又要允许高频次、大容量地写入数据还不能把 Flash 寿命提前磨光。这篇文章是我自己从原理图到驱动的完整记录。如果你正好在手调这两颗料或者正在纠结工业产品里的数据存储格式怎么设计可以参考我的做法。我会把电路连接、SPI 驱动、数据帧设计、掉电保护和踩坑记录都展开讲一讲尽量把“为什么这么做”也说清楚。下面直接进入正题。1. 方案背景为什么要用 MR25H40CDF 做数据存储1.1 MRAM 与 EEPROM、NOR Flash 的本质区别先说说这颗 MR25H40CDF 到底是什么。它属于磁阻随机存取存储器简称 MRAM接口是 SPI容量 4Mbit。单看接口和容量和常见的 SPI NOR Flash 很像但内部存储机理完全不同MRAM 用磁性隧道结来存数据写入时不需要先擦除读写的特性和 RAM 类似但掉电后数据不丢。这个特性对工业嵌入式来说太关键了。传统 EEPROM 虽然可以按字节写但写寿命一般在 10 万次左右如果一个数据每秒更新一次几天就逼近寿命上限。NOR Flash 寿命略好但写入前必须整块擦除还要管理坏块、做磨损均衡复杂度立刻上来了。而 Everspin 的 MRAM 标称写次数在 10^14 量级基本不用考虑磨损数据保持能力在工业级温度范围内也有 20 年以上。所以我做了一个很直接的判断在需要频繁记录温度、温湿度、运行状态这类参数时MRAM 比 EEPROM 和 NOR Flash 都省心。你不需要设计复杂的 FTL 层不需要维护擦写均衡表只要把它当成一块“不会丢数据的 SRAM”去用就行。当然MRAM 也不是没有短板。价格比 EEPROM/Flash 高容量也没有大容量 NOR Flash 那么大所以它适合做参数存储、运行日志、掉电保存这类中等容量数据区而不是用来放固件镜像或大文件。选型时先想清楚用途就不会被“512KB 够不够”的问题卡住。1.2 选 STM32L041C6 的四个理由MCU 选 STM32L041C6主要看中四个方面。一是供电兼容。这颗 MR25H40CDF 是 1.8V 供电版本而 STM32L041C6 的工作电压范围是 1.65V 到 3.6V所以可以让 MCU 和 MRAM 共用同一个 1.8V 电源轨不用做电平转换。这点在实际硬件设计里能省掉很多麻烦也降低了 SPI 信号在跨电压域时的时序风险。二是低功耗。L041 属于 STM32L0 系列Cortex-M0 内核最高跑到 32MHz但 STOP 模式电流能到微安级。工业设备很多是电池供电或者要求待机功耗极低这颗 MCU 不会拖后腿。MRAM 本身待机电流也很小整体方案很适合做低功耗数据记录仪。三是资源匹配。STM32L041C6 有 64KB Flash 和 8KB SRAM外设有 SPI、I2C、USART、ADC 等。虽然片上也有数据存储区但容量只有 KB 级远远装不下工程日志和大量运行记录。挂一颗 512KB 的 MRAM 作外部数据区MCU 资源刚好够用。四是 Cortex-M0 的开发环境非常成熟。STM32CubeMX 生成初始化代码HAL 库封装好了 SPI 收发工程搭建成本低。后面不管换到 STM32G0、L4 还是国产 M0 芯片驱动稍作改动就能迁移。一款产品初期的 BSP 越容易维护后面改版越轻松。2. 硬件连接与 SPI 驱动封装2.1 引脚分配与电路连接要点MR25H40CDF 是标准的 8 脚 SPI 器件引脚不多但对新手来说最容易在 WP# 和 HOLD# 上翻车。我的接法是这样的CS、SCK、MOSI、MISO 分别接 MCU 的 PA4、PA5、PA7、PA6用软件 GPIO 控制 CS而不是启用 STM32 的硬件 NSS。WP# 直接接 VDDHOLD# 也接 VDD两个引脚都加上拉电阻。信号MR25H40CDF 引脚STM32L041C6 引脚说明CS#1PA4软件控制低有效SO2PA6 (MISO)数据输出WP#3VDD写保护关闭接高GND4GND共地SI5PA7 (MOSI)数据输入SCK6PA5 (SCK)SPI 时钟HOLD#7VDD暂停功能不用接高VDD81.8V并联去耦电容为什么要强调 WP# 和 HOLD#因为我第一次画板时把 HOLD# 悬空了结果通信时好时坏逻辑分析仪抓到的信号完全正常但读回来的数据就是随机出错。后来翻手册才想起来 HOLD# 一旦拉低器件会暂停 SPI 通信并让 SO 变成高阻。悬空状态下噪声一抖偶发拉低数据就乱了。这个坑一定要避免。供电方面1.8V 电源必须在 VDD 引脚附近放一个 100nF 陶瓷电容最好再加一个 1uF 到 10uF 的电容。MRAM 在写入切换时会产生瞬态电流如果去耦不够供电电压跌落会导致写入异常。实测中电容位置比容量更敏感离引脚越近越好。2.2 用 HAL 库写出最小可用的 MRAM 驱动SPI 配置我选择 Mode 0也就是 CPOL0、CPHA0。MR25H40CDF 同时支持 Mode 0 和 Mode 3但 Mode 0 在 Cortex-M 上默认度最高而且多数 SPI 器件都是 Mode 0后续移植也少改一堆东西。配置时主频我给的是 4MHz实际器件支持到 16MHz但工业现场走线可能不理想4MHz 留足了时序裕量实测完全够用。初始化和读写的核心逻辑很简练。先看读状态寄存器和写使能uint8_t MRAM_ReadStatus(void) { uint8_t cmd 0x05; uint8_t status 0; MRAM_CS_Low(); HAL_SPI_TransmitReceive(hspi1, cmd, status, 1, HAL_MAX_DELAY); MRAM_CS_High(); return status; } void MRAM_WriteEnable(void) { uint8_t cmd 0x06; MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 1, HAL_MAX_DELAY); MRAM_CS_High(); }读数据操作是这样的CS 拉低发送 0x03 读命令再发送 3 字节地址然后连续读取 len 个字节。地址发送顺序是大端高位在前即先发地址的 bit23..bit16再发 bit15..bit8最后发低 8 位。由于 512KB 范围是 0x000000 到 0x07FFFF高字节实际上只需要用到 0x00。void MRAM_ReadBytes(uint32_t addr, uint8_t *buf, uint32_t len) { uint8_t cmd[4] {0x03, (addr 16) 0xFF, (addr 8) 0xFF, addr 0xFF}; MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 4, HAL_MAX_DELAY); HAL_SPI_Receive(hspi1, buf, len, HAL_MAX_DELAY); MRAM_CS_High(); }写数据操作类似但先要发 WREN 把 WEL 置 1然后重新拉低 CS发送 0x02 写命令、3 字节地址和数据。这里有一个极其重要的时序WREN 操作和 WRITE 操作是两个独立的总线事务每个事务都必须有完整的 CS 下降沿-上升沿过程绝对不能把 WREN 和 WRITE 的 CS 连在一起拉低。否则器件会认为命令不完整写使能不生效。void MRAM_WriteBytes(uint32_t addr, const uint8_t *buf, uint32_t len) { uint8_t cmd[4] {0x02, (addr 16) 0xFF, (addr 8) 0xFF, addr 0xFF}; MRAM_WriteEnable(); MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 4, HAL_MAX_DELAY); HAL_SPI_Transmit(hspi1, (uint8_t *)buf, len, HAL_MAX_DELAY); MRAM_CS_High(); }写完建议轮询状态寄存器等 WIP 位清零。MRAM 内部写入很快通常微秒级就结束比 NOR Flash 的毫秒级擦写快几个数量级。但轮询一下可以让程序逻辑更严谨也能在异常时快速暴露问题。2.3 写使能与状态寄存器检查很多嵌入式工程师第一次接触 SPI MRAM 时会下意识认为“MRAM 不是像 RAM 吗为什么不直接写”其实串行 MRAM 为了兼容标准 SPI Flash 指令集也保留了写使能机制。状态寄存器里的 WEL 位必须为 1WRITE 命令才会执行。如果不执行 WREN写入操作会被静默忽略读回来还是旧数据。我习惯于每次写操作前都调用一次 MRAM_WriteEnable然后检查状态寄存器MRAM_WriteEnable(); if ((MRAM_ReadStatus() 0x02) 0) { return MRAM_ERR_WEL; }这一步能把很多诡异问题提前拦住。比如 WP# 引脚被拉低、上拉电阻虚焊、或者供电异常导致器件进入了保护状态都可以通过 WEL 检查发现。如果 WEL 一直置不上就别继续写数据了先查硬件。状态寄存器还有一个位要留意WIPbit0。写操作发完最后一个字节之后器件会进入内部写周期此时 WIP 为 1。因为 MRAM 写周期极短这个位可能一闪而过但如果你的程序接下来要立刻读同一地址最好还是等一下。我有一次在写完后马上读结果偶发读到旧值加了短暂轮询后问题消失。如果不想依赖 HAL 和硬件 SPI也可以全部用 GPIO 模拟 SPI。对 MRAM 这种速度要求不高的器件模拟 SPI 反而更好排查问题你可以用示波器一个一个 bit 地看时序。只是模拟 SPI 的代码每次切换 MOSI 方向时要格外小心别在发送过程中改了 IO 模式。我的原则是产品初期用硬件 SPI 验证性能出问题时再用逻辑分析仪抓波形模拟 SPI 留着做底层对照测试。3. 数据帧设计与可靠存取3.1 数据帧格式让每一笔记录经得起掉电考验存储介质再好如果上层数据格式设计不严谨工业现场照样会读出垃圾数据。MRAM 掉电不丢但如果设备在写入某一笔记录的中间断电这个地址范围内的数据就有可能是半截数据。所以我把存进去的每条记录都做成了固定长度的帧并且在读写两侧都做好校验。我定义了一个 12 字节的日志帧#pragma pack(push,1) typedef struct { uint16_t magic; // 0x5AA5识别有效数据 uint8_t ver; // 帧版本 uint8_t type; // 记录类型 uint16_t seq; // 递增序号 int16_t temperature; // 业务数据示例 uint16_t humidity; // 业务数据示例 uint16_t crc; // CRC16对整个帧计算 } LogEntry; #pragma pack(pop)magic 选择 0x5AA5 而不是 0xAA55是为了避开全 0、全 1 这类天然出现概率高的值。每次上电扫描时只有先看到 magic 相等才继续校验 CRC否则就跳到下一个帧位置继续找。因为帧长固定扫描就是简单地按 12 字节步进读取逻辑非常简单。CRC16 我采用查表法校验范围覆盖 magic 到 humidity 字段帧末尾的 crc 本身不参与计算。这样整帧中任何一个 bit 翻转CRC 都有大概率能发现。对于工业环境下的电磁干扰、电压跌落引起的错误CRC 已经足够。如果你做的是安全性更高的应用可以换成 CRC32或者再加一个帧计数器能抵抗重复包攻击和数据回滚。这里顺带回答一个常见问题既然 MRAM 这么可靠为什么还要做地址扫描和 CRC因为存储介质可靠不代表数据传输链路可靠。SPI 线上的干扰、MCU 固件 bug、写入半途掉电都可能让某个地址留下无效数据。校验层是给整个存储系统兜底的不是为了防 MRAM 本身。3.2 写入侧从“发完数据”到“确实写进去了”写数据不能只调一个 MRAM_WriteBytes 就算完。在工业应用里我更关心“这一笔到底写进去没有”。所以实际写入函数做了三件事先写数据帧再读回来最后做整帧校验。只有读回校验通过才把写指针更新到下一帧位置。写入流程这样设计是有原因的。MRAM 虽然耐用但写入过程中如果电路异常比如供电毛刺、MCU 提前复位最后写进存储介质的值可能不完整。读回校验能第一时间发现这种问题。如果校验失败可以再补写一次或者标记这一帧无效并跳到备用区。在掉电保护方面STM32L041C6 自带的 PVD 正好用得上。PVD 可编程电压检测器能在 VDD 跌到阈值以下时触发中断我在中断里只做一件事关闭新的写入请求并给正在进行的写操作留出足够的完成时间。由于 MRAM 写入速度极快一个 12 字节帧的完整 SPI 写入也只有几十微秒配合一个小容值储能电容掉电瞬间足够把关键日志收尾。SLOT 的思路是正常运行时系统把“能否写存储”当作一个原子标志PVD 中断里立刻清掉这个标志同时启动一个定时器只允许当前写入完成等电压完全跌落前就把数据固化掉。虽然 MRAM 本身不依赖电源保持数据但这个机制保护的是 SPI 通信过程避免电压过低导致数据传输错乱。3.3 读取侧上电恢复与 CRC 校验上电恢复的第一步不是直接读业务数据而是先确认 MRAM 真的存在且状态正常。我用 0x9F 命令读器件 ID然后和手册里的预期值比对。这一步能快速判断是接线问题、供电问题还是器件损坏。如果 ID 不对系统可以直接进入故障上报而不是拿一堆乱码去跑算法。第二步是扫描有效数据区。从 0x000000 开始按 12 字节步进读帧先比对 magic再算 CRC。遇到 magic 不对的地址就跳过继续找遇到 CRC 不对但 magic 对的帧说明这帧数据已被破坏我会把它标记成无效帧用一条空白帧覆盖。扫描完成后用最后一个 seq 值恢复记录计数整个日志系统就能无缝接续而不是每次开机都从头写覆盖。这个扫描过程在 512KB 全量扫描时会有点耗时。如果地址空间被写满读完整片需要几毫秒到十几毫秒。对于上电启动来说可以接受但如果你的产品对启动延迟很敏感可以在片内固定位置存一个“最新写指针”上电先读指针再去读最近帧。代价是写指针本身也要做双备份避免掉电时指针损坏。4. 实测效果与常见问题排查4.1 现场测试结果我把这套方案放到一块自制的工业主板上跑做了一个简单的耐久性测试循环写入 1000 次固定模式每次写完读回校验记录错误数再做 50 次断电重启每次开机都扫描日志区并统计 CRC 失败率。最终结果1000 次循环写入全部通过50 次断电重启后日志读取完整没有出现 CRC 错误。还有一个细节让我印象很深。之前用 SPI NOR Flash 做同样的日志记录Flash 的当前块写满之后我要先整块擦除再写而擦除期间一旦断电这块数据就整个没了。换了 MRAM 之后这个“先擦后写”的操作完全消失了。代码少了三分之一出错点也少了很多。目前这片 512KB 的 MRAM 按 12 字节一帧计算大约可以存 43000 条日志。如果按照工业现场每分钟一条记录来算能连续记录一个月不重复写入。再配合一些日志搬移策略比如写满后自动搬移最旧的数据可以支撑更长的时间跨度。4.2 常见问题速查表我把自己调试时踩过、以及帮同事排查过的问题整理成一张表遇到类似现象可以直接照着查。现象可能原因排查/解法写操作后读回全是 0xFF没有执行 WREN或 WP# 被拉低确保每次写前 WREN读取状态寄存器看 WELWP# 接 VDDWEL 始终为 0WREN 的 CS 时序被破坏确认 WREN 是一个独立事务CS 低、发 0x06、CS 高中间不能插入其他字节MISO 一直无输出SPI 模式配置错误对照手册改为 Mode 0 或 Mode 3检查 CPOL/CPHA用逻辑分析仪看采样点偶发读回错误HOLD# 悬空被噪声拉低HOLD# 上拉或直接接 VDD不能悬空高温或电压波动时数据错供电去耦不足VDD 对地加 100nF 电容尽量靠近器件引脚检查 LDO 输出纹波数据只写了一部分地址超过 0x07FFFF4Mbit 地址范围 512KB检查地址计算和越界判断4.3 调试中的两个特殊提醒第一个提醒是关于逻辑分析仪的采样率。SPI Mode 0 下数据在上升沿被采样MOSI 的有效数据必须在上升沿之前建立。如果你用逻辑分析仪抓到的波形看起来“数据变了但器件没收到”先降低 SPI 时钟再抓一次。很多线上干扰在低速下并不影响通信但高速下就会触发建立时间不够的问题。第二个提醒是关于 WP# 和 HOLD# 的电压。这两个引脚接 VDD 是指接到 MRAM 自己的 VDD也就是 1.8V不是随便接一个 3.3V 电源。如果 MCU 供电是 3.3V 而 MRAM 是 1.8V那 SPI 信号也不能直接直连必须做电平转换或者选择与 MCU 供电一致的其他版本器件。曾经有人把 3.3V 直接接到 1.8V 器件上虽然没有立刻冒烟但长期可靠性会受影响。这两个问题都不在常规驱动代码里但往往最浪费调试时间。每次遇到“代码看着没问题硬件也量了有信号”的糊涂账我就会先查电源引脚、WP#、HOLD# 这三个地方十有八九能找出原因。我个人的习惯是把这套存储逻辑封装成一个mram_log.c模块对外只提供Log_Init、Log_Append、Log_ReadLatest、Log_GetCount四个接口。业务代码里完全看不到 SPI 指令和地址计算后续就算换一颗不同容量的 MRAM只需要改驱动层和地址参数。这样看待存储系统时它就不是“一颗芯片”而是一个可以长期演进的模块。对于想要往嵌入式架构师方向走的人来说这种抽象能力比背八股更有价值。

相关新闻

【数据集】上市公司数字化与绿色化耦合协调度数据(2010-2025年)

【数据集】上市公司数字化与绿色化耦合协调度数据(2010-2025年)

数据简介:基于文本分析与计量模型相结合的研究视角,旨在测度企业数字化与绿色化双重转型的协同发展水平。通过提取年度报告并量化其中涉及数字化转型与绿色转型的关键词词频,进而测算两大转型战略之间的耦合协调程度。其核心逻辑在于&#xf…

2026/10/4 7:14:50 阅读更多 →
程序员高效工作技巧:从需求对齐到时间管理的实战方法论

程序员高效工作技巧:从需求对齐到时间管理的实战方法论

文档教程知识库人工智能 【免费下载链接】ai-guide 程序员鱼皮的 AI 资源大全 Vibe Coding 零基础教程,分享 OpenClaw 保姆级教程、大模型玩法(DeepSeek / GPT / Gemini / Claude / GLM)、最新 AI 资讯、Prompt 提示词大全、AI 知识百科&…

2026/10/4 7:14:50 阅读更多 →
如何在 PenguinHarness 中用好工具审批:4 种审批模式保障 Agent 安全执行

如何在 PenguinHarness 中用好工具审批:4 种审批模式保障 Agent 安全执行

如何在 PenguinHarness 中用好工具审批:4 种审批模式保障 Agent 安全执行 【免费下载链接】penguin-harness 🐧 Unified and Stable RSI Platform 项目地址: https://gitcode.com/gh_mirrors/pe/penguin-harness PenguinHarness 是一个面向自改进…

2026/10/4 7:13:50 阅读更多 →

最新新闻

Node.js事件驱动与非阻塞I/O:高并发下的性能基石与实战解析

Node.js事件驱动与非阻塞I/O:高并发下的性能基石与实战解析

1. 为什么Node.js能扛住高并发:从一次面试追问说起Node.js 事件驱动模型和非阻塞I/O这两个词,相信每个写过JavaScript的人都见过。但真正理解它们价值的人,可能比想象中少。几年前我去面试一家做实时通信的中厂,面试官问了一个很实…

2026/10/4 7:52:12 阅读更多 →
STM32驱动SPI接口MRAM:免擦除、不掉电的工业存储方案

STM32驱动SPI接口MRAM:免擦除、不掉电的工业存储方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:52:12 阅读更多 →
AI Agent 接入 Redis 缓存实战:核心思路、实操要点与性能优化

AI Agent 接入 Redis 缓存实战:核心思路、实操要点与性能优化

1. AI Agent 接入 Redis 缓存的核心思路拆解AI Agent 和 Redis 缓存这两个词放在一起,很多人第一反应是“给 Agent 加个缓存呗,能有多复杂”。我一开始也这么想,直到真正把 Agent 放到线上跑,才发现事情远没有想象中简单。一个 AI…

2026/10/4 7:52:12 阅读更多 →
OpenRig:铝型材模块化模拟赛车座舱DIY指南

OpenRig:铝型材模块化模拟赛车座舱DIY指南

先聊一个很实在的问题:喜欢在家玩模拟赛车的人,几乎都会走到“座舱”这一步。桌面放个方向盘,玩一会儿就发现姿势不对、屏幕离得太远、踏板踩一脚椅子就往后滑。OpenRig这个项目,就是把“座舱”当成一个独立的硬件系统来设计&…

2026/10/4 7:52:12 阅读更多 →
红黑树算法详解:Python实现与蓝桥杯省赛真题拆解

红黑树算法详解:Python实现与蓝桥杯省赛真题拆解

2025年蓝桥杯第十六届省赛Python组出现了一道红黑树真题。拿到这个消息的时候,很多群里的选手第一反应是“省赛考红黑树,是不是离谱了点”。但看完题之后你会发现,它其实比想象中温和——不是让你20分钟默写一本《算法导论》第13章&#xff0…

2026/10/4 7:52:12 阅读更多 →
564个token压缩到115:Token Optimizer命令行输出压缩实战,pytest、构建日志一网打尽

564个token压缩到115:Token Optimizer命令行输出压缩实战,pytest、构建日志一网打尽

564个token压缩到115:Token Optimizer命令行输出压缩实战,pytest、构建日志一网打尽 【免费下载链接】token-optimizer Find the ghost tokens. Fix them. Survive compaction. Avoid context quality decay. 项目地址: https://gitcode.com/gh_mirro…

2026/10/4 7:51:12 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →