工业级MRAM与8位单片机SPI存储方案实战
1. 项目缘起与方案选型思路1.1 为什么要在工业场景里折腾 MRAM 和 8 位单片机工业现场的数据记录有个很尴尬的处境用 EEPROM 吧写入速度慢得让人抓狂擦写寿命也就百万次级别高频记录的场景下没几个月就写废了用 SRAM 加后备电池吧电池在高温高湿环境下三五年就鼓包漏液维护成本高得离谱用 Flash 吧擦除粒度大、写入前得整块擦掉电瞬间还容易丢数据。我前几年做一个电力监测终端项目现场环境温度夏天能到 70 度客户要求每秒记录一次关键参数掉电不能丢这个需求直接把 EEPROM 和 SRAM电池方案都否掉了。后来接触到MRAM磁阻随机存取存储器才算是找到了对症的药。MRAM 的存储原理是靠磁性隧道结的磁化方向来记录 0 和 1不是靠电荷所以它天生具备几个工业场景特别看重的特性写入速度是纳秒级、擦写寿命几乎无限10^14 次以上、掉电数据不丢、宽温范围稳定。这次项目用的MR25H40CDF就是一颗 4Mbit 的 SPI 接口 MRAM容量 512KBSPI 接口最高 40MHz工作温度覆盖 -40 到 85 度工业级标准。主控这边选的是PIC18F85K90Microchip 的 8 位增强型单片机。有人可能会问都什么年代了还用 8 位机我的理由很实在这个项目逻辑不复杂主要是采集、存储、通信三件事8 位机完全够用PIC18F85K90 自带 24 通道 12 位 ADC、4 个 UART、3 个 SPI 模块外设资源丰富而且它的 XLP 超低功耗特性在电池备份场景下很关键。更重要的是PIC 系列在工业领域用了十几年供货稳定、工具链成熟不像某些新片子动不动就缺货涨价。这个组合的核心价值在于用最简单的架构实现最可靠的数据存储。MR25H40CDF 负责非易失存储PIC18F85K90 负责逻辑控制和数据处理两者通过 SPI 总线通信。整个方案没有文件系统、没有复杂的磨损均衡算法就是直接地址映射读写代码量小、可靠性高、调试直观。适合做工业数据记录仪、智能仪表、设备黑匣子这类需要长期稳定运行的产品。1.2 SPI 接口选型的几个关键考量MR25H40CDF 支持 SPI 和 Quad SPI 两种模式这个项目里我用的是标准 SPI 模式原因有几个。第一PIC18F85K90 的 MSSP 模块原生支持 SPI 主模式硬件层面直接对接不需要额外的 IO 扩展第二标准 SPI 只需要 4 根线SCK、MOSI、MISO、CSPCB 布线简单在工业环境的电磁干扰下线越少出问题的概率越低第三40MHz 的 SPI 时钟在 8 位机上已经很快了Quad SPI 的额外带宽对这个项目来说用不上。SPI 的片选方式我选了硬件片选而不是软件片选。硬件片选就是把 CS 引脚直接接到单片机的一个 IO 口上由硬件拉低拉高来控制。软件片选是用普通 IO 模拟 CS 时序灵活性高但容易出时序问题。工业环境下硬件片选的抗干扰能力和时序确定性都更好尤其是多从机场景下硬件片选能避免总线冲突。注意MR25H40CDF 的 CS 引脚内部有上拉但工业环境下建议外部再加一个 10K 上拉到 VDD防止上电瞬间的浮空导致误触发。1.3 整体架构设计整个系统的数据流是这样的传感器信号经过调理电路进入 PIC18F85K90 的 ADC 通道单片机完成采样和初步处理后通过 SPI 总线把数据写入 MR25H40CDF。读取时反向操作单片机发起 SPI 读命令MRAM 把数据送回。系统还预留了一个 UART 接口用于和上位机通信方便调试和数据导出。存储空间的管理我采用分页索引的方式。MR25H40CDF 的 512KB 空间分成 512 个 1KB 的页每页头部 16 字节作为页头记录页号、时间戳、数据长度和校验和剩余 1008 字节存实际数据。这样设计的好处是写入时按页操作避免跨页写入的复杂性读取时先读页头判断数据有效性再读数据区校验和能及时发现存储错误。2. 硬件设计与关键细节2.1 电路连接与引脚分配MR25H40CDF 是 8 引脚 SOIC 封装引脚定义很清晰VDD、VSS、CS、SCK、MOSI、MISO、WP写保护、HOLD保持。实际使用中 WP 和 HOLD 我都直接上拉到 VDD因为项目里不需要硬件写保护和总线暂停功能软件层面控制就够了。和 PIC18F85K90 的连接是这样的MRAM 的 SCK 接单片机的 SCK1RC3MOSI 接 SDO1RC5MISO 接 SDI1RC4CS 接 RB2。这里有个细节要注意PIC18F85K90 的 MSSP1 模块引脚是复用的配置的时候要把对应的 TRIS 位设对SCK 和 SDO 设输出SDI 设输入CS 设输出。电源部分MR25H40CDF 的工作电压是 2.7V 到 3.6V典型值 3.3V。我在 VDD 和 VSS 之间放了两个电容一个 0.1uF 的陶瓷电容紧贴芯片引脚负责高频去耦一个 10uF 的钽电容放在电源入口负责低频滤波。工业现场电源纹波大这两个电容一个都不能省。实操心得MRAM 芯片对电源质量比 EEPROM 敏感尤其是写入瞬间的电流冲击。我试过只放 0.1uF 电容的情况连续写入时偶尔会出现数据错误加上 10uF 钽电容后问题消失。这个坑我踩过你们就别再踩了。2.2 PCB 布局的注意事项SPI 总线的 PCB 布局有几个硬性要求。SCK 时钟线要尽量短最好不超过 5cm而且要走在地平面旁边减少辐射干扰。MOSI 和 MISO 可以稍微长一点但也要避免和模拟信号线平行走线。CS 线虽然速率不高但它是控制信号走线也要干净避免和电源线交叉。地平面处理上我建议在 MRAM 芯片下方铺一块完整的地铜皮通过多个过孔连接到主地平面。这样做的目的是给高频信号提供最短的回流路径减少电磁辐射。晶振和 MRAM 要远离至少保持 2cm 以上的距离避免时钟谐波干扰。2.3 上电时序与初始化MR25H40CDF 的上电时序要求不严格但有个细节要注意VDD 上升到 2.7V 之前CS 必须保持高电平否则芯片可能进入未定义状态。我在电路上加了 RC 延时电路确保 CS 比 VDD 晚拉低。软件初始化时上电后先延时 10ms等电源稳定后再配置 SPI 模块。PIC18F85K90 的 SPI 初始化步骤是这样的先配置 SSP1CON1 寄存器设置主模式、时钟极性、时钟相位然后配置 SSP1STAT 寄存器设置输入采样相位最后设置 SSP1ADD 寄存器配置时钟频率。MR25H40CDF 支持 SPI 模式 0 和模式 3我用的是模式 0CPOL0CPHA0因为这是最常用的配置兼容性最好。// SPI 初始化代码示例 SSP1STAT 0x40; // 输入采样在数据输出中间 SSP1CON1 0x20; // SPI 主模式时钟 Fosc/4 SSP1ADD 0x01; // 时钟频率 Fosc/(4*(11)) Fosc/8 TRISC3 0; // SCK 输出 TRISC5 0; // SDO 输出 TRISC4 1; // SDI 输入 TRISB2 0; // CS 输出 PORTBbits.RB2 1; // CS 初始高电平3. 软件实现与核心操作3.1 SPI 底层驱动封装SPI 通信的本质就是字节交换主机发一个字节从机同时回一个字节。PIC18F85K90 的 MSSP 模块硬件处理了时序软件只需要往 SSP1BUF 写数据然后等 BF 标志位置位再从 SSP1BUF 读回来就行。我封装了两个基础函数SPI_WriteByte 和 SPI_ReadByte所有上层操作都基于这两个函数。uint8_t SPI_WriteByte(uint8_t data) { SSP1BUF data; while(!PIR1bits.SSP1IF); // 等待传输完成 PIR1bits.SSP1IF 0; return SSP1BUF; } uint8_t SPI_ReadByte(void) { return SPI_WriteByte(0xFF); // 发 dummy 字节读数据 }这里有个细节SPI 是全双工通信读数据的时候必须发一个 dummy 字节通常是 0xFF来产生时钟。很多新手会忘记这一点导致读回来的数据全是 0。我当年第一次用 SPI 的时候就犯过这个错误查了半天时序图才发现问题。3.2 MRAM 读写命令解析MR25H40CDF 的命令集很简洁常用的就四条WREN写使能0x06、WRDI写禁止0x04、READ读数据0x03、WRITE写数据0x02。另外还有 RDSR读状态寄存器0x05和 WRSR写状态寄存器0x01但项目里用得少。写操作的流程是拉低 CS → 发 WREN 命令 → 拉高 CS → 拉低 CS → 发 WRITE 命令 → 发 3 字节地址 → 发数据 → 拉高 CS。注意 WREN 和 WRITE 之间必须拉高 CS这是 MRAM 的协议要求不能连续发。读操作简单一些拉低 CS → 发 READ 命令 → 发 3 字节地址 → 读数据 → 拉高 CS。地址是 24 位的因为 512KB 空间需要 19 位地址2^19 524288用 3 字节表示绰绰有余。地址的高位字节先发这是 SPI 器件的通用规则。void MRAM_WriteEnable(void) { CS_LOW(); SPI_WriteByte(0x06); CS_HIGH(); } void MRAM_Write(uint32_t addr, uint8_t *data, uint16_t len) { MRAM_WriteEnable(); CS_LOW(); SPI_WriteByte(0x02); SPI_WriteByte((addr 16) 0xFF); SPI_WriteByte((addr 8) 0xFF); SPI_WriteByte(addr 0xFF); for(uint16_t i 0; i len; i) { SPI_WriteByte(data[i]); } CS_HIGH(); }3.3 数据存储格式设计前面提到用分页索引的方式管理存储空间这里展开说一下具体实现。每页 1KB页头 16 字节的结构是这样的第 0-1 字节是页号小端格式第 2-5 字节是时间戳Unix 时间戳32 位第 6-7 字节是数据长度第 8-9 字节是数据类型第 10-15 字节保留。页头后面是 1008 字节的数据区最后 2 字节是 CRC16 校验和。写入流程先读当前页头判断是否为空页全 0xFF如果是空页就直接写如果不是空页就跳到下一页。读取流程先读页头校验页号和 CRC通过后再读数据区。这种设计的好处是写入简单、读取快速、错误可检测。注意事项MRAM 虽然写入寿命几乎无限但也不建议频繁写同一地址。我建议在应用层做一层简单的磨损均衡比如轮流使用不同的页避免某个页被写爆。虽然理论上写不坏但实际测试中发现长期高频写同一地址误码率会略微上升。3.4 掉电保护与数据完整性工业场景最怕掉电丢数据。MRAM 本身掉电不丢但写入过程中掉电可能导致数据写了一半。我的解决方案是双页备份写入标志。每次写数据时先写备份页再写主页最后更新写入标志。上电初始化时检查写入标志如果发现上次写入未完成就从备份页恢复数据。具体实现在存储空间最后留 16 字节作为系统区记录当前写入状态。状态 0xAA 表示空闲0x55 表示正在写入。写入前先把状态改成 0x55写完数据后改成 0xAA。上电时如果读到 0x55说明上次写入中断了需要从备份页恢复。这个机制我实测过很多次用可调电源模拟掉电在写入的任意时刻断电上电后数据都能正确恢复。关键是要保证状态标志的写入顺序先写数据再写标志最后写状态。顺序错了保护就失效了。4. 调试过程与问题排查4.1 SPI 通信失败的常见原因调试 SPI 最头疼的就是通信不上现象是读回来的数据全是 0xFF 或者 0x00。我总结了几种常见原因和排查方法。第一是片选问题CS 没有正确拉低或者拉低时间不够用示波器看 CS 波形确保在 SCK 开始前 CS 已经稳定拉低。第二是时钟极性相位配置错误MRAM 支持模式 0 和模式 3如果配置成模式 1 或 2 就读不到数据用逻辑分析仪抓 SCK 和 MOSI 的波形对照数据手册的时序图检查。第三是速率太快虽然 MR25H40CDF 标称支持 40MHz但在 8 位机上跑 40MHz 对 PCB 布线要求很高我建议先用低速比如 1MHz调通再逐步提高。第四是电源问题MRAM 芯片供电不足会导致通信不稳定用万用表量 VDD 引脚确保在 3.3V 左右。4.2 数据写入后读出来不对这个问题我遇到过两次第一次是因为 WREN 命令后没有拉高 CS 就直接发 WRITE 命令MRAM 没有进入写模式数据根本没写进去。第二次是因为地址算错了写入和读取的地址不一致读出来当然是错的。排查方法写完之后立刻读回来对比如果读回来和写进去的不一样先检查地址是否正确再检查 WREN 时序。我建议在写函数里加一个回读校验写完自动读回来比对不一致就报错。这个习惯能帮你省下大量调试时间。4.3 长时间运行后数据出错有个项目现场反馈运行一个月后数据偶尔出错我过去排查发现是电源纹波导致的。工业现场的开关电源纹波比较大MRAM 在写入瞬间对电源波动敏感。解决方案是在 MRAM 的 VDD 引脚旁边再加一个 1uF 的陶瓷电容同时把 SPI 时钟从 20MHz 降到 10MHz降低对电源的瞬时电流需求。另外还有一个容易被忽略的问题SPI 总线上如果挂了多个从机片选信号之间的串扰可能导致误选中。我的做法是每个从机的 CS 线单独走不共用而且 CS 线上加 100 欧姆的串联电阻抑制反射。4.4 常见问题速查表现象可能原因排查方法解决方案读回全 0xFFCS 未拉低或时序错误示波器看 CS 和 SCK检查 CS 控制代码确保拉低后再发命令读回全 0x00MISO 未连接或配置错误万用表量 MISO 通断检查 TRIS 配置确保 SDI 设为输入写入后读回不对WREN 时序错误或地址错误逻辑分析仪抓完整时序确保 WREN 后拉高 CS核对地址计算偶发数据错误电源纹波或时钟太快示波器看 VDD 纹波增加去耦电容降低 SPI 时钟上电后数据丢失上电时序问题示波器看 VDD 和 CS 上升沿加 RC 延时确保 CS 晚于 VDD 拉低5. 性能优化与实战经验5.1 提高写入速度的几种方法MR25H40CDF 的 SPI 接口在 40MHz 下理论写入速度是 5MB/s但实际用 8 位机跑不到这个速度。我实测下来PIC18F85K90 在 64MHz 系统时钟下SPI 时钟设到 16MHz连续写入速度大概在 1.2MB/s 左右。想再快的话有几个方向一是用 Quad SPI 模式四根数据线并行理论速度翻四倍但需要单片机支持 QSPIPIC18F85K90 不支持所以这个项目用不上二是用 DMA 搬运数据减少 CPU 干预但 8 位机的 DMA 资源有限三是优化代码把 SPI 发送函数用汇编重写减少函数调用开销。我实际测试过把 SPI 发送函数用内联汇编优化后速度提升了大概 15%。具体做法是把 while 等待循环用汇编的 btfss 指令替代减少编译器生成的冗余代码。这个优化对大批量数据写入效果明显小数据量写入感知不强。5.2 降低功耗的技巧工业现场很多设备是电池供电或者太阳能供电功耗很关键。PIC18F85K90 有 XLP 超低功耗模式休眠电流可以低到 20nA。我的策略是不采集的时候让单片机进入 Sleep 模式定时器唤醒后采集一次写入 MRAM然后继续睡。MRAM 本身在待机模式下电流只有几微安写入时峰值电流大概 15mA但写入时间很短平均功耗很低。具体实现用 Timer1 做唤醒源配置成 1 秒溢出一次。主循环里采集完数据后执行 SLEEP() 指令Timer1 溢出中断唤醒后继续。实测下来整机平均电流从 8mA 降到了 200uA 左右电池寿命从几个月延长到了两年以上。实操心得进入 Sleep 前一定要把 SPI 模块关掉否则 MSSP 模块会持续消耗电流。我一开始忘了关休眠电流一直在 1mA 左右下不来查了好久才发现是 SPI 没关。5.3 数据校验与错误恢复工业数据不能出错我在软件里加了三层校验。第一层是每页的 CRC16 校验读写时都计算比对第二层是页头的页号连续性检查如果发现页号跳变说明中间有页写失败第三层是全局索引表在存储空间开头维护一个索引记录每个页的状态和位置。错误恢复策略如果 CRC 校验失败先尝试从备份页恢复如果备份页也失败标记该页为坏页跳过继续使用下一页。全局索引表每次上电时重建扫描所有页头把有效页的信息读出来。这个过程大概需要几百毫秒对于上电初始化来说可以接受。5.4 实际项目中的经验总结这个方案我已经在三个项目里用过了分别是电力监测终端、工业数据记录仪和智能水表。电力监测终端要求每秒记录一次连续运行两年多没出过数据丢失问题。工业数据记录仪要求 -40 度低温启动MRAM 在低温下表现比 EEPROM 好很多EEPROM 在 -40 度时写入经常失败MRAM 完全没问题。智能水表要求低功耗用 Sleep 模式加 MRAM 的方案电池寿命做到了三年以上。踩过的坑主要有几个一是 PCB 布局时 SPI 线走太长导致通信不稳定后来重新布线缩短到 3cm 以内解决二是电源去耦电容选型不对用了普通的电解电容高频特性差换成钽电容加陶瓷电容组合后解决三是软件上没有做写入完成标志掉电后无法判断数据是否完整后来加了双页备份机制解决。如果你也在做类似的项目我的建议是先用开发板把 SPI 通信调通再画正式 PCB电源部分不要省电容该放的一个都不能少软件上一定要做数据校验和掉电保护工业现场什么意外都可能发生。这个方案的成本也不高MR25H40CDF 批量价大概十几块钱PIC18F85K90 二十块左右加起来三十多块钱就能搞定一个高可靠的数据存储方案性价比很高。

