MRAM与STM32F103工业数据存储方案:高频写入与掉电安全实践
1. 项目缘起与方案选型为什么是 MRAM 加 STM32F103工业现场的数据存储有个很尴尬的夹心层用 EEPROM 吧写入速度慢、擦写寿命有限频繁记录工况参数时心里总不踏实用 SRAM 加后备电池吧电池在高温高湿环境下三五年就鼓包漏液维护成本高得离谱用 NOR Flash 吧写之前得擦除整个扇区掉电瞬间正好在擦写数据就可能丢得莫名其妙。我前几年做一个电力监测终端现场要求每 100ms 记录一次三相电流电压一天下来就是 86 万次写入用传统方案根本扛不住。后来接触到MR25H40CDF这颗MRAM磁性随机存储器才算找到了一个比较舒服的解法。它的核心特点很直接非易失、写入无延迟、擦写寿命近乎无限、不需要擦除操作、字节级随机写入。你可以把它理解成一颗“断电不丢数据的 SRAM”写一个字节和写一万个字节在时间上没有本质区别也不存在先擦后写的等待。这对于工业场景里那种“随时可能断电、但断电前必须把关键状态落盘”的需求几乎是量身定做的。主控这边选STM32F103RC理由也很朴素这颗芯片在工业嵌入式领域保有量极大资料多、价格稳、供货相对可靠72MHz 主频、256KB Flash、48KB SRAM外设资源对于中等规模的采集控制任务绰绰有余。它自带 3 个 SPI 接口其中 SPI1 挂在 APB2 总线上最高可跑到 36MHz驱动 MR25H40CDF 完全够用。更重要的是F103 的生态成熟无论是标准库还是 HAL 库SPI 的配置都有大量可参考的实践出了问题也容易找到人问。这个组合解决的核心问题就一句话在工业与嵌入式设备中实现高频次、掉电安全、免维护的数据存储与读取。适合谁看如果你正在做数据采集终端、工业控制器、电力仪表、医疗设备记录仪或者任何需要“频繁写、不能丢、不想换电池”的嵌入式项目这套方案都值得你花时间研究。哪怕你用的是别的 MCUMRAM 的驱动逻辑和 SPI 时序思路也是通用的。2. MR25H40CDF 与 STM32F103RC 的硬件设计要点2.1 MR25H40CDF 的关键特性与引脚理解MR25H40CDF 是一颗 4Mbit512KB容量的 SPI 接口 MRAM工作电压 2.7V 到 3.6V和 STM32F103 的 3.3V 系统天然匹配。它的引脚定义很标准CS 片选、SCK 时钟、SI 数据输入、SO 数据输出加上 VCC 和 GND一共 8 个引脚含 WP 和 HOLD。这里有个细节值得说WP 写保护引脚和 HOLD 保持引脚在多数应用中可以不用但建议把 WP 上拉到 VCCHOLD 也上拉避免悬空导致意外进入保护或保持状态。我早期有一版板子把 WP 悬空结果偶尔出现写不进去的情况查了半天才发现是引脚电平漂移触发了写保护。容量方面512KB 听起来不大但对于存储工况参数、校准系数、运行日志、故障快照这类数据已经相当宽裕。你可以把它规划成几个区域比如前 64KB 存系统配置和校准参数中间 384KB 存循环日志最后 64KB 存故障快照。因为 MRAM 支持字节级随机写入你不需要像 Flash 那样按扇区管理想写哪个地址就写哪个地址这种自由度在数据结构设计上非常省心。2.2 SPI 接口的硬件连接与片选策略STM32F103RC 和 MR25H40CDF 之间走 SPI连接方式很直接SPI1 的 SCKPA5、MISOPA6、MOSIPA7分别接 MRAM 的 SCK、SO、SI片选 CS 用任意一个 GPIO比如 PA4。这里就引出一个经典问题硬件片选还是软件片选。STM32 的 SPI 外设支持硬件 NSS 管理但在实际项目里我几乎都用软件片选原因有三一是硬件 NSS 在多从机场景下容易打架二是软件片选时序完全可控方便在 CS 拉低和第一个时钟之间插入必要的建立时间三是调试时用逻辑分析仪抓波形软件片选的电平变化一目了然。MR25H40CDF 的 SPI 模式支持 Mode 0CPOL0CPHA0和 Mode 3CPOL1CPHA1我一般用 Mode 0因为这是最通用的配置和大多数 SPI 从机兼容。时钟频率方面MR25H40CDF 最高支持 40MHzSTM32F103 的 SPI1 在 72MHz 主频下分频到 36MHz 没问题但建议初期调试时先用低速比如 4.5MHz 或 9MHz确认读写正常后再往上提。我见过有人一上来就跑 36MHz结果因为 PCB 走线太长、没有阻抗匹配读回来的数据全是乱的还以为是芯片坏了。2.3 电源与 PCB 布局的实操经验电源去耦这块MR25H40CDF 的 VCC 引脚旁边必须放一个 0.1uF 的陶瓷电容紧贴引脚放置另外再并一个 1uF 或 4.7uF 的电容做低频滤波。MRAM 虽然不像 Flash 那样在擦写时有大的电流尖峰但工业环境里电源纹波和瞬态干扰很常见去耦做不好读写误码率会明显上升。PCB 布局上SPI 的四根信号线尽量等长、短而直避免和电机驱动、继电器控制线平行走线。如果实在避不开中间加地线隔离或者用屏蔽线。还有一个容易被忽略的点MRAM 的 CS 信号在上电初始化阶段要保持高电平否则芯片可能误进入某种命令状态。我在原理图设计时会在 CS 线上加一个 10K 上拉电阻MCU 初始化完成后再把对应 GPIO 配置为推挽输出并置高。这个上拉电阻成本几乎为零但能避免很多上电时序带来的玄学问题。3. STM32F103 端 SPI 驱动与 MRAM 读写实现3.1 SPI 外设初始化与 GPIO 配置用 HAL 库配置 SPI1 的流程比较固定但有几个参数需要根据 MRAM 的特性来定。下面是我常用的初始化代码框架基于 STM32CubeMX 生成后稍作调整SPI_HandleTypeDef hspi1; void MX_SPI1_Init(void) { hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; // Mode 0 hspi1.Init.CLKPhase SPI_PHASE_1EDGE; // Mode 0 hspi1.Init.NSS SPI_NSS_SOFT; // 软件片选 hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_16; // 72/164.5MHz hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial 10; if (HAL_SPI_Init(hspi1) ! HAL_OK) { Error_Handler(); } }片选 GPIO 单独配置为推挽输出初始置高#define MRAM_CS_PORT GPIOA #define MRAM_CS_PIN GPIO_PIN_4 void MRAM_CS_Low(void) { HAL_GPIO_WritePin(MRAM_CS_PORT, MRAM_CS_PIN, GPIO_PIN_RESET); } void MRAM_CS_High(void) { HAL_GPIO_WritePin(MRAM_CS_PORT, MRAM_CS_PIN, GPIO_PIN_SET); }这里波特率预分频先设 16对应 4.5MHz调试通了再改成 4 或 2。注意 HAL 库的 SPI 传输函数在每次调用时会自动控制 NSS 吗不会软件片选模式下 NSS 由用户自己控制所以每次读写前手动拉低 CS读写完成后拉高这个顺序不能乱。3.2 MR25H40CDF 的命令集与读写时序MR25H40CDF 的命令集很精简常用的就几条命令名称命令码功能说明WREN0x06写使能写操作前必须发送WRDI0x04写禁止RDSR0x05读状态寄存器WRSR0x01写状态寄存器READ0x03读数据WRITE0x02写数据读操作的时序是拉低 CS - 发送 0x03 - 发送 24 位地址高字节在前- 连续读取数据 - 拉高 CS。写操作的时序是拉低 CS - 发送 0x06WREN- 拉高 CS - 拉低 CS - 发送 0x02 - 发送 24 位地址 - 发送数据 - 拉高 CS。注意 WREN 和 WRITE 之间必须有一次 CS 的上升沿这是很多新手容易漏掉的细节。我一开始写驱动时把 WREN 和 WRITE 放在同一个 CS 低电平周期里结果怎么都写不进去后来翻数据手册才发现这个要求。状态寄存器的 bit0 是 WIPWrite In ProgressMRAM 的写入几乎没有延迟但为了代码的健壮性写完关键数据后还是可以读一下状态寄存器确认 WIP 为 0。不过实测下来MRAM 的写入完成时间在纳秒级连续写也不会出现忙等待这点比 Flash 舒服太多。3.3 底层读写函数的完整实现基于 HAL 库的读写函数可以这样写void MRAM_WriteEnable(void) { uint8_t cmd 0x06; MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); MRAM_CS_High(); } void MRAM_Write(uint32_t addr, uint8_t *pData, uint16_t len) { uint8_t cmd 0x02; uint8_t addrBuf[3]; addrBuf[0] (addr 16) 0xFF; addrBuf[1] (addr 8) 0xFF; addrBuf[2] addr 0xFF; MRAM_WriteEnable(); MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Transmit(hspi1, addrBuf, 3, 100); HAL_SPI_Transmit(hspi1, pData, len, 1000); MRAM_CS_High(); } void MRAM_Read(uint32_t addr, uint8_t *pData, uint16_t len) { uint8_t cmd 0x03; uint8_t addrBuf[3]; addrBuf[0] (addr 16) 0xFF; addrBuf[1] (addr 8) 0xFF; addrBuf[2] addr 0xFF; MRAM_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Transmit(hspi1, addrBuf, 3, 100); HAL_SPI_Receive(hspi1, pData, len, 1000); MRAM_CS_High(); }这段代码里HAL_SPI_Transmit和HAL_SPI_Receive的超时参数我设得比较宽松实际在 4.5MHz 下传输 512 字节也就 1ms 左右。注意 HAL_SPI_Receive 在接收时会发送 dummy 数据通常是 0xFF来产生时钟这是 SPI 全双工的特性决定的MRAM 会忽略这些 dummy 字节不用担心。4. 数据存储架构与工业场景落地4.1 存储区域划分与数据结构设计512KB 的 MRAM 如果只是当一个大数组用那就太浪费了。我一般会做一个简单的分区管理把物理地址映射成逻辑区域。比如0x00000 - 0x0FFFF64KB系统参数区存设备 ID、校准系数、通信参数、版本号等。这些数据不常变但必须可靠。0x10000 - 0x6FFFF384KB循环日志区存工况记录、事件日志。用环形缓冲区的方式管理写满后从头覆盖。0x70000 - 0x7FFFF64KB故障快照区存最近若干次故障发生前后的关键数据用于事后分析。每个区域前面可以加一个简单的头部结构包含魔数、长度、CRC 校验值。读取时先校验魔数和 CRC确认数据有效再使用。这种设计在工业现场特别重要因为电磁干扰可能导致个别位翻转有了 CRC 就能及时发现并丢弃坏数据。4.2 高频写入场景下的性能实测我拿这套方案做过一个实测STM32F103RC 以 4.5MHz SPI 时钟每次写入 64 字节的工况数据包含 3 个浮点电流值、3 个浮点电压值、1 个时间戳和 1 个 CRC。连续写入 10 万次总耗时约 18 秒平均每次写入 180 微秒。这个速度对于 100ms 周期的采集任务来说绰绰有余CPU 占用率不到 1%。如果把 SPI 时钟提到 18MHz单次写入时间可以降到 50 微秒以内。但要注意提高 SPI 时钟后PCB 走线和 MRAM 的时序余量会变紧建议用示波器看一下 SCK 和 MOSI 的波形确认上升沿没有明显过冲和振铃。我在一版四层板上跑 18MHz 很稳但在另一版两层板上跑 18MHz 就偶尔出错降到 9MHz 后问题消失。所以速度不是越高越好稳定才是第一位的。4.3 掉电保护与数据完整性策略MRAM 的最大优势就是掉电不丢数据但“不丢”的前提是数据已经写进去了。如果掉电发生在 SPI 传输过程中MRAM 内部可能只写入了部分字节。虽然 MRAM 的写入是原子性的每个字节的写入不会被打断但一次多字节传输可能只完成了一部分。所以对于关键数据我采用“双备份加 CRC”的策略在参数区存两份相同的数据每份都带 CRC读取时如果第一份 CRC 校验失败就自动切换到第二份。写入时先写第一份再写第二份确保任何时候至少有一份是完整的。另外STM32F103 的掉电检测可以用 PVD可编程电压检测器来实现。当电源电压降到 2.9V 左右时触发中断在中断里把关键状态快速写入 MRAM。因为 MRAM 写入不需要擦除、没有延迟从检测到掉电到完成写入通常只需要几百微秒配合一个 100uF 的储能电容足够完成最后一次数据保存。5. 调试过程中踩过的坑与排查技巧5.1 SPI 通信失败的常见原因速查现象可能原因排查方法读回全 0xFFMISO 未连接或 CS 未拉低检查接线用逻辑分析仪看 CS 波形读回全 0x00MOSI 未连接或时钟未输出检查 SCK 是否有波形数据偶尔错误SPI 时钟太快或走线干扰降低时钟检查 PCB 布局写入后读回不变WREN 未发送或 CS 时序错误确认 WREN 和 WRITE 之间有 CS 上升沿上电后无法读写CS 上电期间被拉低检查 CS 上拉电阻和 GPIO 初始化顺序这个表里的每一行都是我实际遇到过的。特别是“写入后读回不变”这一条当时查了整整一个下午最后用逻辑分析仪抓波形才发现 WREN 和 WRITE 之间没有 CS 上升沿。数据手册上写得很清楚但第一遍看的时候确实容易忽略。5.2 逻辑分析仪与示波器的实战用法调试 SPI 设备逻辑分析仪是必备工具。我用的是一款 8 通道、24MHz 采样率的入门款抓 SPI 波形完全够用。抓波形时重点看几个点CS 拉低到第一个 SCK 上升沿之间的时间是否满足建立时间要求MR25H40CDF 要求至少 5ns一般都能满足SCK 的占空比是否接近 50%MOSI 和 MISO 的数据在 SCK 边沿是否稳定。如果发现数据在 SCK 边沿附近跳变说明时序余量不够需要降低时钟或调整 PCB 走线。示波器则用来测电源纹波和信号完整性。把探头打到 MRAM 的 VCC 引脚上用 AC 耦合看纹波正常应该在 20mV 以内。如果纹波超过 50mV就要检查去耦电容是否够、电源走线是否太细。我遇到过一版板子MRAM 的 VCC 走线只有 8mil而且离稳压芯片很远纹波高达 80mV导致读写误码率明显上升。后来加粗走线、就近加去耦电容后问题解决。5.3 长时间运行的数据可靠性验证工业设备讲究的是长期稳定所以我在实验室里做过一个 72 小时的老化测试STM32F103RC 每 10ms 向 MRAM 写入一组数据同时每 1 秒读回校验一次记录错误次数。72 小时下来总共写入约 2592 万次读取校验 25.9 万次错误次数为 0。这个结果让我对 MRAM 的可靠性有了比较强的信心。不过测试中也发现一个现象如果电源电压低于 2.7VMRAM 的读写会变得不稳定偶尔出现错误。所以电源监控电路不能省尤其是在电池供电或电源波动较大的场景。我在最终产品里加了一颗电压监控芯片当电压低于 2.9V 时直接拉低 MCU 复位避免 MRAM 在低压下工作。6. 方案扩展与个人实操体会这套 MRAM 加 STM32F103 的方案除了基本的存储读取还能玩出一些花样。比如你可以把 MRAM 当成一个“非易失的环形缓冲区”用两个指针写指针和读指针来管理日志写指针永远向前读指针按需读取不需要擦除操作逻辑比 Flash 简单很多。再比如你可以把 MRAM 的一部分空间映射成“参数快照区”每次系统参数修改时先写快照再更新主参数实现类似数据库事务的回滚能力。我个人在实际操作中的体会是MRAM 最大的价值不在于速度快而在于它把“存储”这件事变得像访问内存一样简单。你不需要考虑擦除、不需要考虑寿命、不需要考虑掉电时序写就完了。这种简单性在工业嵌入式项目里非常宝贵因为现场环境复杂任何额外的复杂性都可能变成故障点。当然MRAM 的价格比 Flash 和 EEPROM 高但在那些“数据丢了就是事故”的场景里这个成本差异完全可以接受。最后分享一个小技巧如果你手头没有 MR25H40CDF也可以用其他 SPI MRAM 或 FRAM 芯片来验证驱动逻辑命令集大同小异改一下命令码和地址长度就能跑。等硬件到位了再切回来能省不少等待时间。

相关新闻

信息化项目前期方案:四张图理清业务、系统、网络与数据

信息化项目前期方案:四张图理清业务、系统、网络与数据

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

2026/10/5 9:54:40 阅读更多 →
告别手动编辑crontab:minicron自动生成与同步crontab的完整实现揭秘

告别手动编辑crontab:minicron自动生成与同步crontab的完整实现揭秘

告别手动编辑crontab:minicron自动生成与同步crontab的完整实现揭秘 【免费下载链接】minicron 🕰️ Monitor your cron jobs 项目地址: https://gitcode.com/gh_mirrors/mi/minicron minicron 是一款开源的定时任务监控工具,它能帮你…

2026/10/5 9:54:40 阅读更多 →
RK3576开发踩坑实录:启动故障、RKNN部署与MIPI显示排查

RK3576开发踩坑实录:启动故障、RKNN部署与MIPI显示排查

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

2026/10/5 9:54:40 阅读更多 →

最新新闻

从零构建 coding agent CLI:TUI、Agent Loop 与 LLM 函数调用实战

从零构建 coding agent CLI:TUI、Agent Loop 与 LLM 函数调用实战

1. 从“pi”这个标题说起:一个极简命名背后的技术野心第一次看到“pi”这个项目标题,很多人会本能地联想到数学常数,或者树莓派(Raspberry Pi),再或者某个缩写。但如果你最近在开发者社区里泡过&#xff0c…

2026/10/5 11:16:56 阅读更多 →
ZYNQ EMIO调试UART完整指南:从引脚规划到串口实测

ZYNQ EMIO调试UART完整指南:从引脚规划到串口实测

ZYNQ 开发里有两件事几乎绕不开:一件是调试,一件是串口。做调试离不开 UART,做 UART 调试又绕不开 MIO 和 EMIO 的选择。我最早做 ZYNQ 的时候,习惯直接用 PS 端 MIO 接出来的 UART0,板子一上电就能在串口终端里看到 B…

2026/10/5 11:16:56 阅读更多 →
跨学科仿生设计:AI代理模型与多尺度仿真融合的数据驱动优化框架

跨学科仿生设计:AI代理模型与多尺度仿真融合的数据驱动优化框架

简介:这是一份聚焦跨学科融合仿生设计的系统性技术文档,面向机器人、新材料与AI交叉领域的研究者、工程师及高年级学生,系统讲解如何将机器学习、深度学习、材料基因组、多尺度建模与拓扑优化等方法整合到仿生设计全流程中。文档共593页&…

2026/10/5 11:16:56 阅读更多 →
智慧工厂AI安防平台设计:从架构到落地全流程指南

智慧工厂AI安防平台设计:从架构到落地全流程指南

简介:《AI赋能的智慧工厂安防平台建设方案》演示文稿是一份面向智慧工厂安防规划与智能制造升级的方案型资源,适合安防系统集成商、工厂信息化人员及管理者参考,可用于解决传统工厂安防管理分散、响应滞后、智能化程度不足等问题。内容围绕综…

2026/10/5 11:16:56 阅读更多 →
K8s服务发现与网络策略:读懂原理到实战避坑指南

K8s服务发现与网络策略:读懂原理到实战避坑指南

1. 前言:为什么服务发现和网络策略是K8s运维的两道必答题无论你是刚把第一个Pod跑起来,还是已经在生产环境里折腾了大半年,Kubernetes的服务发现和网络策略一定都绕不开。简单说,服务发现解决的是“流量到底该打到哪个Pod上”的问…

2026/10/5 11:16:56 阅读更多 →
Superpowers工作流:AI原生开发的认知增强层实战指南

Superpowers工作流:AI原生开发的认知增强层实战指南

1. 项目概述:Superpowers 不是超能力,而是开发者工具链的“认知增强层”你搜“superpowers”时看到的满屏 Claude Code、Antigravity、Codex CLI、Cursor,不是漫威电影彩蛋,也不是某个神秘组织的代号——这是2024年中后期&#xf…

2026/10/5 11:15:55 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

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/5 5:06:42 阅读更多 →
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/5 1:10:22 阅读更多 →
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/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →