MRAM与PIC18F4525工业存储方案:掉电保护与高频写入实践
1. 项目缘起与方案选型思考工业现场的数据存储有个很尴尬的处境用 EEPROM 吧写入速度慢、擦写寿命也就百万次级别高频采集场景下没几个月就写废了用 SRAM 加后备电池吧电池在高温高湿的车间里撑不了几年换电池还得停机用 NOR Flash 吧写之前要擦除整个扇区掉电瞬间还可能丢数据。我前两年做一个电力监测终端的时候就卡在这个点上采集节点每 200ms 要落一次带时间戳的采样记录掉电不能丢现场温度夏天能到 70 度最后选来选去落到了 MRAM 上。这次要聊的这套组合就是MR25H40CDF 这颗 4Mbit 的 SPI MRAM配PIC18F4525 这颗 8 位 PIC 单片机在工业和嵌入式场景里做数据存储与读取。MR25H40CDF 是 Everspin 家的磁阻随机存取存储器容量 512KBSPI 接口最关键的一点是它写入不需要擦除、没有写延迟、掉电即保存擦写寿命标称 10^14 次以上这个量级基本等于你随便写。PIC18F4525 则是 Microchip 经典的 8 位机40MHz 主频自带 MSSP 模块可以跑硬件 SPI3.3V 和 5V 都能工作工业温度范围版本满地都是成本也压得住。为什么不用 STM32 或者更高级的 MCU因为很多工业板子上的主控早就定型了PIC18 系列在存量设备里占比极大你不可能为了换一颗存储芯片把整个主控方案推翻。所以这套组合的真实价值在于在不动主控架构的前提下把易失性存储或者短命存储替换成 MRAM用最小的改动拿到掉电不丢、无限擦写的能力。适合谁看做工业采集终端、电表水表、医疗设备日志、车载黑匣子这类需要高频写入又怕掉电丢数据的嵌入式工程师尤其是还在用 8 位机或者 PIC 平台的朋友。我下面会从硬件连接、SPI 时序配置、读写驱动、掉电保护策略、常见坑这几个维度把整套东西拆开讲代码基于 MCC 生成的框架改但逻辑是通用的你换成寄存器操作或者别的编译器也能照搬。2. MR25H40CDF 与 PIC18F4525 的硬件连接与关键参数2.1 芯片引脚与供电的取舍MR25H40CDF 是 8 脚 SOIC 封装引脚定义很干净VDD、VSS、SCK、SI、SO、CS、WP、HOLD。这里有两个容易被忽略的点。第一WP 和 HOLD 引脚不能悬空很多新手直接不接结果发现写保护随机生效或者通信偶尔卡死。WP 是写保护低电平有效你要正常读写就把它拉到 VDDHOLD 是暂停通信低电平有效不用就拉到 VDD。我一般两个都通过 10K 上拉到 3.3V稳妥。第二是供电电压。MR25H40CDF 的工作电压是 2.7V 到 3.6V典型 3.3V。而 PIC18F4525 如果你用 5V 供电SPI 引脚输出高电平接近 5V直接怼到 MRAM 的输入脚上会超规格。所以要么整个系统统一 3.3V要么在 SPI 线上做电平转换。我实测过PIC18F4525 在 3.3V、40MHz 晶振下跑 SPI 完全没问题所以最省事的方案就是全系统 3.3V省掉电平转换芯片。引脚方向连接方式说明VDD电源3.3V并联 0.1uF 去耦电容尽量靠近芯片VSS地GND与主控共地SCK输入PIC RC3/SCK硬件 SPI 时钟SI输入PIC RC5/SDI主出从入SO输出PIC RC4/SDO主入从出CS输入PIC RA5 或任意 IO软件片选低有效WP输入10K 上拉到 3.3V不写保护就拉高HOLD输入10K 上拉到 3.3V不暂停就拉高2.2 片选为什么建议用软件控制PIC18F4525 的 MSSP 模块在硬件 SPI 模式下SS 引脚的行为有时候会跟你预期不一致尤其是多从机场景。MRAM 只有一个从机理论上可以用硬件片选但我强烈建议用普通 IO 做软件片选原因有三个一是你可以精确控制 CS 拉低到第一个时钟沿之间的建立时间MRAM 要求 CS 下降沿到 SCK 第一个上升沿至少有几纳秒的余量软件控制更从容二是调试的时候你可以手动拉 CS 观察波形排查问题方便三是以后要挂第二颗 SPI 器件软件片选直接扩展不用改硬件。代码上就是操作一个 IO 口#define MRAM_CS_LAT LATA5 #define MRAM_CS_TRIS TRISA5 void MRAM_CS_Select(void) { MRAM_CS_LAT 0; // 拉低选中 } void MRAM_CS_Release(void) { MRAM_CS_LAT 1; // 拉高释放 }2.3 SPI 模式与时钟极性的匹配这是最容易翻车的地方。MR25H40CDF 支持 SPI Mode 0 和 Mode 3也就是 CPOL0/CPHA0 或者 CPOL1/CPHA1。PIC18F4525 的 SSPCON 寄存器里 CKP 位控制时钟极性SSPSTAT 里的 CKE 位控制采样沿。要配成 Mode 0就是 CKP0、CKE1在时钟上升沿采样空闲低电平。我一般用 Mode 0因为大部分逻辑分析仪默认就是按这个解析的调试直观。配置代码大致是这样void SPI_Init(void) { TRISC3 0; // SCK 输出 TRISC5 0; // SDO 输出 TRISC4 1; // SDI 输入 SSPCON1 0x20; // SSPEN1, CKP0, SPI Master, Fosc/4 SSPSTAT 0x40; // CKE1, 数据在上升沿采样 // 40MHz/4 10MHz SPI 时钟 }这里有个细节PIC18F4525 在 40MHz 下 Fosc/4 是 10MHzMR25H40CDF 最高支持 40MHz SPI 时钟所以 10MHz 完全在范围内而且 8 位机的 IO 翻转速度也就这样跑太快反而容易出时序问题。我实测 10MHz 下连续读写 512KB 大概几百毫秒对工业采集来说够用了。3. MRAM 读写驱动的核心实现3.1 指令集与地址结构MR25H40CDF 的指令集很精简常用的就几条WREN0x06写使能、WRDI0x04写禁止、READ0x03读数据、WRITE0x02写数据、RDSR0x05读状态寄存器、WRSR0x01写状态寄存器。地址是 24 位因为 512KB 需要 19 位地址但芯片统一用 3 字节地址格式高位补零。这里要划重点每次写操作之前必须先发 WREN 指令否则写不进去。这是 MRAM 和 EEPROM 类似的地方但 MRAM 不需要等待写完成发完 WRITE 指令数据就落盘了没有 busy 轮询这一说。很多人从 EEPROM 迁移过来习惯性地去读状态寄存器等 WIP 位结果发现 WIP 永远是 0白等。3.2 单字节与页写操作的实现先看写使能和单字节写的底层函数void MRAM_WriteEnable(void) { MRAM_CS_Select(); SPI_Transfer(0x06); // WREN MRAM_CS_Release(); } void MRAM_WriteByte(uint32_t addr, uint8_t data) { MRAM_WriteEnable(); MRAM_CS_Select(); SPI_Transfer(0x02); // WRITE SPI_Transfer((addr 16) 0xFF); SPI_Transfer((addr 8) 0xFF); SPI_Transfer(addr 0xFF); SPI_Transfer(data); MRAM_CS_Release(); }读操作更简单不需要写使能uint8_t MRAM_ReadByte(uint32_t addr) { uint8_t data; MRAM_CS_Select(); SPI_Transfer(0x03); // READ SPI_Transfer((addr 16) 0xFF); SPI_Transfer((addr 8) 0xFF); SPI_Transfer(addr 0xFF); data SPI_Transfer(0x00); // 发送哑字节读回数据 MRAM_CS_Release(); return data; }SPI_Transfer 是个收发一体的函数PIC18 的 SSPBUF 写进去之后读 SSPBUF 就是同时收到的数据uint8_t SPI_Transfer(uint8_t txData) { SSPBUF txData; while (!SSPIF); // 等待传输完成 SSPIF 0; return SSPBUF; }3.3 连续读写与效率优化单字节读写虽然能用但每次都要发指令加 3 字节地址开销太大。MRAM 支持连续读和连续写地址会自动递增所以批量操作时只发一次指令和地址后面连续搬运数据就行。我封装了一个页写函数一次最多写 256 字节其实 MRAM 没有页边界限制你愿意一次写满 512KB 也行但缓冲区一般没这么大void MRAM_WritePage(uint32_t addr, uint8_t *buf, uint16_t len) { MRAM_WriteEnable(); MRAM_CS_Select(); SPI_Transfer(0x02); SPI_Transfer((addr 16) 0xFF); SPI_Transfer((addr 8) 0xFF); SPI_Transfer(addr 0xFF); for (uint16_t i 0; i len; i) { SPI_Transfer(buf[i]); } MRAM_CS_Release(); }读也是同理连续读的时候地址自动加不用重复发指令。实测下来连续读 512KB 比逐字节读快了将近 4 倍因为省掉了每次的指令和地址开销。注意连续写的时候如果地址跨越了 512KB 的边界会回卷到 0 地址继续写。这个行为在环形缓冲区场景下反而很有用但如果你不想回卷得自己在软件里判断。3.4 状态寄存器与写保护配置状态寄存器里主要关注 BP0、BP1 这两位它们控制块保护。默认出厂是全 0也就是不保护任何区域。如果你要做固件参数区保护可以把某一块设成只读。WRSR 指令写状态寄存器之前也要先 WREN。我一般不动这个寄存器因为工业场景下参数区也是要频繁更新的保护了反而麻烦真要保护就在软件层做校验。4. 掉电保护与数据完整性策略4.1 为什么 MRAM 天然适合掉电保护MRAM 的存储原理是磁性隧道结数据以磁化方向保存写入完成的瞬间数据就已经是非易失的不需要像 Flash 那样等内部电荷泵把电荷注入浮栅。这意味着什么意味着你在 WRITE 指令最后一个字节的时钟沿结束、CS 拉高的那一刻数据就已经安全了。哪怕下一个微秒系统掉电数据也不会丢。这个特性直接改变了掉电保护的设计思路。用 EEPROM 的时候你得在掉电中断里抢时间把缓存数据写进去还要等写完成电源保持电容得算得很大。用 MRAM你只要保证掉电前数据已经通过 SPI 发出去了就行电源保持时间只需要覆盖最后一帧 SPI 传输通常几十微秒的电容就够了。4.2 环形缓冲区加双区备份的落地我在电力监测项目里用的是环形缓冲区加双区备份的方案。512KB 空间切成两块 256KB一块是主数据区一块是备份区每块内部做成环形缓冲。每条记录带一个 4 字节的序号和 2 字节的 CRC16。写入的时候先写主区再写备份区读的时候两边都读CRC 对得上且序号大的那个为准。序号的作用是判断哪条记录最新。因为 MRAM 写入是原子的不会出现写一半的情况所以只要 CRC 通过这条记录就是完整的。双区备份主要是防极端情况比如 SPI 通信过程中被强干扰打断导致主区某条记录异常备份区还能兜底。typedef struct { uint32_t seq; uint8_t payload[26]; uint16_t crc; } Record_t; // 32 字节一条对齐方便每条记录 32 字节256KB 能存 8192 条按 200ms 一条算能存将近 27 分钟。实际项目里我会根据需求调整记录大小和分区比例如果只要存关键事件记录可以做到 8 字节那就能存几小时。4.3 写入指针的持久化环形缓冲区有个经典问题写指针存在哪如果写指针只存在 RAM 里掉电就丢了重启后不知道从哪继续写。我的做法是在 MRAM 的固定位置存一个元数据块里面包含当前写指针、总写入条数、最后一条记录的序号。每次写记录之前先更新元数据再写数据。因为 MRAM 写入快且无磨损这个额外开销可以忽略。元数据块我也做了双份地址 0x000000 和 0x000020 各一份读的时候取 CRC 正确的那份。这样即使元数据块在写入过程中被干扰还有另一份可用。实操心得元数据更新和数据写入之间如果掉电会出现元数据指向的位置还没有数据的情况。我的处理是读的时候检查该位置记录的序号如果序号是初始值比如 0xFFFFFFFF就认为这条还没写自动回退到上一条。这个逻辑一定要加否则重启后会读到脏数据。5. 实操调试与常见问题排查5.1 上电后读不到数据的排查顺序第一次点亮这套组合的时候十有八九会遇到读出来全是 0xFF 或者 0x00。别慌按这个顺序查第一量 CS 引脚。用示波器或者逻辑分析仪看 CS 在通信时有没有正确拉低。我遇到过 CS 被其他外设复用导致一直拉低的情况MRAM 一直处于选中状态通信全乱。第二看 SCK 有没有波形。PIC18 的 MSSP 如果配置错了SCK 可能根本不输出。检查 SSPCON1 的 SSPEN 位有没有置 1TRISC3 有没有设成输出。第三确认 SPI 模式。用逻辑分析仪抓一帧读指令看数据是在上升沿还是下降沿变化。如果模式配错读出来的数据会整体移位比如你发 0x03 读指令从机收到的可能是 0x06 写使能那就完全跑偏了。第四检查 WP 和 HOLD。这两个脚如果被拉低写操作会被忽略或者通信被暂停。用万用表量一下电压正常应该是 3.3V。5.2 SPI 时序问题的典型表现与解决现象可能原因解决方法读数据整体移位一位CPHA 配置错误调整 SSPSTAT 的 CKE 位偶发读写失败CS 建立/保持时间不足在 CS 操作前后加 NOP 延时高速下数据出错SCK 太快超过从机规格降低 SPI 时钟分频写入后读回不变忘记发 WREN每次写前加写使能数据随机翻转电源去耦不足VDD 就近加 0.1uF 电容我踩过最坑的一次是 CS 建立时间不够。PIC18 在 40MHz 下指令周期 100nsCS 拉低后紧接着就操作 SSPBUF结果第一个时钟沿来得太快MRAM 还没准备好。后来在 CS 拉低后加了两条 NOP问题消失。这个延时不用很长几百纳秒就够但必须有。5.3 长时间运行的稳定性验证工业设备不能只看实验室跑通得做长时间验证。我的做法是写一个自检程序上电后对整个 MRAM 做一次全空间读写校验然后进入正常采集循环每写 1000 条记录做一次随机地址回读比对。连续跑 72 小时记录任何一次校验失败。实测下来在 10MHz SPI、3.3V 供电、室温环境下72 小时零错误。高温箱里 70 度跑 24 小时也稳定。唯一一次出问题是因为电源纹波太大换了 LDO 之后解决。所以如果你要做工业级产品电源质量比芯片本身更值得关注。注意MRAM 虽然擦写寿命极长但 SPI 通信本身在强电磁干扰下可能出错。我在软件里加了 CRC 校验和重试机制一条记录写失败就重写最多重试 3 次超过就标记该条为坏记录并跳过。这个机制在实际现场救过好几次。6. 从 EEPROM 或 Flash 迁移过来的注意事项如果你手头有现成的 EEPROM 或 Flash 代码想迁移到 MRAM有几个地方必须改。首先是去掉写等待循环EEPROM 写完要等 5ms 左右Flash 要等扇区擦除MRAM 不需要你如果保留等待逻辑性能白白损失。其次是去掉擦除操作MRAM 没有擦除指令你发擦除指令它不认直接忽略。第三是地址对齐要求不同EEPROM 和 Flash 往往有页对齐限制MRAM 任意地址都能写你的缓冲区管理可以更灵活。还有一点是写使能的时机。有些 EEPROM 驱动在初始化时发一次 WREN 就一直有效但 MRAM 的 WREN 在每次 WRITE 之后会自动复位所以每次写之前都要重新发。这个如果漏了表现就是只有第一条能写进去后面全失败很容易误判成芯片坏了。迁移完之后建议做一次全空间遍历测试写一个已知模式比如地址异或 0x5A然后全读回来比对确认每一字节都对。这个测试能一次性暴露地址计算错误、边界回卷问题、时序余量不足等一堆隐患。7. 性能实测数据与场景适配建议我在 40MHz PIC18F4525、10MHz SPI 条件下做了几组实测数据如下操作耗时说明单字节写约 8us含 WREN 和地址开销单字节读约 5us含地址开销256 字节连续写约 220us平均 0.86us/字节256 字节连续读约 210us平均 0.82us/字节512KB 全片读约 430ms连续读模式512KB 全片写约 450ms连续写模式从数据能看出来连续操作的效率比单字节高一个数量级所以实际项目里一定要用缓冲区批量搬运别一条一条写。按 256 字节一批算写 8192 条 32 字节的记录如果每条单独写要 65ms 左右批量写只要 7ms 左右差了将近 10 倍。场景适配方面如果你的采集频率在 100Hz 以内单字节写完全够用如果到 1kHz 以上必须用 DMA 或者至少用缓冲区攒批。PIC18F4525 没有 DMA那就用定时器中断攒数据攒够一批在后台循环里写。我一般攒 64 条写一次兼顾实时性和效率。这套方案我后来还复制到了水表抄表终端和医疗输液泵的日志模块上改动量很小主要是记录结构体不一样。MRAM 的价格比同容量 FRAM 便宜不少比带电池的 SRAM 方案在长期维护成本上优势明显尤其是那些装在现场好几年不换电池的设备省掉电池就省掉了一大块售后。