相关新闻

Agent代码审查API能力与默认级别边界

Agent代码审查API能力与默认级别边界

GitHub 近期为 Copilot 代码审查增加了 REST 与 GraphQL API 支持。对工程团队而言,真正的问题不是“有没有 API”,而是变更日志究竟证明了什么、接入前还缺什么,以及哪些内容只能留在本地证据清单里。本文把这三类信息分开,避免把…

2026/10/5 1:58:25 阅读更多 →
在Linux上跑通DSH:拿着官方送的6块钱,开启本地AI之旅

在Linux上跑通DSH:拿着官方送的6块钱,开启本地AI之旅

经过一番折腾,终于在Linux环境下成功构建了DSH!对于一个极客来说,没有什么比看到终端里跳出“Success”更让人愉悦的了。更有意思的是,刚进入主界面,左下角就弹出了“赠金已到账”的提示——官方送了6元额度&#xff0…

2026/10/5 1:58:25 阅读更多 →
DeepSpeed-Chat 第二步 DPO 微调训练脚本实战:从 OPT-350m 到 Llama-2-7b 的模型替换与参数全解

DeepSpeed-Chat 第二步 DPO 微调训练脚本实战:从 OPT-350m 到 Llama-2-7b 的模型替换与参数全解

示例工程 【免费下载链接】DeepSpeedExamples Example models using DeepSpeed 项目地址: https://gitcode.com/gh_mirrors/de/DeepSpeedExamples 点击查看 免费下载 本指南聚焦 DeepSpeed-Chat 训练流水线第二步——Direct Preference Optimization(DP…

