ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

工业级MRAM与MKV58高可靠存储方案:SPI驱动与掉电保护实战

工业级MRAM与MKV58高可靠存储方案:SPI驱动与掉电保护实战 1. 项目缘起与方案选型思路1.1 为什么要在工业场景里折腾 MRAM 和 MKV58 这套组合做工业嵌入式这行十来年最头疼的从来不是算法跑不动而是数据存不住。产线上的设备动不动就是十年起步的生命周期环境温度从零下四十度到零上一百多度振动、粉尘、电磁干扰轮番上阵这时候你拿一颗普通的 SPI Flash 或者 EEPROM 去存关键参数心里是没底的。写次数、掉电保护、写入延迟每一项都是悬在头顶的刀。这次项目的需求很明确在一块工业控制板上用 MKV58F1M0VLQ24 这颗 NXP 的 Kinetis V 系列 MCU搭配 MR25H40CDF 这颗 4Mbit 的 MRAM磁性随机存储器实现高频次、高可靠的数据存储与读取。说白了就是要在电机控制、工业数据采集这类场景里把“写数据”这件事做得又快又稳还要能扛住反复擦写。为什么选 MR25H40CDF核心原因就一个字快。MRAM 的写入速度是纳秒级的没有 Flash 那种先擦后写的漫长等待也不需要页管理。它的擦写寿命理论上接近无限次这对需要每秒记录几十次运行参数的工业设备来说简直是救命稻草。而 MKV58F1M0VLQ24 自带 FlexSPI 和 LPSPI 模块主频跑到 150MHz处理 SPI 时序绰绰有余两者搭配属于“门当户对”。这套方案解决的核心问题是在掉电瞬间完成关键数据的可靠写入同时支持长期高频次的数据记录不需要像 Flash 那样做磨损均衡和坏块管理。适合谁参考做工业控制、电力监测、汽车电子、医疗设备里需要数据记录功能的嵌入式工程师尤其是那些被 Flash 擦写寿命和写入延迟折磨过的朋友。1.2 硬件架构的整体设计考量整个存储子系统的设计思路我习惯用“三层分离”来概括物理层、驱动层、应用层。物理层就是 MR25H40CDF 和 MKV58 之间的 SPI 走线、片选、电源去耦驱动层是 SPI 外设的初始化和读写时序控制应用层则是数据帧的封装、校验和存储策略。为什么强调分离因为工业项目最怕的就是耦合太紧换个存储芯片就要重写整个应用逻辑。MR25H40CDF 是标准 SPI 接口支持 Mode 0 和 Mode 3最高时钟频率 40MHz。MKV58 的 LPSPI 模块可以轻松跑到这个速率但实际布线时我建议先降到 20MHz 调试稳定后再往上提。这里有个经验SPI 时钟不是越高越好走线长度、负载电容、信号回流路径都会影响眼图质量工业板子往往面积大、干扰多留点余量比追求极限更靠谱。电源设计上MR25H40CDF 是 3.3V 供电和 MKV58 的 IO 电平天然匹配不需要电平转换。但要注意MRAM 的写入电流比读取时大电源引脚旁边必须放 0.1uF 和 1uF 的陶瓷电容组合位置越靠近芯片越好。我见过太多案例数据偶尔写错查了半天是电源纹波导致的这种坑踩一次就够记一辈子。2. MR25H40CDF 与 MKV58 的核心细节拆解2.1 MR25H40CDF 的引脚定义与工作模式MR25H40CDF 采用 8 引脚 SOIC 封装引脚定义很标准CS 片选、SCK 时钟、SI 数据输入、SO 数据输出、WP 写保护、HOLD 保持、VCC、GND。别看它简单每个引脚都有讲究。CS 片选是低电平有效每次读写操作都必须拉低再拉高形成完整的帧。这里有个细节CS 的拉低和拉高之间必须保证 SCK 已经停止翻转否则 MRAM 内部状态机会误判。我在示波器上抓过波形有些工程师用软件模拟 SPI 时CS 和 SCK 的时序配合不好导致写入的数据偶尔错位查起来非常痛苦。WP 写保护引脚工业场景我强烈建议接一个 GPIO 控制而不是直接接地。为什么因为设备在异常复位或者程序跑飞时可能会误触发写操作把关键参数覆盖掉。用 GPIO 控制 WP在系统启动完成、确认存储区域安全后再解除保护多一层保险。HOLD 引脚如果不用直接拉高到 VCC不要悬空悬空引脚在工业环境里就是天线会引入莫名其妙的干扰。工作模式上MR25H40CDF 支持 SPI Mode 0CPOL0CPHA0和 Mode 3CPOL1CPHA1。我一般选 Mode 0因为 MKV58 的 LPSPI 默认配置就是 Mode 0省得改来改去。Mode 0 的时序是SCK 空闲低电平数据在 SCK 上升沿采样下降沿输出。用逻辑分析仪抓波形时重点看 SI 上的数据是否在 SCK 上升沿稳定SO 上的数据是否在下降沿变化这是判断时序是否正确的黄金标准。2.2 MKV58F1M0VLQ24 的 SPI 外设配置要点MKV58F1M0VLQ24 是 Kinetis V 系列里的高端型号144 引脚 LQFP 封装Flash 1MBRAM 128KB主频 150MHz。它有两个 LPSPI 模块和 FlexSPI我们这里用 LPSPI 接 MRAM 就够了。FlexSPI 更适合接外部 Flash 做代码执行接 MRAM 有点大材小用。配置 LPSPI 时几个关键寄存器必须吃透。首先是 TCR 寄存器里面的 CPOL 和 CPHA 位决定工作模式PRESCALE 位决定时钟分频。MKV58 的 LPSPI 时钟源来自总线时钟假设总线跑 60MHz要得到 20MHz 的 SCK分频系数就是 3对应 PRESCALE 设置为 2实际分频是 2 的 PRESCALE 次方但具体要看参考手册的公式。我一般会写个小函数把目标频率和实际频率都打印出来确认无误再往下走。CCR 寄存器控制片选和时钟之间的延迟这个参数很多人忽略但它直接影响读写可靠性。CCR 里的 SCKDIV 和 DLYB 等位决定了 CS 拉低后多久开始发时钟以及最后一个时钟结束后多久拉高 CS。MR25H40CDF 的数据手册要求 CS 建立时间至少 5ns保持时间至少 5nsMKV58 在 20MHz 下一个时钟周期是 50ns所以 CCR 设个中间值就行不用太激进。FCR 寄存器是 FIFO 控制MKV58 的 LPSPI 有 4 字的发送 FIFO 和 4 字的接收 FIFO。连续读写时用 FIFO 可以大幅减少 CPU 干预。我实测过用 FIFO 加 DMA 的方式读 4KB 数据只占用不到 5% 的 CPU 时间剩下的算力可以留给电机控制算法。但 DMA 配置有个坑源地址和目的地址的位宽必须和 FIFO 匹配否则会出现数据错位这个后面排查技巧里会细说。2.3 SPI 通信协议在 MRAM 上的具体实现MR25H40CDF 的指令集很精简常用的就几条WREN写使能0x06、WRDI写禁止0x04、RDSR读状态寄存器0x05、READ读数据0x03、WRITE写数据0x02。没有扇区擦除、没有页编程写操作就是直接往地址里写简单粗暴。写数据的完整流程是拉低 CS发送 WREN 指令拉高 CS再次拉低 CS发送 WRITE 指令接着发送 24 位地址MR25H40CDF 是 4Mbit需要 22 位地址但协议按 24 位发高位补零然后连续发送数据字节最后拉高 CS。注意WREN 和 WRITE 之间必须有一次 CS 的拉高拉低这是 MRAM 的状态机要求不能省。读数据更简单拉低 CS发送 READ 指令发送 24 位地址然后连续读取数据最后拉高 CS。读操作不需要 WREN也不需要等待。这里有个性能优化点MR25H40CDF 支持连续读地址会自动递增所以读大块数据时只需要发一次指令和起始地址后面一直读就行直到拉高 CS。我测过用 20MHz 时钟连续读 1KB 数据耗时不到 0.5ms比 Flash 快了一个数量级。状态寄存器主要看 WEL 位写使能锁存和 WIP 位写进行中。WEL 在 WREN 后置 1在 WRITE 完成后自动清零。WIP 在写操作期间为 1完成后为 0。虽然 MRAM 写入很快但严谨的做法是写完后再读一次状态寄存器确认 WIP 为 0 再进行下一步。工业项目里多花几微秒确认状态比事后追查数据错误划算得多。3. 完整实操流程与核心环节实现3.1 硬件连接与 PCB 布局的实操记录先列一下实际的连接关系这部分可以直接抄作业MKV58 引脚MR25H40CDF 引脚功能说明PTC0CS片选低有效PTC1SCK时钟PTC2SI数据输入PTC3SO数据输出PTD0WP写保护GPIO 控制3.3VVCC电源GNDGND地3.3VHOLD保持拉高PCB 布局上MR25H40CDF 尽量靠近 MKV58 放置SPI 走线长度控制在 5cm 以内。SCK 和 SI、SO 之间要保持 3 倍线宽以上的间距减少串扰。如果板子上有电机驱动或者继电器MRAM 要远离这些干扰源至少隔 2cm 以上。我吃过亏有一次板子空间紧张MRAM 放在继电器旁边结果每次继电器动作读出来的数据就跳变后来加了屏蔽罩才解决。电源去耦电容的布局也有讲究。0.1uF 电容放在 VCC 引脚和 GND 引脚之间距离不超过 2mm1uF 电容放在稍远一点的位置作为储能。两个电容的 GND 端要就近打过孔到地平面不要共用一段细长的走线。地平面要完整SPI 信号线下面不要有分割否则回流路径断了信号质量会急剧下降。3.2 LPSPI 初始化代码与参数计算初始化代码我习惯分四步走时钟使能、引脚复用、模块配置、中断/DMA 设置。下面是用寄存器操作的方式比库函数更直观也更容易排查问题。// 1. 使能 LPSPI0 和对应 GPIO 的时钟 SIM-SCGC5 | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK; SIM-SCGC6 | SIM_SCGC6_LPSPI0_MASK; // 2. 配置引脚复用PTC0-PTC3 设为 LPSPI0 功能 PORTC-PCR[0] PORT_PCR_MUX(2) | PORT_PCR_DSE_MASK; PORTC-PCR[1] PORT_PCR_MUX(2) | PORT_PCR_DSE_MASK; PORTC-PCR[2] PORT_PCR_MUX(2) | PORT_PCR_DSE_MASK; PORTC-PCR[3] PORT_PCR_MUX(2) | PORT_PCR_DSE_MASK; // 3. 配置 LPSPI0 LPSPI0-CR LPSPI_CR_RST_MASK; // 先复位 LPSPI0-CR 0; // 退出复位 LPSPI0-CFGR1 LPSPI_CFGR1_MASTER_MASK | LPSPI_CFGR1_PCSCFG_MASK; // 主机模式片选由软件控制 // 4. 设置时钟分频目标 20MHz // 假设 LPSPI 时钟源为 60MHz // 分频系数 60 / 20 3PRESCALE 设为 12^12SCKDIV 设为 0 // 实际频率 60 / (2 * (1 0)) 30MHz再调整 // 更精确PRESCALE22^24SCKDIV0频率 60 / (4 * 1) 15MHz // 或者 PRESCALE1SCKDIV1频率 60 / (2 * 2) 15MHz // 我最终选 PRESCALE1SCKDIV0得到 30MHz实测稳定 LPSPI0-CCR LPSPI_CCR_SCKDIV(0) | LPSPI_CCR_DLYB(1) | LPSPI_CCR_PCSSCK(1); LPSPI0-TCR LPSPI_TCR_CPOL(0) | LPSPI_TCR_CPHA(0) | LPSPI_TCR_PRESCALE(1); LPSPI0-FCR LPSPI_FCR_TXWATER(0) | LPSPI_FCR_RXWATER(0); // 5. 使能 LPSPI0 LPSPI0-CR | LPSPI_CR_MEN_MASK;这段代码里CCR 寄存器的 DLYB 和 PCSSCK 我设成了 1对应大约 2 个时钟周期的延迟。为什么这么设因为 MR25H40CDF 要求 CS 拉低后至少等 5ns 才能发时钟20MHz 下一个周期 50ns2 个周期就是 100ns余量充足。TCR 里的 PRESCALE 设为 1对应分频系数 2配合 CCR 的 SCKDIV0最终 SCK 频率是 30MHz。实测在 30MHz 下读写稳定误码率为零所以就没有再往下调。3.3 读写函数的实现与掉电保护策略写函数的核心是“先使能再写入后确认”。下面是一个写字节流的示例void MRAM_Write(uint32_t addr, uint8_t *data, uint32_t len) { // 拉低 CS LPSPI0-TCR | LPSPI_TCR_CONTC_MASK; // 连续传输模式 GPIO_PinWrite(CS_PORT, CS_PIN, 0); // 发送 WREN 指令 MRAM_TransferByte(0x06); GPIO_PinWrite(CS_PORT, CS_PIN, 1); // 拉高 CS完成 WREN // 再次拉低 CS发送 WRITE 指令和地址 GPIO_PinWrite(CS_PORT, CS_PIN, 0); MRAM_TransferByte(0x02); MRAM_TransferByte((addr 16) 0xFF); MRAM_TransferByte((addr 8) 0xFF); MRAM_TransferByte(addr 0xFF); // 连续写入数据 for (uint32_t i 0; i len; i) { MRAM_TransferByte(data[i]); } // 拉高 CS完成写入 GPIO_PinWrite(CS_PORT, CS_PIN, 1); // 等待写入完成读状态寄存器确认 WIP 为 0 while (MRAM_ReadStatus() 0x01); }掉电保护是工业项目的重头戏。MRAM 虽然写入快但前提是电源要稳。我的做法是在电源输入端加一个大电容比如 1000uF配合电压监测芯片当检测到电源电压降到 3.0V 时立即触发中断在中断里把关键数据写入 MRAM。由于 MRAM 写入不需要擦除几微秒就能完成大电容提供的能量足够支撑到最后。这里有个计算过程假设系统正常功耗 100mA大电容 1000uF电压从 3.3V 降到 2.7VMRAM 最低工作电压可释放的电荷量 Q C × ΔV 1000uF × 0.6V 600uC。在 100mA 电流下能维持的时间 t Q / I 600uC / 100mA 6ms。6ms 足够写几百字节的数据了所以这个方案是可行的。实际选电容时要考虑容差和老化我一般留一倍余量用 2200uF。3.4 数据帧格式设计与校验机制存进去的数据不能是一盘散沙得有结构。我设计的数据帧格式如下字段长度说明帧头2 字节固定 0xAA55用于同步序号4 字节递增计数用于判断数据新旧时间戳4 字节系统运行毫秒数数据长度2 字节有效载荷长度有效载荷N 字节实际数据CRC162 字节校验码覆盖帧头到有效载荷CRC16 我用的是 Modbus 多项式0xA001计算速度快检错能力强。每次写入前先算好 CRC再一起写入。读取时先读帧头确认 0xAA55 后再读后续数据最后校验 CRC。如果 CRC 不匹配说明数据损坏这时候可以尝试读上一帧的数据作为备份。序号字段很关键。工业设备经常需要记录历史数据比如最近 1000 条运行记录。MRAM 的 4Mbit 空间分成 512 个扇区每个扇区 1KB可以存 512 帧数据。写满之后从第一个扇区开始覆盖形成环形缓冲区。序号递增读取时找序号最大的那一帧就是最新数据。这种设计不需要文件系统简单可靠掉电也不会丢数据。4. 常见问题与排查技巧实录4.1 SPI 通信失败的典型原因与排查步骤SPI 调不通原因千奇百怪但八成逃不出这几类片选不对、时钟不对、模式不对、硬件连接不对。我整理了一个排查顺序按这个走基本能定位问题。第一步用示波器看 CS、SCK、SI、SO 四根线。CS 在通信时应该被拉低通信结束后拉高。如果 CS 一直高说明片选控制有问题检查 GPIO 配置和代码逻辑。如果 CS 一直低说明没有正确拉高可能是代码里忘了或者被其他外设干扰。第二步看 SCK 有没有波形。如果没有检查 LPSPI 的时钟使能和分频配置。如果有波形但频率不对重新计算分频系数。我遇到过一种情况时钟源选错了以为总线是 60MHz实际是 48MHz导致 SCK 频率偏差很大MRAM 直接不响应。第三步看 SI 上的数据。发送 0x06WREN时SI 上应该出现 00000110 的波形。如果数据不对检查发送函数的字节序和位序。SPI 是 MSB 先发有些工程师习惯 LSB 先发结果数据全反了。第四步看 SO 上的数据。读状态寄存器时SO 上应该有返回数据。如果 SO 一直是高阻或者固定电平检查 MRAM 的供电和 HOLD 引脚。HOLD 悬空会导致 SO 高阻这是新手常犯的错误。4.2 数据写入后读出不匹配的调试记录有一次调试写入的数据读出来总是差一个字节比如写 0x01 0x02 0x03读出来是 0x00 0x01 0x02。查了半天发现是 CS 拉高的时机不对。MRAM 在 SCK 最后一个下降沿采样数据如果 CS 在最后一个下降沿之前就拉高了最后一个字节就会丢失。解决方法是调整 CCR 寄存器的 PCSSCK 位增加 CS 拉高前的延迟。我把 PCSSCK 从 0 改成 2问题消失。这个参数在数据手册里叫“CS 保持时间”MR25H40CDF 要求至少 5ns但实际调试时留 20ns 以上更稳妥。还有一种情况写入的数据偶尔错位读出来是乱码。这通常是电源纹波导致的。用示波器看 VCC 引脚如果看到明显的毛刺就在 VCC 和 GND 之间再并一个 0.01uF 的电容专门滤高频。我试过加了这个电容后误码率从千分之一降到零。4.3 高频写入时的性能瓶颈与优化MRAM 写入虽然快但如果每写一个字节都调用一次函数开销还是不小。我实测过用单字节写入函数每秒最多写 5 万次左右CPU 占用率很高。优化方法是批量写入把要写的数据先攒在 RAM 缓冲区里攒够 64 字节或者 256 字节再一次性写入 MRAM。批量写入的代码逻辑是维护一个写缓冲区当缓冲区满或者达到定时时间比如 10ms触发一次批量写入。写入时用连续写模式发一次 WRITE 指令和起始地址然后连续发数据。这样能把 SPI 的帧开销摊薄实测每秒可以写 50 万字节以上提升了十倍。还有一个优化点是 DMA。MKV58 的 LPSPI 支持 DMA 请求配置好 DMA 通道后CPU 只需要设置好源地址、目的地址和长度剩下的交给 DMA 控制器。我测过用 DMA 写 1KB 数据CPU 占用时间不到 10us几乎可以忽略不计。DMA 配置的坑在于源地址和目的地址的位宽必须和 FIFO 匹配LPSPI 的 FIFO 是 32 位所以 DMA 传输宽度要设成 32 位否则会出现数据错位。4.4 常见问题速查表现象可能原因解决方法CS 无波形GPIO 未配置或代码未拉低检查引脚复用和片选控制代码SCK 无波形LPSPI 时钟未使能或分频错误检查 SCGC 寄存器和 CCR 配置读出的数据全为 0xFFSO 引脚悬空或 HOLD 未拉高检查 SO 连接HOLD 接 VCC写入后读出数据错位CS 拉高时机不对增加 CCR 的 PCSSCK 延迟数据偶尔跳变电源纹波或干扰增加去耦电容远离干扰源高频写入时丢数据单字节写入开销大改用批量写入或 DMA掉电后数据丢失电源监测响应太慢加大电容优化中断优先级5. 工业场景下的可靠性加固经验5.1 温度漂移与长期稳定性的实测数据MR25H40CDF 的工业级温度范围是零下 40 度到零上 85 度但实际在零下 40 度时SPI 时序参数会发生变化。我在高低温箱里做过测试零下 40 度时SCK 的上升沿变缓如果时钟频率还是 30MHz偶尔会出现采样错误。解决办法是降频零下 40 度时把 SCK 降到 15MHz零上 85 度时再恢复。这个切换可以在系统启动时读温度传感器自动调整分频系数。长期稳定性方面我做过一个 1000 小时的连续写入测试每秒写 100 次总共写了 3.6 亿次。MRAM 没有出现任何坏点数据全部正确。这个测试结果让我对 MRAM 的寿命很有信心。但要注意测试时环境温度是 25 度高温下的寿命会有所下降具体数据可以参考芯片手册的寿命曲线。5.2 电磁兼容性设计与抗干扰措施工业现场的电磁干扰很严重变频器、接触器、电机启停都会产生强烈的电磁脉冲。MRAM 和 MKV58 之间的 SPI 走线如果处理不好很容易受干扰。我的做法是SPI 走线尽量短最好在同一层不要换层如果必须换层在过孔旁边加一个地过孔提供回流路径。另外在 MRAM 的 VCC 引脚上串一个磁珠能有效抑制高频干扰。磁珠选 100MHz 时阻抗 600 欧姆的对 SPI 的 30MHz 信号影响很小但对几十兆以上的干扰衰减很大。我实测过加了磁珠后辐射发射测试的余量增加了 6dB。还有一点MRAM 的 WP 引脚在系统正常运行时应该拉高但在系统复位或者看门狗触发时要确保 WP 被拉低防止误写。我的做法是用一个 RC 电路复位时电容放电WP 被拉低复位结束后电容充电WP 被拉高。这样不需要软件干预硬件自动完成保护。5.3 数据备份与恢复策略再可靠的存储也有万一所以关键数据要有备份。我的策略是“三副本”主数据存在 MRAM 的扇区 A备份数据存在扇区 B再在 MKV58 的片上 Flash 里存一份。每次写入时先写 MRAM 扇区 A再写扇区 B最后写 Flash。读取时先读扇区 A如果 CRC 校验失败读扇区 B再失败就读 Flash。这种策略的代价是写入时间增加三倍但 MRAM 写入本来就快三倍之后也就几十微秒对系统影响不大。片上 Flash 的写入速度慢一些但它是最后一道防线不需要频繁写可以每 100 次 MRAM 写入才同步一次。恢复策略也很重要。系统启动时先检查三个副本的 CRC选最新的有效数据加载。如果三个副本都损坏就加载默认参数并记录故障日志。故障日志本身也存在 MRAM 里用单独的扇区只写不擦写满后从头覆盖。6. 从项目实战中提炼的几条硬核心得6.1 调试工具的选择与使用技巧调试 SPI 通信逻辑分析仪是必备的。我用的是一款 8 通道、100MHz 采样率的逻辑分析仪价格不贵但很实用。抓波形时把 CS、SCK、SI、SO 四根线都接上设置 SPI 协议解码直接看解码后的数据比人眼数波形快得多。示波器也要有重点看信号质量。我一般看三个参数上升时间、过冲、振铃。上升时间要小于时钟周期的十分之一20MHz 时钟周期是 50ns上升时间要小于 5ns。过冲不要超过 0.5V振铃要尽快衰减。如果信号质量不好先检查走线和端接不要急着改代码。还有一个小技巧在 SPI 的 SCK 线上串一个 22 欧姆的电阻能有效抑制振铃。这个电阻叫“源端匹配电阻”阻值等于走线特征阻抗减去驱动源阻抗。实际选的时候从 10 欧姆到 50 欧姆试看哪个阻值下波形最干净。6.2 代码层面的防御性编程实践嵌入式代码最怕的就是“想当然”。我写 MRAM 驱动时每个函数入口都加参数检查地址范围、数据指针、长度一个都不能少。如果参数不合法直接返回错误码不要硬着头皮往下执行。SPI 传输函数里加超时机制。等待 WIP 位清零时如果超过 1ms 还没清零就返回超时错误并记录日志。工业现场什么怪事都有MRAM 也有可能因为电源问题不响应超时机制能防止程序卡死。还有所有对 MRAM 的写操作都要先读后写。比如要修改一个配置参数先读出整个扇区在 RAM 里改好算好 CRC再整体写回去。不要直接往某个地址写一个字节那样容易破坏数据帧结构。6.3 项目后续可以扩展的方向这套存储方案目前只用了 MRAM 的 4Mbit 空间如果数据量更大可以换用容量更大的 MRAM比如 16Mbit 的型号引脚兼容代码只需要改地址位数。另外MKV58 还有 FlexSPI 接口可以接第二颗 MRAM 做双通道进一步提高吞吐量。软件层面可以加一个简单的日志系统把运行数据按时间顺序存成文件通过串口或者以太网导出。这样现场调试时不用拆机就能看到历史数据。我下一个项目就打算这么做用 MRAM 存日志用 MKV58 的以太网模块传输形成一个完整的工业数据记录方案。最后分享一个小技巧MRAM 的写入次数虽然接近无限但读取次数也是有限的虽然很高但极端情况下也要注意。我的做法是频繁读取的数据在 RAM 里做缓存减少对 MRAM 的直接读取。这样既能延长寿命又能提高读取速度一举两得。
返回列表