相关新闻

form-create-designer的JSON规则揭秘:一份数据结构如何生成完整动态表单

form-create-designer的JSON规则揭秘:一份数据结构如何生成完整动态表单

form-create-designer的JSON规则揭秘:一份数据结构如何生成完整动态表单 【免费下载链接】FcDesigner 好用的Vue低代码可视化 AI 表单设计器,可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率。支持PC端和移动端,目前在…

2026/10/4 13:46:00 阅读更多 →
工业嵌入式存储选型:MR25H40CDF MRAM与STM32F334R8驱动实战

工业嵌入式存储选型:MR25H40CDF MRAM与STM32F334R8驱动实战

1. 为什么在工业现场我会优先考虑 MR25H40CDF 而不是传统 EEPROM做嵌入式硬件选型这些年,我越来越怕听到"用 EEPROM 存参数就行"这句话。EEPROM 便宜、好买、资料多,但它在工业场景里的短板非常致命:写入速度慢、擦写寿命有限、掉电…

2026/10/4 13:46:00 阅读更多 →
业务系统微服务化改造方案:从单体泥潭到微服务架构的完整推演

业务系统微服务化改造方案:从单体泥潭到微服务架构的完整推演

简介:这份《业务系统的微服务化改造方案》面向企业架构师、后端开发与运维人员,聚焦传统单体应用向微服务转型中的技术选型、架构设计与落地实施难题。文档从技术选型决策切入,对比Spring Cloud、Dubbo等框架及服务治理模型,再展开…

