12.STM32 MRAM使用
PM004MNIA是上海矽朋推出的4Mbit STT-MRAM非易失性存储器存储特性:非易失(断电数据保留>20年)、支持SPI/QPI接口,可直接字节读写(无需擦除),擦写次数达1亿次以上。性能参数:工作电压2.7V-3.6V(典型3.3V),SPI时钟最高50MHz,工作温度-40℃~+85℃,封装为SOP-8。适用场景:工业数据存储、智能仪表、物联网设备等对可靠性/读写速度要求高的场景。在m
·

一、PM004MNIA TR芯片介绍
PM004MNIA是上海矽朋推出的4Mbit STT-MRAM非易失性存储器,核心特点:
- 存储特性:非易失(断电数据保留>20年)、支持SPI/QPI接口,可直接字节读写(无需擦除),擦写次数达1亿次以上。
- 性能参数:工作电压2.7V-3.6V(典型3.3V),SPI时钟最高50MHz,工作温度-40℃~+85℃,封装为SOP-8。
- 适用场景:工业数据存储、智能仪表、物联网设备等对可靠性/读写速度要求高的场景。
二、STM32H743使用这颗芯片的方法
STM32H743通过硬件连接+软件驱动实现通信:
- 硬件连接(SPI模式):
-
- 芯片的
SCK→STM32H743的SPI时钟引脚(如SPI1_SCK) - 芯片的
MOSI→STM32H743的SPI发送引脚(如SPI1_MOSI) - 芯片的
MISO→STM32H743的SPI接收引脚(如SPI1_MISO) - 芯片的
CS→STM32H743的GPIO引脚(软件控制片选) - 芯片的
VCC接3.3V,GND接地。
- 芯片的
- 软件驱动:
-
- 用STM32CubeMX配置SPI外设(时钟、模式等)。
- 编写驱动函数:通过SPI发送指令+地址实现读写,例如:
-
-
- 读操作:发送
READ指令(0x03)+目标地址,再接收数据。 - 写操作:发送
WRITE指令(0x02)+目标地址,再发送数据。
- 读操作:发送
-
三、STM32使用这款芯片的优势
结合STM32的特性,搭配PM004MNIA TR的核心优势:
- 性能匹配:
STM32(如H743)的SPI接口速率可覆盖芯片的50MHz时钟,实现高速读写;同时STM32的多外设(如DMA)可提升数据传输效率。 - 可靠性互补:
STM32的工业级温度范围(-40℃~+85℃)与芯片一致,且芯片的非易失+高擦写次数,可弥补STM32片内Flash擦写寿命低的问题(适合频繁数据存储)。 - 开发便捷:
STM32的HAL/LL库可快速实现SPI驱动,结合芯片的“字节级读写”特性,无需复杂的擦除/编程流程,开发效率更高。 - 场景适配:
对物联网/工业设备,STM32的低功耗模式+芯片的微安级休眠电流(2μA),可延长电池供电设备的续航。
四、硬件引脚定义(示例)
在main.h中定义SPI引脚(根据实际硬件修改):
#define PM_MRAM_CS_PIN GPIO_PIN_4
#define PM_MRAM_CS_PORT GPIOA
#define PM_MRAM_SPI_HANDLE hspi1 // 需在CubeMX中配置SPI1
五、驱动函数(pm_mram.c)
#include "pm_mram.h"
#include "spi.h"
#include "gpio.h"
// 指令定义(参考芯片手册)
#define PM_MRAM_CMD_READ 0x03 // 读指令
#define PM_MRAM_CMD_WRITE 0x02 // 写指令
#define PM_MRAM_CMD_WREN 0x06 // 写使能
// 片选控制
#define PM_MRAM_CS_LOW() HAL_GPIO_WritePin(PM_MRAM_CS_PORT, PM_MRAM_CS_PIN, GPIO_PIN_RESET)
#define PM_MRAM_CS_HIGH() HAL_GPIO_WritePin(PM_MRAM_CS_PORT, PM_MRAM_CS_PIN, GPIO_PIN_SET)
/**
* @brief 写使能(写操作前必须调用)
*/
void PM_MRAM_WriteEnable(void)
{
PM_MRAM_CS_LOW();
HAL_SPI_Transmit(&PM_MRAM_SPI_HANDLE, (uint8_t*)&PM_MRAM_CMD_WREN, 1, 100);
PM_MRAM_CS_HIGH();
}
/**
* @brief 读数据
* @param addr: 读取地址(0~0x7FFFF,对应4Mbit)
* @param pData: 接收数据缓存
* @param len: 读取长度
*/
void PM_MRAM_Read(uint32_t addr, uint8_t *pData, uint16_t len)
{
uint8_t cmd_buf[4] = {PM_MRAM_CMD_READ,
(uint8_t)(addr >> 16),
(uint8_t)(addr >> 8),
(uint8_t)addr};
PM_MRAM_CS_LOW();
HAL_SPI_Transmit(&PM_MRAM_SPI_HANDLE, cmd_buf, 4, 100); // 发送指令+地址
HAL_SPI_Receive(&PM_MRAM_SPI_HANDLE, pData, len, 100); // 接收数据
PM_MRAM_CS_HIGH();
}
/**
* @brief 写数据
* @param addr: 写入地址(0~0x7FFFF)
* @param pData: 待写数据
* @param len: 写入长度
*/
void PM_MRAM_Write(uint32_t addr, uint8_t *pData, uint16_t len)
{
uint8_t cmd_buf[4] = {PM_MRAM_CMD_WRITE,
(uint8_t)(addr >> 16),
(uint8_t)(addr >> 8),
(uint8_t)addr};
PM_MRAM_WriteEnable(); // 先使能写
PM_MRAM_CS_LOW();
HAL_SPI_Transmit(&PM_MRAM_SPI_HANDLE, cmd_buf, 4, 100); // 发送指令+地址
HAL_SPI_Transmit(&PM_MRAM_SPI_HANDLE, pData, len, 100); // 发送数据
PM_MRAM_CS_HIGH();
}
六、头文件(pm_mram.h)
#ifndef PM_MRAM_H
#define PM_MRAM_H
#include "main.h"
void PM_MRAM_WriteEnable(void);
void PM_MRAM_Read(uint32_t addr, uint8_t *pData, uint16_t len);
void PM_MRAM_Write(uint32_t addr, uint8_t *pData, uint16_t len);
#endif
七、使用示例(main.c)
#include "pm_mram.h"
uint8_t write_buf[] = "Hello PM_MRAM!";
uint8_t read_buf[20] = {0};
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init(); // CubeMX配置的SPI初始化
// 写数据到地址0x00000
PM_MRAM_Write(0x00000, write_buf, sizeof(write_buf));
// 从地址0x00000读数据
PM_MRAM_Read(0x00000, read_buf, sizeof(write_buf));
while (1)
{
// 后续操作
}
}
注意事项
- 需在STM32CubeMX中配置SPI为全双工、8位数据、时钟极性0/相位0(CPOL=0,CPHA=0),时钟频率不超过50MHz。
- 实际项目中建议增加超时判断、错误处理。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)