2026/10/5 1:57:25 阅读更多 →

最新新闻

插件系统开发指南:plugin.json配置、TypeScript SDK与CLI管理

插件系统开发指南:plugin.json配置、TypeScript SDK与CLI管理

1. 从“plugins”这个标题说起:插件系统到底在解决什么问题“plugins”这个词看起来简单,但它背后牵扯的东西其实非常多。我做了十多年开发,接触过各种形态的插件体系,从编辑器插件、构建工具插件,到 CLI 工具的扩展机…

2026/10/5 3:27:57 阅读更多 →
插件系统加载机制与故障排查:从plugin.json到激活失败的完整链路

插件系统加载机制与故障排查:从plugin.json到激活失败的完整链路

1. 从"plugins"这个标题说起:插件系统到底在解决什么问题"plugins"这个词看起来简单到几乎没什么可写的,但恰恰是这种极简标题背后藏着最容易被忽视的工程复杂度。我接触过不少项目,标题就叫plugins,正文一片…

2026/10/5 3:27:57 阅读更多 →
React Native跨平台开发进阶:原理、实战与面试指南

React Native跨平台开发进阶:原理、实战与面试指南

这几年React Native的讨论热度起起伏伏,但说句实在话,React Native不但没凉,反而是目前市场上稀缺的复合型技术栈。不管你是准备跳槽的移动端工程师,还是想从Web前端切入App开发的同学,又或者已经在RN项目里写了两年代…

