ARTICLE DETAIL

资讯详情

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

基于STM32F7的MRAM实战:MR25H40CDF驱动与掉电保护设计

基于STM32F7的MRAM实战:MR25H40CDF驱动与掉电保护设计 搞嵌入式最怕的事情之一就是设备跑着跑着数据突然没了。这个“数据没了”分两种一种是数据本身丢失一种是存储介质先挂了。这几年在做工业设备、采集终端和现场控制器的时候我反复遇到同一个矛盾既要频繁写、又要掉电保、还得扛得住现场恶劣环境。传统方案里EEPROM容量太小Flash写入之前要擦除、寿命还有上限两者用起来都要小心翼翼地设计。所以当我在一个基于 STM32F732IE 的项目里换成 MR25H40CDF 这颗 SPI 接口的 MRAM 之后整个存储逻辑突然变得简单了写入立刻生效、不用考虑擦除、寿命几乎随便造。今天就把这个组合从选型、硬件接线到驱动实现、掉电保护实战完整拆开讲讲。这篇内容适合正在选型工业存储方案的嵌入式工程师也适合把 MRAM 当大号 EEPROM 来用的朋友。如果你手上正好有 STM32F7 系列的板子或者正在为“频繁写日志怎么不掉数据”发愁那这篇应该能帮你省不少事。1. 为什么这个组合值得用MRAM与M7的选型逻辑1.1 传统存储方案的痛点工业嵌入式设备里的非易失存储需求和消费电子不太一样。消费级设备哪怕数据写坏了重启重新拉一遍也就过去了工业设备不行尤其是仪表、控制器、采集器这一类经常要求断电之后把最后的状态、累计量、标定参数原封不动保留下来而且现场可能一年 365 天都在跑。EEPROM 的问题在于容量小、写速度慢、寿命虽然比 Flash 强但依然有限I2C 接口的 EEPROM 写一页还要等待时间。Flash 的问题更明显写入前必须先擦除擦除粒度是按扇区或者块来的你要是只想改一个字节也得先读出来、擦掉一整块、再写回去。哪怕用 NOR Flash写寿命也只有十万次这个量级真要拿它做频繁日志记录磨损均衡是躲不开的功课。再加上 Flash 写入前有较长的擦除时间掉电保护逻辑稍微写得不严谨数据就会丢在“擦一半写一半”的状态里。这些痛点不是不能解决但解决起来非常繁琐。要么加掉电检测、要么加保护电容、要么设计复杂的双分区切换逻辑。整个系统越复杂出问题的概率就越高。1.2 MR25H40CDF到底是什么MR25H40CDF 是一颗 SPI 接口的 MRAM容量 4Mbit也就是 512KB。MRAM 的中文叫磁阻随机存储器存储单元是靠磁性状态来保持数据的所以你写进去的数据不会因为断电消失也没有电荷泄漏的问题。这颗芯片最大的特点有三个。第一写入不需要擦除任何地址都可以直接覆盖写和 SRAM 的体验非常接近对软件来说省掉一整类逻辑。第二写寿命号称 10 的 10 次方次以上也就是百亿次量级实际产品设计里基本不用考虑磨损问题工业设备天天写日志也能扛到设备报废。第三读写速度比 EEPROM 快得多SPI 时钟最高可以跑到几十 MHz 级别配合 MCU 的 DMA批量读写吞吐量很可观。数据保持方面MRAM 通常能做到 10 年以上工作温度范围覆盖工业级。这些指标放在一起就决定了它特别适合做工业现场的“频繁写入 掉电保持”场景。和同样不需要擦除的 FRAM 相比MRAM 在抗辐射、温度范围和高低温一致性上有自己的优势很多现场级设备宁可多花一点成本也愿意选它。1.3 搭配STM32F732IE的优势STM32F732IE 是意法半导体的一颗 M7 内核芯片主频最高 216MHz带 FPU 和 DSP 指令512KB 内部 Flash256KB SRAM。选它搭配 MRAM主要是看中三点。第一SPI 带宽够。MRAM 虽然快但如果你用的是一片老旧的 M0 或者 M3主频太低、DMA 通道不够多也很难把 SPI 那点时钟吃满。F732 的 SPI1/SPI4 挂在高速 APB2 总线上配合 DMA 可以做到非常高的连续读写吞吐记录高频数据时不会成为瓶颈。第二内部资源丰富。F732 系列带硬件 CRC、带 PVD 电源检测、带多路 DMA这些恰好都是做掉电保护和数据校验需要的。尤其是 PVD后面掉电保护方案里可以直接用。第三工业通信接口齐全。现场设备往往还要同时跑 Modbus、CAN、RS485 或者以太网协议F732 的 CAN、UART、SPI、I2C 资源足够不会出现“接口不够只能外扩”的情况。MRAM 在这个方案里负责参数存储和日志记录MCU 负责业务逻辑各干各的配合很顺。2. 硬件接线与电路设计要点2.1 引脚功能与最小接线MR25H40CDF 是标准的 SPI NOR Flash 类引脚定义常用 SOP-8 封装。和 Flash 最大的区别是内部没有擦除限制但外部引脚的接法非常接近。功能引脚主要是这些CS片选低电平有效必须由 MCU 的 GPIO 控制不要用硬件 NSS 自动控制SCKSPI 时钟SI / MOSI主发从收MCU 发送数据给 MRAMSO / MISO主收从发MRAM 输出数据给 MCUWP写保护输入低电平有效正常使用必须拉高HOLD保持输入低电平有效正常使用必须拉高VCC、GND电源和地上电之后给 WP 和 HOLD 接上拉电阻到 VCCCS 接一个普通 GPIOSCK、MOSI、MISO 分别接 STM32F732IE 的 SPI1 或 SPI4 对应引脚。以 SPI1 为例常用映射是 SCK-PA5、MOSI-PA7、MISO-PA6CS 可以任意选一个 GPIO比如 PA4。注意MR25H40CDF 的 WP 和 HOLD 两个引脚如果悬空会带来非常奇怪的偶发故障。WP 一旦被噪声拉低写使能不生效你发完 WREN 再写数据芯片根本不响应HOLD 一旦在传输过程中被拉低SPI 时序会当场暂停MCU 侧不知道结果就是数据错位。所以这两个引脚必须上拉最好靠近芯片引脚放 10kΩ 电阻。2.2 需要特别留心的几个引脚CS 引脚看似简单实际上踩坑率很高。MRAM 的每个命令都是靠 CS 的下降沿开始、上升沿结束来界定的CS 拉高的时机必须准确。有的工程师图省事把 CS 接到了 SPI 的硬件 NSS 上让外设自动管理结果自动 NSS 在传输 DMA 数据时提前变了电平导致命令被截断。所以我一直建议 CS 用普通 GPIO 手动拉低拉高多写两句代码换来的是稳定可靠。还有一个值得留意的地方是 WP 和 HOLD 的时序。MR25H40C 的命令发送期间WP 必须保持高电平否则写操作会被忽略。HOLD 则更隐蔽它主要用在多主机冲突场景或者 MCU 需要暂停访问的时候普通单主机系统用不到这个功能所以干脆拉高不动。电源引脚旁边要放去耦电容一般 0.1μF 并联一个 4.7μF 或者 10μF 的电解电容。MRAM 在高速翻转的时候对电源瞬态响应有要求去耦做不好高速连续读的时候偶尔会出现一位数据错误排查起来极其痛苦。2.3 PCB布局与电源处理SPI 是同步串行接口但对工业现场来说信号质量仍然值得注意。SCK、MOSI、MISO 这三根线尽量短别在板子上绕远路更不要跨过开关电源区域。走线宽度按常规信号线即可不需要像差分信号那样做阻抗匹配但建议三根线尽量等长至少不要让 MISO 比 SCK 长出去太多否则高速时钟下采样点会偏移。如果 MCU 和 MRAM 距离比较远比如超过 5cm可以在 SCK 和 MOSI 上串 22Ω 到 33Ω 的小电阻抑制反射。MISO 上不建议串电阻因为会影响上升沿。千万别把 SPI 线拉到排线或者长导线上跑 40MHz那种用法九成会出问题老老实实降速到 10MHz 以下用。电源方面如果系统里还有电机、继电器这类强干扰源MRAM 的 VCC 最好用磁珠或者小电阻隔离一下再并一个 100μF 的铝电解电容。MCU 和 MRAM 的参考地要单独铺一块完整的铜皮不要在底层走一条细地线绕一圈回来这样地回路太长高速切换时噪声会很大。3. SPI驱动开发从初始化到读写函数3.1 先用CubeMX生成SPI基础配置用 STM32CubeMX 配置 STM32F732IE 的 SPI1 时几个关键参数按这样设置ModeFull-Duplex MasterNSSSoftwareData Size8bitFirst BitMSB FirstClock PolarityLowClock Phase1 EdgeBaud Rate Prescaler4时钟极性和相位选 Mode 0也就是 CPOL0、CPHA0。MR25H40CDF 支持 Mode 0 和 Mode 3选 Mode 0 最通用。重点说下预分频。F7 的 SPI1 挂在 APB2 总线上APB2 最高 108MHz预分频选 2 的话 SPI 时钟是 54MHz虽然芯片标称能跑几十 MHz但 54MHz 可能触及上限留裕量起见选 4得到 27MHz这样稳定性好很多。数据手册上标的最高频率和实际流水线上的余量是两码事现场环境有温度漂移、有电源噪声按 50% 的裕量跑很多诡异问题直接就不存在了。初始化代码生成后确认 GPIO 复用设置SCK、MOSI、MISO 配置为复用推挽模式速度选 HighCS 引脚配置为普通推挽输出初始输出高电平。3.2 MR25H40CDF指令集快速上手这颗芯片的指令集和常见的串行 NOR Flash 基本一致核心就几条0x06Write Enable写使能每次写操作之前必须发0x04Write Disable写禁止0x02Page Program 风格的标准写入命令但我更愿意直接称之为 Write 命令发送后直接写数据不需要等内部擦除0x03Read Data读取命令0x0BFast Read快速读取多一个 dummy 周期适合高速连续读0x05Read Status Register读状态寄存器0x01Write Status Register写状态寄存器每次操作的基本流程都差不多CS 拉低发送命令字节发送 24 位地址然后发送或者接收数据最后 CS 拉高。地址虽然用 24 位格式发送但 MR25H40CDF 只有 512KB 空间实际有效地址是 0x000000 到 0x07FFFF高 5 位地址无效发送时置 0 就行。写操作之所以要先发 0x06是因为芯片上电后默认写使能是关闭的这是安全设计。发送 0x06 后芯片内部会把 WEL 位置 1这个状态一直保持到下一条写命令结束所以每次写之前都要重新发 0x06千万不要只在初始化的时候发一次。3.3 基础读写函数与验证方法下面这套代码是我在项目里实际跑通过的基于 HAL 库逻辑不复杂。先定义 CS 控制宏#define MR25_CS_LOW() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET) #define MR25_CS_HIGH() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)单字节收发函数static uint8_t mr25_spi_transfer(uint8_t tx) { uint8_t rx 0xFF; HAL_SPI_TransmitReceive(hspi1, tx, rx, 1, 100); return rx; }写使能void mr25_write_enable(void) { MR25_CS_LOW(); mr25_spi_transfer(0x06); MR25_CS_HIGH(); }读取指定地址数据void mr25_read(uint32_t addr, uint8_t *data, uint32_t len) { if (addr len MR25_CAPACITY) { return; } MR25_CS_LOW(); mr25_spi_transfer(0x03); mr25_spi_transfer((addr 16) 0xFF); mr25_spi_transfer((addr 8) 0xFF); mr25_spi_transfer(addr 0xFF); while (len--) { *data mr25_spi_transfer(0x00); } MR25_CS_HIGH(); }写入指定地址数据void mr25_write(uint32_t addr, const uint8_t *data, uint32_t len) { if (addr len MR25_CAPACITY) { return; } mr25_write_enable(); MR25_CS_LOW(); mr25_spi_transfer(0x02); mr25_spi_transfer((addr 16) 0xFF); mr25_spi_transfer((addr 8) 0xFF); mr25_spi_transfer(addr 0xFF); while (len--) { mr25_spi_transfer(*data); } MR25_CS_HIGH(); }验证方法很简单写一个测试函数先往整片 512KB 写满 0xA5再读回来逐字节比对全部通过后再用随机地址和随机长度做第二轮测试。这个测试别省尤其是刚画完板子的时候它能一次性把接线错误、SPI 模式配置错误、CS 时序问题全部暴露出来。如果读回来全是 0xFF先别怀疑芯片坏优先检查时钟极性相位、CS 是不是真的拉低了、MISO 是不是接到了正确的引脚上。这三类问题占了九成概率。3.4 用DMA把批量读写吃满总线阻塞式读写函数在单字节、少量数据场景下足够用。但如果你要记录高速传感器数据或者批量保存日志一字节一字节靠 CPU 死等效率太低而且会卡住主循环。这时候需要 DMA。读操作可以这样设计先用阻塞方式发送命令和地址然后启动 DMA 接收在 DMA 完成回调里拉高 CS。很多人的误区是 DMA 接收期间就对 SPI 的 RXNE 中断做处理其实没必要DMA 会自己把数据搬到内存。void mr25_dma_read(uint32_t addr, uint8_t *buf, uint32_t len) { uint8_t cmd[4]; cmd[0] 0x03; cmd[1] (addr 16) 0xFF; cmd[2] (addr 8) 0xFF; cmd[3] addr 0xFF; MR25_CS_LOW(); HAL_SPI_Transmit(hspi1, cmd, 4, 100); HAL_SPI_Receive_DMA(hspi1, buf, len); // 在 HAL_SPI_RxCpltCallback 里拉高 CS并通知业务层数据已就绪 }注意一点SPI 全双工模式下启动接收 DMA 时MOSI 引脚必须有输出否则从设备收不到有效时钟不对时钟由 SCK 决定MOSI 输出什么并不影响 MISO 的接收但全双工外设在接收时需要 TXE 保持置位某些配置下会报溢出。稳妥的做法是给 HAL_SPI_Receive_DMA 之前把 SPI 的 TXDR 清空或者直接用 HAL_SPI_TransmitReceive_DMA把一个全 0 的 dummy 缓冲区和接收缓冲区一起传。这样 MOSI 上会持续输出 0x00MRAM 根本不管 MOSI 上的数据只按 SCK 往 MISO 上吐数据完全没问题。写操作用 DMA 更简单。把命令、地址、数据拼到一个缓冲区里一次性 DMA 发送全部发完再拉高 CS。MRAM 写入是瞬时的不需要像 Flash 一样发送之后反复查询状态寄存器等待写完成所以 DMA 发送完成就代表数据已经落进去了。这点真的是太省心了写日志逻辑可以做得非常直接。4. 工业场景下的数据完整性与掉电保护4.1 掉电检测PVD配合MRAM做最后写保护工业设备最重要的一个场景就是掉电保存。以前用 EEPROM 的时候掉电保存最怕写入过程中断电写一半卡住之后恢复供电数据变成半新半旧。用 MRAM 之后写入过程本身非常快而且没有擦除等待掉电窗口大大缩短但依然不能掉以轻心。STM32F732IE 内置 PVD 电源检测模块可以监控 VDD 电压。当电压跌到设定阈值以下时会触发 PVD 中断。典型做法是把阈值设在 2.9V 左右VDD 正常 3.3V一旦跌到 2.9V说明电源已经出问题MCU 还能靠内部残压和板子上的电容再撑一段时间。在 PVD 中断里置一个标志位主循环轮询到这个标志后立刻停止所有业务逻辑把最关键的状态参数写入 MRAM。这个方案里MRAM 的价值体现在两个地方写入速度快PVD 触发到 MCU 彻底掉电之间的宝贵时间窗口内能写完更多数据写入即生效不需要像 Flash 那样最后还要等待内部擦写完成写完检查一下 CS 拉高数据就是可靠的。为了进一步拉长掉电窗口可以在电源输入端放一个几十毫法的超级电容或者大容量电解电容成本不高但能给 MCU 额外争取几毫秒到几十毫秒的工作时间。具体容量要看系统负载我当时用一个 4.7mF 的电容PVD 触发后还能稳定运行至少 20ms足够把 1KB 的关键日志写完。4.2 记录格式设计与“双缓冲状态标记”掉电保护不能只靠硬件软件层面也得做容错设计。我的做法是给每条数据记录定义一个结构体头部放魔数、长度、CRC、状态字段、数据体。状态字段放在结构体的固定偏移处初始值写成 0xAA 表示“未提交”全部数据写完后最后再写状态字段为 0x55表示“已提交”。读取的时候先读状态字段只有等于 0x55 才认为记录有效。如果掉电发生在数据写到一半时状态字段还是 0xAA读取程序直接跳过这条记录完全不会用半截数据。这个方案的巧妙之处在于整个记录只有一个“提交点”也就是状态字段的写入。MRAM 的字节写入是原子性的不会出现写了一半状态字段的情况所以提交点是可靠的。配合双缓冲更稳在 MRAM 里划分 A、B 两个块轮流写。写 A 块之前先把 B 块的记录状态全部清掉然后写 A等 A 写入完成并提交后更新一个“当前有效块”的指针字段指向 A。下次写 B 时同理。这样即使在写入过程中反复掉电总有至少一块是完整的。用 MRAM 做这个方案比用 Flash 舒服太多Flash 要考虑到块擦除写之前还得担心旧数据没擦干净MRAM 直接覆写逻辑清爽。实际项目里我还给每条记录加了 CRC16。STM32F732IE 有硬件 CRC 计算单元算得很省事。写入时计算 CRC 存入记录头部读取时校验不一致就视为记录损坏。CRC 和状态标记双保险现场再恶劣也很难出现“看似有效实际错误”的数据。4.3 环形日志与循环覆盖策略工业设备常常需要记录运行日志比如每天开关机时间、报警记录、关键参数变化趋势。日志的特点是持续追加、容量有限、不需要无限保留历史。采用环形缓冲区是最常见的做法而 MRAM 让环形日志的实现难度降了一个维度。在 MRAM 里划一块日志区假设从地址 0x10000 到 0x7FFFF共 448KB。再在日志区外部用一个固定地址保存写指针记录下一跳写入的位置。每次写日志时先从写指针地址读出当前内容如果写指针加记录长度已经超过日志区末尾就把写指针重新指回日志区起始位置。由于 MRAM 支持覆盖写回卷时直接写新记录覆盖旧记录没有任何擦除成本。读取日志时从写指针处往前回溯通过记录头部的魔数和序列号判断哪些是有效记录、哪些是历史残留。每个记录头部加一个两字节序列号每次写完递增序列号发生回环甚至颠倒都不怕因为可以结合时间戳字段来判断先后顺序。这里的重点是不用担心旧数据残留问题MRAM 断电保留的特性保证了历史记录依然能读出来但也不需要像 Flash 日志那样频繁搬移数据磨损均衡在 MRAM 的寿命面前意义不大。我用这套方案做过一个现场监控设备每 10 秒写一条 64 字节的日志一天大概产生 550KB 数据。理论上 448KB 日志区不到一天就回卷一轮看起来很快但回卷处直接覆盖最旧记录设备连续跑了几个月日志读写一直正常。这个场景换成 SPI NOR Flash 早就要么写坏、要么需要复杂的磨损均衡算法算下来 MRAM 虽然单价贵但省下的开发维护成本完全值得。5. 现场问题排查与经验速查5.1 读回全是0xFF这个问题出现频率最高。现象是往某个地址写 0x55读回来却是 0xFF看起来芯片像坏了一样。实际上九成是接线或者配置问题。先检查 MISO 线是不是接对很多 STM32 板子的 SPI1 MISO 在 PA6但有人会不小心接成 PA4 或者其它复用引脚这种低级错误会导致 MCU 收不到数据。再检查时钟极性相位MRAM 支持 Mode 0 和 Mode 3HAL 库配置成 Mode 0 一般没问题但如果你是从某个旧项目拷贝过来的代码很可能带着 Mode 3 或者其它参数。还有一个典型的坑CS 拉高拉低之后要加一个极短延时吗在低速 SPI 下可以不加但在高速 SPI 下CS 拉低之后如果不给一点时间让芯片准备芯片可能把第一个 SCK 当成命令的一部分。我当时在 27MHz 下没有加延时也能正常工作但如果你用的是 40MHz 以上或者焊接有问题可以尝试在 CS 拉低后加几个空指令周期的延时尚是值得的。另外确认 SPI 通信时 GPIO 速度等级别选 Low否则边沿太缓MISO 回来时采样点不对一样会读到 0xFF。5.2 写入后数据不稳定如果读的时候偶尔对、偶尔错或者写入后当时能读、重启后变成别的值多半不是芯片本身的问题而是电气环境。先看电源纹波。MRAM 工作时如果 VCC 上有明显毛刺内部状态机的翻转可能出错这种错不是每次都出现很难复现。在 VCC 引脚旁边加上 0.1μF 陶瓷电容离引脚越近越好如果板上还有继电器或电机给 MRAM 供电再加一级 LC 滤波。我在第一版板子上就吃过这个亏开关电源纹波 50mV 左右高速连续读大块数据就会偶发错一个字节加电容后问题消失。再看 SPI 信号完整性。如果你把 MRAM 放在了离 MCU 比较远的地方比如超过 10cm建议降速到 10MHz 以下。工业现场很多时候不需要极限性能稳定才是第一位。真要高速就在 SCK、MOSI 上串 33Ω 电阻MISO 上不加实测下来改善很明显。排查这类偶发问题时别上来就怀疑芯片先做降速测试把预分频调到 16 或者 32看问题是否消失。如果降速后一切正常就是信号完整性问题如果降速后依然偶发错误优先检查电源和地回路。5.3 WP和HOLD引发的“幽灵”故障这类故障最容易被忽略因为现象非常随机。设备可能连着跑几天都没事某一天突然发现某次写入没生效或者某次 SPI 传输中途卡死重启又好了。如果你在硬件上把 WP 和 HOLD 悬空了那么它们就是两个浮空引脚电平完全不确定。现场有射频干扰或者大电流切换时噪声耦合到这两个引脚就可能触发写保护或者 SPI 暂停功能。HOLD 被拉低的那一瞬间SPI 传输会暂停MCU 不知道还在继续发数据出来的结果当然一塌糊涂。排查办法很简单检查原理图WP 和 HOLD 是否通过上拉电阻接到了 VCC上拉电阻阻值别太大10kΩ 可以。如果你用的是现成模块可能模块上已经处理了但自己做板子一定要确认。另外有些芯片的 HOLD 引脚旁边还建议加一个小电容滤波比如 100pF进一步防止噪声误触发。还有一个容易忽略的点MRAM 的 WP 引脚除了硬件控制还受到状态寄存器里的 WPEN 位控制。如果状态寄存器配置了保护区域即使外部 WP 拉了高某个地址区域也可能被硬件保护住写操作不生效。遇到“部分地址能写、部分地址不能写”的情况去读一下状态寄存器检查 BP 位是不是被误设置了。5.4 时钟速率与信号质量调优最后说下时钟选择。MR25H40CDF 这颗芯片标称 SPI 时钟可以跑到几十 MHz但我在实际项目中通常只用 20MHz 到 27MHz。原因很简单稳定比快重要。F732 的 SPI1 挂 APB2APB2 最高 108MHz。预分频选 4 得到 27MHz选 8 得到 13.5MHz。如果下一步还要接别的 SPI 设备比如显示、ADC可以单独给 MRAM 分配一个 SPI 外设避免共享总线时切换速率。我就是用 SPI1 专门接 MRAMSPI4 接其它设备互不干扰。如果要在高速下做连续读试试 0x0B Fast Read 命令比 0x03 多一个 dummy 周期但内部数据输出时序更稳某些芯片在极限频率下必须用 Fast Read 才能正确输出数据。我们在调试时发现25MHz 下用 0x03 偶尔读错换 0x0B 后彻底稳定虽然理论上两者在同一频率下都该能工作但实际上一颗芯片的余量就这样遇到就不要硬顶着上了。最后再分享一个自己总结的排查顺序第一个查 CS 时序对不对第二个查 WP/HOLD 电平对不对第三个查电源纹波第四个降速测试这四个排查完SPI 挂 MRAM 的九成问题都能定位。别一上来就翻数据手册找寄存器配置电气层面的坑比寄存器层面的坑多得多。我刚接触 MRAM 的时候也觉得它没必要毕竟再怎么样也就是个存储芯片。但实际把一个频繁写日志掉电保存的项目从 Flash 迁移到 MR25H40CDF 之后才体会到什么叫“软件逻辑变简单”。写之前不用擦除、写之后不用等待、寿命随便造这三个特性直接让掉电保存、环形日志这类功能的代码少了一大半。如果你正在被 Flash 的擦除等待、EEPROM 的容量限制折磨不妨认真考虑一下这个组合。先用最简单的 SPI 读写跑通再加上 PVD 掉电检测你会很快理解为什么工业现场越来越多人愿意为 MRAM 多花那几块钱。
返回列表