ARTICLE DETAIL

资讯详情

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

STM32L162ZE与MR25H40CDF工业级MRAM存储方案实战

STM32L162ZE与MR25H40CDF工业级MRAM存储方案实战 1. 项目缘起与方案选型1.1 为什么要在工业场景里折腾 MRAM 这颗料做工业嵌入式这行十来年掉电丢数据这个坑我踩过太多次了。早些年用 EEPROM 存标定参数写一次要等 5ms产线工人一天要标定几百台设备光等写入就能把人急死后来换 FRAM速度快了但容量小、价格高而且很多型号供货周期飘忽不定。再后来接触到 MRAM磁性随机存储器才算找到一个相对平衡的方案。MR25H40CDF 是 Everspin 出的 4Mbit 串行 MRAMSPI 接口512K x 8 的组织方式。它最吸引我的地方有三个第一写入不需要擦除字节级随机写不像 Flash 那样必须先擦一个扇区第二写入速度是纳秒级SPI 时钟能跑到 40MHz写一个字节基本就是总线传输时间第三理论上无限次擦写寿命没有 Flash 那种 10 万次的焦虑。这三点放在工业数据记录、参数存储、掉电保护这些场景里简直是量身定做。STM32L162ZE 是 ST 家的低功耗 Cortex-M3带 192KB Flash、16KB SRAM外设资源够用关键是它有硬件 SPI 和 LCD 控制器做工业 HMI 面板很合适。L 系列主打低功耗很多工业现场设备是电池或者 24V 供电功耗敏感选它没毛病。这个组合的核心价值在于用一颗几乎不用操心寿命和写入延迟的存储器配合一颗低功耗主控做出一套“数据想存就存、掉电也不怕”的存储方案。适合做工业仪表、数据记录仪、设备参数管理、黑匣子这类应用的工程师参考。1.2 硬件连接方案与引脚分配MR25H40CDF 是标准的 8 脚 SOIC 封装引脚定义很清晰CS、SO、SI、SCK、VDD、VSS、WP、HOLD。实际用的时候WP 和 HOLD 这两个脚我一般直接拉高除非你确实需要硬件写保护或者暂停传输否则没必要占用 MCU 的 GPIO。和 STM32L162ZE 连接我用的是 SPI2因为 SPI1 留给板子上的另一颗 Flash 了。具体分配如下MR25H40CDF 引脚STM32L162ZE 引脚说明CSPB12硬件片选也可以用软件片选SOPB14MISOSIPB15MOSISCKPB13时钟WP3.3V硬件写保护关闭HOLD3.3V不暂停传输VDD3.3V供电VSSGND地这里有个细节要注意MR25H40CDF 的供电范围是 2.7V 到 3.6VSTM32L162ZE 的 IO 也是 3.3V电平匹配没问题不需要电平转换。但如果你用的是 5V 主控那就必须加电平转换芯片否则会打坏 MRAM。关于片选我强烈建议用硬件片选NSS 由 SPI 外设自动控制而不是软件 GPIO 拉低拉高。原因很简单MRAM 的 SPI 时序对 CS 的建立和保持时间有要求软件片选在中断打断的时候容易出问题硬件片选由 SPI 外设硬件控制时序更稳。当然如果你 SPI 外设的 NSS 引脚被占用了那就只能用软件片选但记得在 CS 拉低和拉高之间不要插入任何可能被打断的操作。1.3 SPI 模式与时钟配置的取舍MR25H40CDF 支持 SPI Mode 0 和 Mode 3也就是 CPOL0/CPHA0 或者 CPOL1/CPHA1。我一般用 Mode 0因为大部分 STM32 的 SPI 例程默认就是 Mode 0改起来麻烦少。时钟频率方面MR25H40CDF 最高支持 40MHz。STM32L162ZE 的 SPI2 挂在 APB1 上最高 32MHz。所以实际能跑到的最高时钟是 32MHz达不到 40MHz。不过 32MHz 已经够快了读一个字节大概 0.25us写一个字节也差不多这个量级。如果你对速度没那么极致的要求跑 16MHz 或者 8MHz 也完全够用而且时序余量更大PCB 布线不好的时候更稳。这里给一个 SPI 初始化的关键参数表参数值说明模式Master主模式数据宽度8 bit字节传输时钟极性LowCPOL0时钟相位1 EdgeCPHA0NSSHardware硬件片选预分频232MHz首比特MSB高位先出CRCDisable不用 CRC注意MRAM 的 SPI 时序里CS 拉低到第一个时钟沿之间需要至少 5ns 的建立时间STM32 硬件 NSS 自动满足这个要求但软件片选的时候要确保拉低 CS 之后稍微延时一下再发数据。2. MRAM 读写机制与 STM32 驱动实现2.1 MR25H40CDF 的指令集与操作逻辑MR25H40CDF 的指令集不复杂常用的就几条WREN写使能0x06、WRDI写禁止0x04、RDSR读状态寄存器0x05、WRSR写状态寄存器0x01、READ读数据0x03、WRITE写数据0x02。还有高速读指令 0x0B但一般用不上。这里要重点说一下写操作的流程。MRAM 虽然不需要擦除但写之前必须先发 WREN 指令把内部的写使能锁存器置位。然后发 WRITE 指令后面跟 3 个字节的地址因为 4Mbit 512KB需要 19 位地址用 3 个字节表示再跟要写的数据。CS 拉高之后数据才真正写入。如果你发了 WRITE 指令但没先发 WREN写操作会被忽略而且状态寄存器里的 WEL 位不会置位。读操作就简单了直接发 READ 指令 3 字节地址然后时钟继续打数据就从 SO 脚出来了。可以连续读地址会自动递增读到 0x7FFFF 之后会回卷到 0x00000。状态寄存器只有 bit0WEL和 bit1BP0、bit2BP1有用。WEL 表示写使能锁存器状态BP0/BP1 是块保护位可以保护部分地址区域不被写入。我一般不用块保护因为工业场景里经常需要全片读写保护了反而麻烦。2.2 底层驱动代码的编写要点先贴一段我实际项目里用的 SPI 初始化代码基于 STM32 HAL 库void MRAM_SPI_Init(void) { hspi2.Instance SPI2; hspi2.Init.Mode SPI_MODE_MASTER; hspi2.Init.Direction SPI_DIRECTION_2LINES; hspi2.Init.DataSize SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity SPI_POLARITY_LOW; hspi2.Init.CLKPhase SPI_PHASE_1EDGE; hspi2.Init.NSS SPI_NSS_HARD_OUTPUT; hspi2.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_2; hspi2.Init.FirstBit SPI_FIRSTBIT_MSB; hspi2.Init.TIMode SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial 10; HAL_SPI_Init(hspi2); }然后是写使能和写操作的封装void MRAM_WriteEnable(void) { uint8_t cmd 0x06; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi2, cmd, 1, 100); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); } void MRAM_Write(uint32_t addr, uint8_t *data, uint16_t len) { uint8_t cmd[4]; cmd[0] 0x02; cmd[1] (addr 16) 0xFF; cmd[2] (addr 8) 0xFF; cmd[3] addr 0xFF; MRAM_WriteEnable(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi2, cmd, 4, 100); HAL_SPI_Transmit(hspi2, data, len, 1000); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); }读操作void MRAM_Read(uint32_t addr, uint8_t *buf, uint16_t len) { uint8_t cmd[4]; cmd[0] 0x03; cmd[1] (addr 16) 0xFF; cmd[2] (addr 8) 0xFF; cmd[3] addr 0xFF; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi2, cmd, 4, 100); HAL_SPI_Receive(hspi2, buf, len, 1000); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); }这里有个坑要提醒HAL_SPI_Transmit 和 HAL_SPI_Receive 在连续调用的时候中间 CS 不能拉高否则指令序列就断了。我上面代码里 CS 是在整个操作前后才动的中间不动这是对的。但如果你用 HAL_SPI_TransmitReceive 分开写要注意 CS 的管理。还有一个细节MRAM 写完之后数据是立即生效的不需要等待写完成。但如果你连续写多个字节中间不需要重新发 WREN因为 WREN 在 CS 拉高之后才会被清除。所以一次 WRITE 操作可以写多个字节只要 CS 保持低。2.3 地址管理与数据组织策略512KB 的空间说大不大说小不小。工业应用里我一般把空间分成几个区域地址范围用途说明0x00000 - 0x00FFF系统参数区设备ID、版本号、标定系数0x01000 - 0x01FFF备份参数区系统参数的备份用于恢复0x02000 - 0x7FFFF数据记录区循环记录带时间戳系统参数区我一般用结构体来组织写的时候直接按结构体大小写入读的时候按结构体解析。但要注意字节对齐问题STM32 是 little-endianMRAM 也是按字节存所以结构体直接 memcpy 就行不需要额外转换。数据记录区我用循环队列的方式每一条记录包含时间戳、数据长度、数据内容和 CRC 校验。写指针存在参数区里每次写记录之前先更新写指针再写数据最后更新写指针。这样即使写数据的过程中掉电最多丢一条记录不会把整个队列搞乱。实操心得MRAM 虽然写入快但也不是无限快。连续写的时候SPI 总线的带宽是瓶颈。32MHz 时钟下理论最大写入速度是 4MB/s但实际因为指令开销和 CS 切换能到 1MB/s 就不错了。如果你要记录高频数据建议先在 RAM 里缓冲攒够一批再写 MRAM。3. 工业场景下的数据存储与读取实战3.1 掉电保护与数据完整性设计工业现场最怕的就是掉电丢数据。MRAM 本身不怕掉电但如果你在写数据的过程中掉电数据可能只写了一半。所以需要一套完整性保护机制。我的做法是每条记录后面跟一个 CRC16 校验读的时候先校验 CRC校验不过就认为这条记录无效跳过。写的时候先写数据再写 CRC最后更新写指针。这样即使掉电发生在写数据的过程中写指针还没更新下次上电会从旧的写指针位置重新写覆盖掉不完整的数据。具体流程读当前写指针在写指针位置写入数据计算 CRC写入 CRC更新写指针到下一个位置如果写指针超出范围回卷到起始地址这个流程里第 4 步是关键。写指针更新必须是原子操作不能被打断。我一般用关中断的方式来保护因为写指针只有 4 个字节关中断时间很短不影响系统实时性。还有一个细节MRAM 的写入是字节级的但 SPI 传输是字节流。如果你写一个 4 字节的写指针中间掉电可能只写了 2 个字节。所以写指针本身也需要保护。我的做法是写指针存两份一份在参数区一份在备份区上电的时候比较两份如果不一样用 CRC 校验哪份是完整的。3.2 参数存储与版本管理工业设备经常需要现场标定标定参数需要保存。我用 MRAM 存参数的时候会加一个版本号和 CRC。版本号每次参数修改就加一CRC 用来校验参数完整性。参数结构体大概长这样typedef struct { uint16_t version; uint32_t device_id; float calib_k; float calib_b; uint16_t crc; } DeviceParams_t;写参数的时候先算 CRC再整体写入。读参数的时候先读出来校验 CRC如果 CRC 不对就从备份区读。备份区是参数区的一个镜像每次写参数的时候同时写两份。这里有个经验参数区不要放在地址 0 开始的地方因为有些 MRAM 在上电的时候地址 0 可能会有不确定的状态。我一般从 0x100 开始放参数前面留一点空间做保留。3.3 高速数据记录的实现有些应用需要记录高速数据比如振动传感器、电流波形。这种场景下SPI 的带宽是瓶颈。我的做法是在 RAM 里开一个环形缓冲区大小根据 RAM 剩余空间定一般 4KB 到 8KB数据先写入 RAM 缓冲区当缓冲区半满或者全满的时候触发 DMA 传输到 MRAMDMA 传输完成中断里更新写指针用 DMA 的好处是 CPU 不用管数据传输可以继续处理其他任务。STM32L162ZE 的 SPI2 支持 DMA配置起来也不复杂。DMA 配置的关键点// DMA 发送配置 hdma_spi2_tx.Instance DMA1_Channel5; hdma_spi2_tx.Init.Direction DMA_MEMORY_TO_PERIPH; hdma_spi2_tx.Init.PeriphInc DMA_PINC_DISABLE; hdma_spi2_tx.Init.MemInc DMA_MINC_ENABLE; hdma_spi2_tx.Init.PeriphDataAlignment DMA_PDATAALIGN_BYTE; hdma_spi2_tx.Init.MemDataAlignment DMA_MDATAALIGN_BYTE; hdma_spi2_tx.Init.Mode DMA_NORMAL; hdma_spi2_tx.Init.Priority DMA_PRIORITY_HIGH; HAL_DMA_Init(hdma_spi2_tx); __HAL_LINKDMA(hspi2, hdmatx, hdma_spi2_tx);注意DMA 传输的时候CS 必须保持低电平。如果你用硬件 NSSSPI 外设在 DMA 传输期间会自动控制 CS没问题。但如果你用软件 NSS必须在启动 DMA 之前拉低 CSDMA 完成中断里拉高 CS中间不能被打断。3.4 读取性能优化与缓存策略读 MRAM 比写简单但也有一些优化空间。如果你的应用需要频繁读取某些参数可以在 RAM 里做缓存。比如设备参数上电的时候读一次缓存在 RAM 里后续直接读 RAM只有参数修改的时候才写 MRAM 并更新缓存。对于数据记录区的读取如果数据量大可以用批量读取。MRAM 支持连续读地址自动递增所以一次 SPI 传输可以读很多字节。我一般一次读 256 字节或者 512 字节减少 CS 切换次数。还有一个技巧如果你需要读取的数据在 MRAM 里是连续存放的可以用 DMA 接收进一步降低 CPU 占用。DMA 接收的配置和发送类似只是方向反过来。4. 常见问题排查与避坑指南4.1 SPI 通信失败排查流程SPI 通信失败是最常见的问题我一般按以下顺序排查步骤检查项可能问题解决方法1供电MRAM 没供电或电压不对万用表量 VDD确保 3.3V2片选CS 没拉低或拉低不够示波器看 CS 波形3时钟SCK 没输出或频率不对示波器看 SCK确认预分频4模式CPOL/CPHA 不对改成 Mode 0 试试5数据MOSI/MISO 接反检查 PCB 连线6指令WREN 没发或发错逻辑分析仪抓 SPI 波形我遇到过最诡异的一次是 CS 拉低了但 SCK 没输出查了半天发现是 SPI 外设的时钟没使能。STM32 的 SPI2 挂在 APB1 上__HAL_RCC_SPI2_CLK_ENABLE() 这行代码漏了SPI 寄存器写不进去自然没输出。还有一次是 MISO 一直高电平读出来全是 0xFF。后来发现是 MRAM 的 HOLD 脚悬空了被干扰拉低导致 MRAM 一直处于暂停状态。把 HOLD 拉高就好了。4.2 写入失败与数据错乱分析写入失败一般有几个原因第一WREN 没发或者发完之后 CS 拉高了。WREN 指令必须在 CS 拉低的状态下发发完之后 CS 不能拉高要紧接着发 WRITE 指令。如果你用 HAL_SPI_Transmit 发 WREN函数返回之后 CS 会被 HAL 库自动拉高如果你配置了硬件 NSS那 WREN 就失效了。所以 WREN 和 WRITE 必须在同一个 CS 低电平周期内完成。第二地址越界。MR25H40CDF 的地址范围是 0x00000 到 0x7FFFF如果你写了 0x80000地址会回卷到 0x00000数据就写到别的地方去了。所以写之前一定要检查地址范围。第三块保护位被设置了。状态寄存器的 BP0/BP1 如果被置位对应的地址区域会被保护写不进去。上电的时候读一下状态寄存器确认 BP0/BP1 是 0。第四电源不稳。MRAM 在写入的时候电流会比读的时候大如果电源纹波太大可能导致写入失败。建议在 MRAM 的 VDD 脚旁边放一个 0.1uF 的陶瓷电容离引脚越近越好。4.3 时序余量与 PCB 布线建议SPI 跑高速的时候PCB 布线很关键。我总结了几条经验SCK 走线尽量短不要有过孔如果必须过孔不要超过 2 个MISO 和 MOSI 不要平行走太长避免串扰CS 走线远离 SCK避免耦合MRAM 的 VDD 和 GND 之间加 0.1uF 电容越近越好如果 SPI 频率超过 16MHz建议在 SCK 上串一个 22 欧姆的电阻减少反射还有一点MRAM 的 WP 和 HOLD 脚如果不用直接拉高不要悬空。悬空的话外部干扰可能让这两个脚电平跳变导致写保护或者传输暂停。4.4 低功耗设计中的注意事项STM32L162ZE 主打低功耗但 MRAM 在待机的时候也有功耗。MR25H40CDF 的待机电流大概是 10uA 左右不算大但如果你的系统要求极致低功耗可以在不用的时候把 MRAM 的供电切断。不过切断供电有个问题MRAM 虽然是非易失的但上电之后需要一点时间才能稳定。如果你频繁切断供电每次上电都要等 MRAM 稳定反而影响响应速度。我的做法是如果系统进入低功耗模式MRAM 的 CS 保持高电平SPI 外设关闭MRAM 进入待机模式功耗降到 10uA 以下。如果系统完全断电那 MRAM 数据也不会丢下次上电直接读就行。还有一个细节STM32L162ZE 的 SPI 外设在低功耗模式下可以关闭但关闭之前要确保没有正在进行的传输。如果 DMA 还在传输直接关 SPI 会导致数据错乱。所以进低功耗之前先检查 DMA 状态等传输完成再关。5. 性能实测与方案对比5.1 读写速度实测数据我用逻辑分析仪抓了实际波形测了一下读写速度。测试条件SPI 时钟 32MHzMode 0硬件 NSS。操作数据量耗时等效速度单字节写1 字节约 1.2us0.83MB/s256 字节连续写256 字节约 68us3.76MB/s单字节读1 字节约 0.9us1.11MB/s256 字节连续读256 字节约 66us3.88MB/s可以看到连续读写的时候速度接近 SPI 总线的理论极限32MHz / 8 4MB/s单字节操作因为指令开销速度会低一些。所以批量操作的时候尽量一次多传一些数据减少指令开销。5.2 与 EEPROM、FRAM、Flash 的对比特性MR25H40CDFEEPROMFRAMNOR Flash写入速度纳秒级毫秒级纳秒级毫秒级需擦除擦写寿命无限100万次10^14次10万次写入方式字节级字节级字节级扇区级容量512KB通常小于 128KB通常小于 256KB1MB 到 16MB功耗低中低中成本高低高低从表里可以看出MRAM 的优势在于写入速度和寿命劣势在于成本和容量。如果你的应用需要频繁写入、掉电保护、长寿命MRAM 是首选。如果只是存一些不常改的参数EEPROM 就够了。如果需要大容量存储Flash 更合适。5.3 实际项目中的选型建议我做过一个工业数据记录仪的项目要求每秒记录 100 次传感器数据每次 32 字节设备寿命 10 年。算一下总写入量100 次/秒 * 32 字节 * 3600 秒 * 24 小时 * 365 天 * 10 年 约 1TB 的写入量。如果用 EEPROM100 万次擦写寿命每个地址写 100 万次总容量 128KB那总写入量是 128KB * 100万 128GB不够。如果用 Flash10 万次擦写1MB 容量总写入量 100GB也不够。只有 MRAM无限擦写512KB 容量可以循环写总写入量不受寿命限制只要容量够周转就行。所以这个项目我选了 MR25H40CDF实际跑下来数据记录很稳没有丢过数据。6. 进阶应用与扩展思路6.1 多设备共享 SPI 总线的注意事项如果你的系统里有多颗 SPI 设备共享 SCK、MOSI、MISO每颗设备独立 CS那要注意几点第一同一时刻只能有一颗设备的 CS 拉低否则数据会冲突。软件上要保证 CS 互斥最好用 RTOS 的互斥锁来保护。第二不同设备的 SPI 模式可能不一样。比如 MRAM 用 Mode 0但另一颗 Flash 可能用 Mode 3。切换设备的时候要重新配置 SPI 模式不能直接切换 CS。第三MISO 线上如果有多颗设备不用的设备 MISO 应该是高阻态。但有些设备 MISO 不是高阻态会拉低总线导致通信失败。这种情况下需要加一个多路复用器或者用二极管隔离。6.2 数据加密与安全存储工业设备的数据有时候需要保密比如配方参数、标定系数。MRAM 本身没有加密功能但可以在写入之前用软件加密。我一般用 AES-128 加密密钥存在 STM32L162ZE 的 Flash 里或者用芯片的唯一 ID 派生。加密之后的数据写入 MRAM读出来再解密。这样即使有人把 MRAM 拆下来读也拿不到明文数据。不过加密会增加 CPU 开销AES-128 加密 32 字节大概需要几十微秒如果数据量大可能影响实时性。所以加密策略要根据实际需求来定不是所有数据都需要加密。6.3 固件升级与参数迁移设备固件升级的时候参数可能需要迁移。比如新固件增加了新的参数项旧参数需要保留新参数给默认值。我的做法是在参数区加一个版本号升级的时候读旧版本参数根据版本号决定怎么迁移。MRAM 的好处是升级过程中如果掉电参数不会丢。下次上电继续升级读到的还是旧参数不会出现参数丢失的情况。这一点比 Flash 强Flash 在擦除的时候掉电整个扇区都可能丢。7. 调试工具与实操技巧7.1 逻辑分析仪抓 SPI 波形的要点调试 SPI 的时候逻辑分析仪是必备工具。我一般用 8 通道的接 CS、SCK、MOSI、MISO 四根线就够了。抓波形的时候要注意几点采样率要足够高至少是 SPI 时钟的 10 倍。32MHz 的 SPI采样率至少 320MHz一般逻辑分析仪达不到那就用 100MHz 采样虽然波形有点失真但看指令和数据还是够的。触发条件设成 CS 下降沿这样每次 CS 拉低都会触发方便抓完整的操作序列。解码的时候选 SPI 协议设置好 CPOL、CPHA、MSB/LSB逻辑分析仪会自动解析出指令和数据。我遇到过一个问题逻辑分析仪抓到的数据是对的但 MRAM 就是写不进去。后来发现是逻辑分析仪的探头电容太大影响了 SPI 信号质量。换了一根短的探头线就好了。所以抓波形的时候探头线尽量短不要绕来绕去。7.2 用 STM32CubeMX 快速生成初始化代码STM32CubeMX 是个好东西SPI 初始化代码可以自动生成省得自己算分频系数。但有几个地方要注意在 SPI 配置界面Mode 选 Full-Duplex MasterHardware NSS Signal 选 Hardware NSS Output这样 CS 由硬件控制。时钟配置界面确认 APB1 的时钟频率SPI2 挂在 APB1 上分频系数根据 APB1 频率算。生成代码的时候选 HAL 库不要选 LL 库LL 库虽然效率高但可读性差调试不方便。生成的代码里MX_SPI2_Init() 函数就是初始化代码直接调用就行。但要注意CubeMX 生成的代码默认是 Mode 0如果你需要 Mode 3要手动改。7.3 常见故障速查表现象可能原因排查方法解决方法读出来全是 0xFFMISO 没接或 HOLD 拉低量 MISO 电压检查连线HOLD 拉高读出来全是 0x00MISO 接地或 CS 没拉低量 MISO 电压检查 CS 信号写入后读出来不对WREN 没发或 CS 提前拉高逻辑分析仪抓波形确保 WREN 和 WRITE 在同一 CS 周期偶尔写入失败电源纹波大示波器看 VDD加滤波电容高速时通信不稳定PCB 布线不好降低 SPI 频率试试优化布线加串阻地址越界地址计算错误检查地址范围确保地址在 0x00000-0x7FFFF这张表是我这些年踩坑总结出来的基本上覆盖了 90% 的 SPI MRAM 问题。遇到问题先查表能省不少时间。8. 写在最后的一些个人体会这个方案我在三个项目里用过最长的已经跑了 5 年数据记录一直很稳。MRAM 这颗料虽然贵但在工业场景里可靠性比成本更重要。一次现场故障的维修成本可能比十颗 MRAM 还贵。STM32L162ZE 和 MR25H40CDF 的搭配我觉得最适合的是中等数据量、高频写入、掉电保护要求高的场景。如果你的数据量特别大比如视频记录那 MRAM 的容量不够还是得用 Flash 或者 SD 卡。如果你的写入频率很低比如一天写一次那 EEPROM 就够了没必要上 MRAM。最后分享一个小技巧MRAM 的 CS 脚上可以加一个下拉电阻比如 10K这样在 MCU 还没初始化的时候CS 保持低电平MRAM 不会误触发。虽然 MRAM 本身有上电复位电路但加个下拉电阻更保险。这个电阻在 PCB 上占不了多少地方但能避免一些莫名其妙的问题。
返回列表