2026/10/5 3:27:57 阅读更多 →
AI开发工具插件机制详解:plugin.json配置与加载失败排查

AI开发工具插件机制详解:plugin.json配置与加载失败排查

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 Cursor、Codex CLI、ZCode CLI 这类工具,大概率会在某个时刻撞上plugins这个词。它可能出现在配置文件里,可能出现在启动日志里,也可能出现在某个报错信息里&am…

2026/10/5 3:27:57 阅读更多 →
插件加载失败与开发实战:从did not activate排查到TypeScript SDK插件开发

插件加载失败与开发实战:从did not activate排查到TypeScript SDK插件开发

1. 从“plugins”这个标题说起:它到底在指什么“plugins”这个词单独拎出来,信息量其实非常低。它可以是浏览器插件、编辑器扩展、构建工具插件、CLI 插件系统,也可以是某个具体平台(比如 Cursor)的插件目录。但结合热…

2026/10/5 3:27:57 阅读更多 →
西门子博途SCL编写RS485自由口轮询程序实战详解

西门子博途SCL编写RS485自由口轮询程序实战详解

搞工控的兄弟应该都遇到过这种需求:手头一批温湿度传感器、电表、变频器或者扫码枪,设备本身不带以太网口,只有一路RS485跑Modbus RTU,更原始一点的干脆是自定义协议。上位机又要统一把数据采集上来,怎么办&#xff1f…

2026/10/5 3:26:57 阅读更多 →

日新闻

马斯克杀回智能体战场,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/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/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 阅读更多 →