MRAM与STM32L162ZE实战:高频写入与掉电保护方案
MRAM 这东西我第一次用是在一个工业数据采集板上。当时项目要求断电后关键配置不能丢还要能高频次改写EEPROM 的擦写寿命和写入速度都不太够看FRAM 又贵得离谱。后来选型选到 Everspin 的 MR25H40CDF4Mbit 的 SPI MRAM配合 STM32L162ZE 这颗低功耗 Cortex-M3算是把高频写入 断电保持 低功耗这三个需求同时兜住了。这篇就聊聊这套组合在实际项目里怎么落地从硬件连接到 SPI 时序调优再到数据存储结构的设计把踩过的坑和验证过的方案都摊开讲。1. 为什么是 MRAM 而不是 EEPROM 或 Flash1.1 三种非易失存储的本质差异做嵌入式存储选型绕不开三个候选EEPROM、NOR Flash、MRAM。很多人第一反应是存数据嘛EEPROM 就够了但在工业场景下这个判断经常翻车。EEPROM 的擦写寿命通常在 100 万次量级按字节写入速度慢典型页写入周期 5ms 左右。如果你有个系统每秒要记录一次运行参数一天就是 86400 次一年三千多万次EEPROM 几个月就写废了。NOR Flash 寿命好一些10 万次擦除但它是按扇区擦除的写入前必须先擦擦除时间长几十到几百毫秒而且不能按字节随机改写你得做磨损均衡和日志结构管理软件复杂度陡增。MRAM 的机制完全不同。它用磁性隧道结MTJ存储数据通过改变自由层的磁化方向来记录 0 和 1没有电荷注入、没有浮栅击穿的问题。MR25H40CDF 的标称擦写寿命是 10^14 次以上写入没有擦除前置操作可以按字节随机写写入周期在纳秒级。这意味着你可以把它当成一个断电不丢的 SRAM来用软件层面几乎不需要做磨损均衡。特性EEPROMNOR FlashMR25H40CDF (MRAM)容量几 KB~几 MB几 MB~几百 MB512KB (4Mbit)擦写寿命~100 万次~10 万次10^14 次写入粒度字节扇区字节写入前擦除不需要必须不需要写入速度慢 (ms 级)慢 (ms 级)快 (ns 级)接口I2C/SPISPI/QSPISPI1.2 MR25H40CDF 的关键参数解读MR25H40CDF 是 Everspin 的 4Mbit SPI MRAM工作电压 2.7V~3.6VSPI 接口最高支持 40MHz 时钟。它的存储阵列是 512K × 8bit也就是 512KB 字节空间。地址线是 19 位A0~A18通过 SPI 命令帧发送。几个容易被忽略的参数首先是数据保持时间官方标称 20 年工业级温度范围 -40°C 到 85°C 内都能保持。其次是写入耐久性10^14 次这个数字意味着即使你每秒写一次也要写三百多万年实际项目中根本不用担心寿命问题。第三是无写入延迟写入命令发出后数据立即生效不需要轮询等待内部写完成这对实时性要求高的场景非常关键。还有一个细节MR25H40CDF 的 SPI 模式支持 Mode 0 和 Mode 3命令集兼容标准 SPI Flash 的读命令0x03和写命令0x02但没有Flash 的扇区擦除命令0x20/0xD8和页编程命令0x02 在 Flash 里是 Page Program在 MRAM 里就是普通写。这个差异在移植代码时特别容易踩坑后面会细说。1.3 STM32L162ZE 作为主控的适配性STM32L162ZE 是 ST 的低功耗 Cortex-M3144 引脚512KB Flash80KB SRAM带 LCD 控制器和 AES 硬件加密。选它配 MR25H40CDF 有几个理由一是它的 SPI 外设支持最高 16MHzAPB2 时钟 32MHz 时虽然跑不满 MRAM 的 40MHz但工业场景下 8~16MHz 完全够用二是它的低功耗模式Stop、Standby配合 MRAM 的非易失特性可以做到系统大部分时间休眠、唤醒后立即读写数据三是它自带硬件 CRC 和 AES如果存储的数据需要校验或加密不用外挂芯片。STM32L162ZE 的 SPI1 挂在 APB2 上SPI2/SPI3 挂在 APB1 上。APB1 最高 16MHzAPB2 最高 32MHz。如果你要跑 SPI 高速优先用 SPI1。另外注意STM32L1 系列的 GPIO 翻转速度在高速 SPI 下可能成为瓶颈建议把 SCK、MOSI 配置为 Very High Speed 模式。2. 硬件连接与 PCB 布局的实战细节2.1 引脚连接与片选策略MR25H40CDF 是 8 引脚 SOIC 封装引脚定义很标准VCC、GND、SCK、SIMOSI、SOMISO、CS#、WP#、HOLD#。和 STM32L162ZE 连接时SPI 四线SCK、MISO、MOSI、CS是必须的WP# 和 HOLD# 如果不用可以上拉到 VCC但不建议悬空悬空容易受干扰导致误触发。片选CS#的选择有个讲究。STM32 的 SPI 外设支持硬件 NSS 和软件 NSS。硬件 NSS 在单主单从时可以用但多从机时基本都得用软件片选也就是普通 GPIO 控制。我一般用软件片选原因是硬件 NSS 在 SPI 使能/禁用时会有毛刺而且多从机场景下切换麻烦。软件片选虽然多占一个 GPIO但控制灵活时序可控。具体连接STM32 SPI1_SCK (PA5) → MR25H40CDF SCKSTM32 SPI1_MISO (PA6) → MR25H40CDF SOSTM32 SPI1_MOSI (PA7) → MR25H40CDF SISTM32 GPIO (PA4) → MR25H40CDF CS#MR25H40CDF WP# → 10K 上拉到 VCCMR25H40CDF HOLD# → 10K 上拉到 VCC2.2 PCB 布局中的信号完整性SPI 在低速时随便走线都能跑但一旦上到 10MHz 以上PCB 布局就开始影响通信稳定性。我遇到过一块板子SPI 跑 8MHz 时读写正常提到 16MHz 就随机出错查了半天发现是 SCK 走线太长超过 8cm且没有参考地平面信号反射导致时钟边沿畸变。几条实战经验SCK 走线尽量短最好控制在 5cm 以内并且全程有完整的地平面参考。串联端接电阻在 SCK 源端串一个 22Ω~33Ω 电阻可以抑制反射。这个电阻不是必须的但如果走线长或者时钟高加上去很管用。CS# 走线单独处理不要和 SCK 平行走太长避免串扰导致片选误动作。去耦电容MR25H40CDF 的 VCC 引脚旁边放一个 0.1μF 陶瓷电容再并一个 1μF位置尽量靠近芯片引脚。MRAM 在写入瞬间电流会有波动去耦不好会导致写入失败。注意MRAM 的写入电流比读取大虽然总体功耗不高但瞬态电流变化可能通过电源耦合影响 SPI 通信。去耦电容一定要放而且地线要短。2.3 电源与电平匹配MR25H40CDF 工作电压 2.7V~3.6VSTM32L162ZE 的 IO 电压取决于 VDD通常也是 3.3V所以电平直接匹配不需要电平转换。但如果你的系统是 1.8V 或 5V 逻辑就需要加电平转换芯片或者分压电阻。有个细节STM32L162ZE 在低功耗模式下如果 SPI 引脚配置不当可能会有漏电流。建议在进入 Stop 模式前把 SPI 引脚配置为模拟输入或者输出低电平避免浮空引脚产生额外功耗。MR25H40CDF 在 CS# 为高时进入待机模式电流典型值 10μA 左右这个功耗在电池供电场景下也要算进去。3. SPI 驱动层的实现与调优3.1 STM32 HAL 库的 SPI 初始化用 STM32CubeMX 生成 SPI 初始化代码是最快的路径但生成的默认配置有几个地方需要手动调整。下面是我常用的 SPI1 初始化配置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; // CPOL 0 hspi1.Init.CLKPhase SPI_PHASE_1EDGE; // CPHA 0 hspi1.Init.NSS SPI_NSS_SOFT; // 软件片选 hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_4; // 32MHz/4 8MHz hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial 10;这里 CPOL0、CPHA0 对应 SPI Mode 0MR25H40CDF 支持 Mode 0 和 Mode 3。我选 Mode 0 是因为它在上升沿采样配合 STM32 的 SPI 外设比较自然。BaudRatePrescaler 设为 4APB2 时钟 32MHz 时 SCK 为 8MHz。如果你想跑更快可以设为 216MHz但要先确认 PCB 走线和 MRAM 的时序余量。3.2 MRAM 读写命令的实现MR25H40CDF 的命令集很简洁核心就几条命令编码功能WREN0x06写使能WRDI0x04写禁止RDSR0x05读状态寄存器WRSR0x01写状态寄存器READ0x03读数据WRITE0x02写数据读操作的流程拉低 CS# → 发送 0x03 → 发送 3 字节地址实际只用 19 位高 5 位忽略→ 连续读取数据 → 拉高 CS#。写操作的流程拉低 CS# → 发送 0x06WREN→ 拉高 CS# → 拉低 CS# → 发送 0x02 → 发送 3 字节地址 → 发送数据 → 拉高 CS#。注意 WREN 是一个独立的事务必须先发 WREN 再发 WRITE中间 CS# 要拉高再拉低。很多人第一次用会忘记发 WREN结果写不进去还找不到原因。void MRAM_WriteEnable(void) { uint8_t cmd 0x06; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } void MRAM_Write(uint32_t addr, uint8_t *data, uint16_t len) { uint8_t cmd 0x02; uint8_t addr_buf[3]; addr_buf[0] (addr 16) 0xFF; addr_buf[1] (addr 8) 0xFF; addr_buf[2] addr 0xFF; MRAM_WriteEnable(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Transmit(hspi1, addr_buf, 3, 100); HAL_SPI_Transmit(hspi1, data, len, 1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } void MRAM_Read(uint32_t addr, uint8_t *data, uint16_t len) { uint8_t cmd 0x03; uint8_t addr_buf[3]; addr_buf[0] (addr 16) 0xFF; addr_buf[1] (addr 8) 0xFF; addr_buf[2] addr 0xFF; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Transmit(hspi1, addr_buf, 3, 100); HAL_SPI_Receive(hspi1, data, len, 1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); }3.3 时序余量与速度测试MR25H40CDF 的 SPI 时序参数里几个关键值SCK 周期最小 25ns对应 40MHzCS# 建立时间 5nsCS# 保持时间 5ns数据输出延迟最大 8ns。在 8MHz 下这些参数都有很大余量16MHz 下也够用。我实测过不同时钟下的读写速度。用 STM32L162ZE 的 SPI1APB2 跑 32MHz分频SCK 频率连续读 512KB 耗时连续写 512KB 耗时48MHz~520ms~540ms216MHz~270ms~280ms84MHz~1.04s~1.08s写入比读取略慢因为每次写事务前要发 WREN 命令多了一个 CS# 翻转周期。如果你要批量写可以连续写多个字节WREN 只需要在事务开始时发一次。提示MRAM 的写入没有内部写周期所以不需要像 Flash 那样写完后轮询状态寄存器等待完成。写完 CS# 拉高数据就已经生效了。4. 数据存储结构的设计与掉电保护4.1 为什么需要设计存储结构MRAM 虽然可以按字节随机写但如果你直接把数据往固定地址一扔时间长了会遇到几个问题一是数据版本管理你不知道当前读到的数据是新的还是旧的二是掉电时如果正在写可能写到一半数据不完整三是如果数据结构变了旧数据怎么兼容。我在工业采集项目里的做法是把 MRAM 分成几个区域每个区域有固定的用途和数据结构关键数据加 CRC 校验和版本号。4.2 分区方案与数据结构512KB 的空间我一般这样分0x00000 ~ 0x00FFF系统配置区存设备参数、校准系数带 CRC。0x01000 ~ 0x01FFF运行日志区环形缓冲区记录关键事件。0x02000 ~ 0x7FFFF数据存储区按页管理每页 256 字节页头带序号和 CRC。配置区的数据结构typedef struct { uint32_t magic; // 0x4D52414D (MRAM) uint16_t version; // 数据结构版本 uint16_t length; // 数据长度 uint8_t data[64]; // 实际配置数据 uint32_t crc32; // 前面所有字节的 CRC32 } ConfigBlock_t;写入时先算好 CRC再一次性写入。读取时先校验 magic 和 CRC都通过才认为数据有效。如果 CRC 不通过说明数据损坏加载默认配置。4.3 掉电保护的实现思路MRAM 的写入速度极快一个 256 字节的页写入在 8MHz SPI 下大约 260μs。这个时间窗口内掉电的概率很低但不是零。为了做到万无一失我用双缓冲 序号的方案。具体做法每个数据页存两份地址 A 和地址 B。每份有一个 4 字节的序号写入时序号递增。读取时比较两份的序号和 CRC取序号大且 CRC 正确的那份。写入流程先写序号小的那份覆盖旧数据写完校验再更新序号。这样即使写到一半掉电另一份仍然是完整的。typedef struct { uint32_t seq; // 序号递增 uint16_t len; // 数据长度 uint8_t data[250]; // 数据 uint32_t crc32; // 校验 } DataPage_t;这个方案的好处是不需要额外的标志位序号本身就是状态。坏处是占用双倍空间但对于 512KB 的 MRAM 来说256KB 的有效数据空间在很多场景下也够用了。4.4 实际项目中的读写频率与寿命核算有人会问MRAM 寿命 10^14 次是不是可以无限写理论上是的但实际项目中还要考虑 SPI 总线的占用和系统功耗。我那个采集项目每秒写一次日志每次写 256 字节一天 86400 次一年约 3150 万次。10^14 / 3.15×10^7 ≈ 317 万年。所以寿命完全不是瓶颈。真正需要注意的是写入时的电源稳定性。如果系统电源在写入过程中跌落可能导致 SPI 通信中断写入的数据不完整。我的做法是在电源输入端加一个大电容100μF 以上保证掉电后系统还能维持几毫秒足够完成当前写事务。同时用 STM32 的 PVD可编程电压检测监控电源电压低于阈值时触发中断在中断里完成紧急写入或标记。5. 调试过程中踩过的坑与排查方法5.1 读出来全是 0xFF 或 0x00这是最常见的现象。原因通常有三个一是 CS# 没有正确拉低SPI 事务根本没开始二是 SPI 模式不对CPOL/CPHA 配错数据采样位置偏移三是 MISO 引脚配置错误没有配成复用功能或者上拉/下拉不对。排查顺序先用示波器或逻辑分析仪看 CS#、SCK、MOSI、MISO 四根线。CS# 应该在事务期间保持低电平SCK 应该有对应数量的时钟脉冲MOSI 上应该能看到命令字节和地址。如果 CS# 正常但 MISO 一直是高电平检查 MRAM 的 WP# 和 HOLD# 是否被拉低——HOLD# 拉低会暂停通信MISO 会进入高阻态。5.2 写入后读出来数据不对这种情况通常是 WREN 没有发或者发完 WREN 后 CS# 没有拉高再拉低。MR25H40CDF 要求 WREN 和 WRITE 是两个独立的事务中间 CS# 必须有一次上升沿。如果你在发完 WREN 后直接发 WRITE 而不翻转 CS#写操作会被忽略。另一个可能是地址对齐问题。虽然 MRAM 支持字节写入但如果你用 DMA 传输要注意 DMA 的数据宽度和 SPI 的数据宽度匹配。我遇到过 DMA 配置成半字16bit而 SPI 配置成 8bit结果数据错位。5.3 高速 SPI 下的随机错误SPI 时钟提到 16MHz 以上时如果出现随机读写错误大概率是信号完整性问题。排查方法先用逻辑分析仪抓波形看 SCK 边沿是否有过冲或振铃MISO 数据建立时间是否足够。如果波形不好降低 SPI 时钟看是否改善。如果降速后正常说明是硬件问题需要改 PCB 或加端接电阻。软件上也可以做一些容错每次写入后立即读回校验如果校验失败就重试。MRAM 的写入没有寿命限制重试几次完全没问题。5.4 低功耗模式下的唤醒问题STM32L162ZE 从 Stop 模式唤醒后SPI 外设需要重新初始化。如果你在 Stop 模式前没有正确关闭 SPI唤醒后直接读写 MRAM 可能会失败。我的做法是在进入 Stop 模式前调用HAL_SPI_DeInit()唤醒后重新HAL_SPI_Init()。虽然多花一点时间但稳定可靠。另外MR25H40CDF 在 CS# 为高时进入待机电流约 10μA。如果你在 Stop 模式下把 CS# 拉低MRAM 会保持激活状态电流会上升到几 mA电池很快就耗光了。所以进入低功耗前务必把 CS# 拉高。6. 性能优化与进阶用法6.1 用 DMA 提升吞吐量如果你需要频繁读写大量数据用 DMA 可以解放 CPU。STM32L162ZE 的 SPI1 支持 DMA 请求配置好 DMA 通道后SPI 传输不需要 CPU 干预。但要注意DMA 传输期间 CS# 必须保持低电平传输完成后才能拉高。用 HAL 库的话可以用HAL_SPI_Transmit_DMA()和HAL_SPI_Receive_DMA()在传输完成回调里拉高 CS#。DMA 的另一个好处是可以在传输期间让 CPU 进入低功耗模式进一步省电。不过 SPI 时钟不能停所以只能进 Sleep 模式不能进 Stop 模式。6.2 数据加密与完整性保护STM32L162ZE 自带 AES-128 硬件加密。如果存储的数据敏感可以在写入前用 AES 加密读取后解密。AES 加密一个 16 字节块只需要几十个时钟周期对整体性能影响很小。完整性保护除了 CRC32还可以用 HMAC。不过 HMAC 需要密钥管理如果密钥也存在 MRAM 里就失去了保护意义。我的做法是密钥存在 STM32 的内部 Flash 里利用读保护RDP防止外部读取。6.3 多设备共享 SPI 总线如果系统里还有别的 SPI 设备比如 SPI Flash、SPI 显示屏MRAM 可以和其他设备共享 SCK、MISO、MOSI各自用独立的 CS#。切换设备时先拉高当前设备的 CS#再拉低目标设备的 CS#。注意不要在 SCK 还在翻转时切换 CS#否则可能产生误操作。共享总线时SPI 时钟频率要取所有设备都能接受的最低值。如果 MRAM 跑 16MHz 而另一个设备只能跑 4MHz要么分时切换时钟要么统一用 4MHz。分时切换时钟需要在切换设备时重新配置 SPI 的 BaudRatePrescaler稍微麻烦一点但能兼顾性能。6.4 与文件系统结合的可能性有人会想在 MRAM 上跑一个文件系统比如 LittleFS 或 SPIFFS。技术上可行但我不太推荐。原因是 MRAM 的随机读写特性让文件系统的磨损均衡和日志机制变得多余反而增加了复杂度和开销。如果你的数据是结构化的直接用分区 结构体的方式管理更简单高效。如果确实需要文件语义可以考虑用 FatFS 的 RAM 盘模式把 MRAM 当块设备但要注意 FatFS 的写入粒度是扇区512 字节会浪费一些空间。7. 几个容易被忽略的细节7.1 上电初始化时间MR25H40CDF 的上电时间VCC 上升到 2.7V 到芯片就绪典型值是 1ms最大 5ms。如果你的系统上电后立即读写 MRAM可能会失败。稳妥的做法是在初始化代码里加一个 5ms 的延时或者先读一次状态寄存器确认芯片就绪。7.2 状态寄存器的使用MR25H40CDF 的状态寄存器只有几位有效WEL写使能锁存、BP0/BP1块保护、WPEN写保护使能。默认情况下块保护是关闭的所有地址都可写。如果你需要保护某些区域可以通过 WRSR 命令设置 BP 位。但要注意设置块保护后被保护的地址写入会被忽略而且不会报错调试时容易困惑。7.3 温度对时序的影响工业级温度范围 -40°C 到 85°C 内MRAM 的时序参数会有变化。高温下数据输出延迟会增加低温下可能会略微减小。在 8MHz 以下这些变化都在余量范围内。如果你跑 16MHz 以上建议在极端温度下做一次完整测试确认时序余量足够。7.4 批量生产的烧录问题量产时MRAM 里可能需要预置一些出厂参数比如设备 ID、校准系数。由于 MRAM 是 SPI 接口可以通过 STM32 的 Bootloader 或者自定义的烧录工装来写入。我的做法是在 STM32 的固件里加一个工厂模式上电时检测某个 GPIO 是否为低如果是就进入工厂模式通过串口接收参数并写入 MRAM。这样不需要额外的烧录设备产线操作也简单。7.5 数据迁移与版本兼容产品迭代时存储结构可能会变。我的做法是在配置区里保留 version 字段读取时先判断版本号。如果版本号低于当前固件支持的版本就执行迁移逻辑读取旧结构的数据转换成新结构再写回。迁移逻辑要写得健壮考虑各种异常情况比如旧数据 CRC 不通过、字段缺失等。8. 写在最后的一些个人体会这套 MR25H40CDF STM32L162ZE 的组合我在三个项目里用过最长的已经跑了两年多没有出现过数据丢失或存储失效的问题。MRAM 的像 SRAM 一样用但断电不丢这个特性一旦用习惯了就很难回去用 EEPROM 或 Flash 了。如果非要挑毛病MRAM 的价格确实比同容量 EEPROM 和 Flash 高不少。4Mbit 的 MR25H40CDF 单价在几十块钱人民币而同样容量的 SPI Flash 只要几块钱。所以选型时要算清楚你的项目是否真的需要高频写入、是否需要断电立即保存、是否能接受 Flash 的擦除延迟。如果只是存个配置参数一年写不了几次那 EEPROM 或 Flash 完全够用没必要上 MRAM。另外MRAM 的容量目前最大也就到 16Mbit 左右再大就贵得离谱了。如果你的数据量超过几 MB还是得用 Flash 或者 eMMC。MRAM 的定位是高频写入的小容量非易失存储把它用在对的地方它能发挥出别的存储介质替代不了的价值。最后分享一个调试小技巧在 MRAM 的读写函数里加一个全局的错误计数器每次 CRC 校验失败或者读回数据不匹配就加一。产品跑一段时间后通过串口把这个计数器读出来如果一直是 0说明存储链路很稳定如果有增长就要查是电源问题、时序问题还是芯片问题。这个计数器我一般放在 MRAM 的固定地址掉电也不丢方便现场排查。

