本文中使用STM32CubeMX生成的针对STM32H743芯片的HAL库对emmc进行读、写、擦除操作。
首先打开STM32CubeMX配置引脚
点击SDMMC2配置为【MMC 8 bits Wide bus】(根据自己需求)
GPIO Settings:

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

NVIC:

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

都配置好以后重新生成代码。
先对SDMMC2初始化,这部分可完全使用STM32自动生成的不用去改变

初始化成功后加入下面的擦除-读-写测试函数
/**
* @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();

被折叠的 条评论
为什么被折叠?



