一、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的核心优势:

  1. 性能匹配
    STM32(如H743)的SPI接口速率可覆盖芯片的50MHz时钟,实现高速读写;同时STM32的多外设(如DMA)可提升数据传输效率。
  2. 可靠性互补
    STM32的工业级温度范围(-40℃~+85℃)与芯片一致,且芯片的非易失+高擦写次数,可弥补STM32片内Flash擦写寿命低的问题(适合频繁数据存储)。
  3. 开发便捷
    STM32的HAL/LL库可快速实现SPI驱动,结合芯片的“字节级读写”特性,无需复杂的擦除/编程流程,开发效率更高。
  4. 场景适配
    对物联网/工业设备,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)
    {
        // 后续操作
    }
}

注意事项

  1. 需在STM32CubeMX中配置SPI为全双工、8位数据、时钟极性0/相位0(CPOL=0,CPHA=0),时钟频率不超过50MHz。
  2. 实际项目中建议增加超时判断、错误处理。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