相关新闻

群卷积网络G-CNN:从旋转等变原理到PyTorch复现

群卷积网络G-CNN:从旋转等变原理到PyTorch复现

/* 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 6:24:16 阅读更多 →
Java飞机订票系统源码实战:数据库设计、JDBC事务与并发防超卖

Java飞机订票系统源码实战:数据库设计、JDBC事务与并发防超卖

/* 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 6:24:16 阅读更多 →
Jetson AGX Orin避坑指南:解决DP线黑屏与SSD不识别

Jetson AGX Orin避坑指南:解决DP线黑屏与SSD不识别

/* 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 6:24:16 阅读更多 →

最新新闻

微客AI助手踩坑实录:买家连发五条只回首条——微信自动回复长会话读取的单次上限陷阱

微客AI助手踩坑实录:买家连发五条只回首条——微信自动回复长会话读取的单次上限陷阱

现象:回复永远慢半拍,还答非所问客服自动化系统里有一个基础动作:从会话窗口读出最新消息,交给 AI 生成回复。某类反馈引起了注意:买家在几条消息里连着说事儿,AI 的回复总是对着较早的那条——买家都问到第…

2026/10/5 6:56:27 阅读更多 →
Setfos 仿真新能力:自热、隧穿与多光源仿真

Setfos 仿真新能力:自热、隧穿与多光源仿真

Setfos 是由瑞士 Fluxim AG 开发的光电器件仿真软件,适用于 OLED、太阳能电池、光电探测器及其他薄膜半导体器件。它将薄膜光学与漂移-扩散电荷传输集成在同一模型中,光学与电学行为同步求解,而无需在不同工具间切换。本文介绍 Setfos 目前可…

2026/10/5 6:56:27 阅读更多 →
2026.10.1 ---10.7

2026.10.1 ---10.7

一.计算机基础二.软件1.应用软件两种架构&#xff1a;C/S架构 B/S架构afterDelay:修改完代码后多久自动保存 onFocusChange&#xff1a;当焦点改变帮忙保存文件onWindowChange:点击除vscode的软件自动保存ctrlz:撤销 ctrls&#xff1a;保存 ctrl/:生成<!-- …

2026/10/5 6:56:27 阅读更多 →
【LTE Attach流程】

【LTE Attach流程】

LTE Attach流程 附着流程概念 附着是UE向网络侧发起附着到完成附着的流程&#xff1b; 附着流程的功能 1、UE注册到EPS网络当中&#xff1b; 2、网络侧在附着的过程中会建立一个默认的承载&#xff0c;该默认承载会提供永久的IP连接&#xff1b; 3、在MME和UE会创建该用户的MM上…

2026/10/5 6:56:27 阅读更多 →
Linux基础开发工具(一):软件包管理器与 vim 编辑器

Linux基础开发工具(一):软件包管理器与 vim 编辑器

Linux基础开发工具&#xff08;一&#xff09;&#xff1a;软件包管理器与 vim 编辑器 下方为本篇内容的思维导图&#xff0c;以便大家思维框架的构建 注意&#xff1a;Linux基础开发工具&#xff08;一&#xff09;中只涵盖了其中的软件包管理器与 vim 编辑器部分哦~ 文章目录…

2026/10/5 6:56:27 阅读更多 →
LangChain 从入门到实战(01):从 Java 后端转 Agent,第一座脚手架叫 LangChain

LangChain 从入门到实战(01):从 Java 后端转 Agent,第一座脚手架叫 LangChain

从 Java 后端转 Agent 开发&#xff0c;第一座要爬的脚手架叫 LangChain 你在面试或选题时一定见过这个名字&#xff1a;LangChain。它可能是 “Agent 开发第一大框架”&#xff0c;也可能被吐槽 “包多、版本乱”。对于从 Java 后端切过来的工程师&#xff0c;真正要搞懂的其实…

2026/10/5 6:55:27 阅读更多 →

日新闻

马斯克杀回智能体战场,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”这个词说起&#xff1a;它到底在解决什么问题如果你最近在折腾 AI 编程工具&#xff0c;尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手&#xff0c;那你大概率绕不开一个词——plugins。这个词本身不新鲜&#xff0c;从浏览器到 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 阅读更多 →