STM32H7的EMMC存储器(XPF73EA0I芯盛智能)

本文中使用STM32CubeMX生成的针对STM32H743芯片的HAL库对emmc进行读、写、擦除操作。

首先打开STM32CubeMX配置引脚

点击SDMMC2配置为【MMC 8 bits Wide bus】(根据自己需求)

GPIO Settings:

168563fce7c540d6bf2124f9de186d29.png

Parameter Settings:(这里注意倒数第二行的分频为1,之前由于不明原因分频为0时SDMMC2的初始化无法通过)

ed6d78ddf9d846918543d09f8fb2a06c.png

NVIC:

18593cfebfd842e3bcd06d67e9739e5d.png

FATFS:文件系统这里由于我的是emmc所以勾选了User-define

d383be41e64f48e4a42a35ce11a38291.png

都配置好以后重新生成代码。

先对SDMMC2初始化,这部分可完全使用STM32自动生成的不用去改变

5c4547571c44441ba64f0234e294a88a.png

初始化成功后加入下面的擦除-读-写测试函数

/**
  * @brief  在DMA模式下,从MMC卡的指定地址读取数据
  * @param  pData:指向将包含要传输的数据的缓冲区的指针
  * @param  ReadAddr:要读取数据的地址
  * @param  NumOfBlocks:要读取的MMC块数量
  * @retval eMMC状态
  */
uint8_t BSP_MMC_ReadBlocks_DMA(uint8_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)
{
   HAL_StatusTypeDef Status =  HAL_OK;
   if(HAL_MMC_ReadBlocks_DMA(&hmmc2, pData, ReadAddr, NumOfBlocks) != HAL_OK)
   {
      Status = HAL_ERROR;
   }
   return Status; 
}

/**
  * @brief  在DMA模式下,向MMC卡的指定地址写入数据
  * @param  pData:指向将包含要传输的数据的缓冲区的指针
  * @param  WriteAddr:要写入数据的地址
  * @param  NumOfBlocks:要写的MMC块的数量
  * @retval MMC状态
  */
uint8_t BSP_MMC_WriteBlocks_DMA(uint8_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)
{
  HAL_StatusTypeDef Status =  HAL_OK;
  /* Write block(s) in DMA transfer mode */
  if (HAL_MMC_WriteBlocks_DMA(&hmmc2, pData, WriteAddr, NumOfBlocks) != HAL_OK)
  {
    Status = HAL_ERROR;
  }
  return Status; 
}
	

/**
  * @brief  擦除eMMC卡数据
  * @param  无
  * @retval 无
  */
void MMC_EraseTest(void)
{
	 uint32_t BLOCK_SIZE = 256;  // 假设块大小为256字节
   uint32_t NUMBER_OF_BLOCKS = 1;  // 假设要擦除的块数为1
	
   HAL_StatusTypeDef Status = HAL_OK;
   HAL_StatusTypeDef EraseStatus = HAL_OK;
   if (Status == HAL_OK)
   {
      Status = HAL_MMC_Erase(&hmmc2, 0x00, (BLOCK_SIZE * NUMBER_OF_BLOCKS));
      //等待擦除完成
      if(Wait_SDCARD_Ready() != HAL_OK)
      {
         EraseStatus = HAL_ERROR;
      }
   }
   if(EraseStatus != HAL_OK)
   {   
      Error_Handler();
   } 
	 printf(" The EMMC is Erased successfully!!  \r\n");
}

#define MMC_TIMEOUT 100000  // 100秒的超时时间

/**
  * @brief  eMMC卡等待擦除完成函数
  * @param  无
  * @retval HAL_OK:擦除成功;HAL_ERROR:擦除失败
  */
static HAL_StatusTypeDef Wait_SDCARD_Ready(void)
{
   uint32_t loop = MMC_TIMEOUT;

   /* Wait for the Erasing process is completed */
   /* Verify that SD card is ready to use after the Erase */
   while(loop > 0)
   {
      loop--;
      if(HAL_MMC_GetCardState(&hmmc2) == HAL_MMC_CARD_TRANSFER)
      {
         return HAL_OK;
      }
   }
   return HAL_ERROR;
}
	 
//测试EMMC读写函数
void EMMCRWTEST(void)
{
    uint8_t data[256];  // 假设每个块的大小为512字节
    uint32_t address = 0x01;  // 假设要读写的地址为0x00
    uint32_t numBlocks = 1;  // 假设要读写的块数为1
	
    // 写入数据
    for (int i = 0; i < 256; i++) {
        data[i] = i;
    }
    if (BSP_MMC_WriteBlocks_DMA(data, address, numBlocks) == HAL_OK)
			{
        printf("Write succeeded\r\n");
      } 
		else 
			{
        printf("Write failed\r\n");
      }
    
		HAL_Delay(100);	
			
		// 读取数据
    if (BSP_MMC_ReadBlocks_DMA(data, address, numBlocks) == HAL_OK) 
			{
        printf("Read data: ");
        for (int i = 0; i < 256; i++)
				{
            printf("%02X ", data[i]);
        }
        printf("\r\n");
      }
		else 
			{
        printf("Read failed\r\n");
      }
			
    return 0;
}

测试使用时调用如下函数:(同样根据自己的需求,更改即可)

  MMC_EraseTest();
  EMMCRWTEST();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值