2026/10/4 13:45:00 阅读更多 →

最新新闻

写罪犯心理矫正论文,别让 AI 替你“拍脑袋”:一份按环节挑工具的实用清单 [特殊字符]

写罪犯心理矫正论文,别让 AI 替你“拍脑袋”:一份按环节挑工具的实用清单 [特殊字符]

如果你读的是公安与司法大类 / 司法技术类 / 罪犯心理测量与矫正技术,大概率会遇到一类很典型的毕业任务: 围绕监所中的某类心理问题,完成一份“心理测评 矫正方案设计”论文。 例如:《短刑犯焦虑情绪测评及认知行为团体矫正方案…

2026/10/4 15:16:56 阅读更多 →
大语言模型学习之大模型技术基础和GPT、DeepSeek模型介绍:用TaoToken统一Key跑通三类模型调用

大语言模型学习之大模型技术基础和GPT、DeepSeek模型介绍:用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 15:16:55 阅读更多 →
【MLLM Agent】多模态理解Agent研究进展

【MLLM Agent】多模态理解Agent研究进展

note 方案选型: 做图片输入 function call 通用多模态 Agent → 优先看DeepSeek‑Harness MTA‑Agent;做图片多轮检索求证 → DR‑MMSearchAgent;做长文档图文问答 → MDocAgent;做成本优化、工具调用节流 → ToolGate&#xf…

2026/10/4 15:16:55 阅读更多 →
MR25H40CDF+STM32F302R8工业级非易失数据存储方案

MR25H40CDF+STM32F302R8工业级非易失数据存储方案

1. 项目概述:为什么选 MR25H40CDF STM32F302R8 这对组合做工业级数据存储?在工业现场和嵌入式设备里,数据存储从来不是“随便找个 Flash 芯片焊上去”就能了事的事。我做过十几个带数据记录功能的产线控制器、边缘采集盒和智能传感器节点&am…

2026/10/4 15:16:55 阅读更多 →
渲染管线与Shader实战:从漫反射到Blinn-Phong

渲染管线与Shader实战:从漫反射到Blinn-Phong

我最早接触“着色”这个概念的时候,完全是一头雾水。那时候拿到一个图形学作业,想给一个模型加个高光,翻来覆去调了半天材质参数,结果渲染出来该黑的地方还是黑,镜面反射亮得像是打了荧光。后来才明白,问题…

2026/10/4 15:16:55 阅读更多 →
ESP32-P4+C5双芯驱动:不堆模块,这块屏自己就是网关

ESP32-P4+C5双芯驱动:不堆模块,这块屏自己就是网关

1. 这块屏凭什么敢叫自己网关第一次看到“ESP32-P4ESP32-C5双芯驱动,不用堆模块,这块屏自己就是网关”这个说法,我脑子里蹦出来的第一个念头是:又来了,又是一个把“带Wi-Fi的屏幕”包装成“网关”的营销话术。毕竟这些…

2026/10/4 15:15:55 阅读更多 →

日新闻

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/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/3 9:42:36 阅读更多 →