芯片是STM32H750ZBxx,SDMMC1外设3.3V驱动eMMc,8数据线。
使用cubemx生成代码,HAL库版本:1.11.2,没有使用MPU,内存使用的是AXI_RAM,阻塞式读写
eMMc是:16GB THGBMJG7C1LBAIL,8个数据线、时钟线STM32内部上拉,reset线初始化置高。
读写使用的是HAL的库函数,连续读1000次,每次1个块。问题是:
时钟大于5MHz的情况下,初始化可以成功,读CSD、CID、Ext_CSD成功,但是读写出错,应该是报超时错误。
时钟大于20MHz,初始化可以成功,读CSD失败。
MCU时钟200MHz
MCU时钟
SDMMC时钟
SDMMC时钟
SDMMC设置
SDMMC设置
SDMMC的GPIO
SDMMC的GPIO
测试代码:
[C] 纯文本查看 复制代码 HAL_MMC_CardInfoTypeDef CardInfo;
HAL_MMC_CardCIDTypeDef CardCID;
HAL_MMC_CardCSDTypeDef CardCSD;
HAL_MMC_CardStateTypeDef CardState;
HAL_MMC_StateTypeDef MMC_state;
HAL_StatusTypeDef hal_state;
uint8_t ExtCSD[512];
CardState = HAL_MMC_GetCardState(&hmmc1);
HAL_MMC_GetCardExtCSD(&hmmc1, (uint32_t *)ExtCSD, 100);
printf("183:%x,185:%x\n",ExtCSD[183],ExtCSD[185]);
hal_state = HAL_MMC_GetCardInfo(&hmmc1, &CardInfo);
hal_state = HAL_MMC_GetCardCID(&hmmc1, &CardCID);
hal_state = HAL_MMC_GetCardCSD(&hmmc1, &CardCSD);
hal_state = HAL_MMC_GetCardExtCSD(&hmmc1, (uint32_t *)ExtCSD, 100);
CardState = HAL_MMC_GetCardState(&hmmc1);
MMC_state = HAL_MMC_GetState(&hmmc1);
uint8_t mmc_data[512] = {0};
uint8_t read_data[512] = {0};
memset(mmc_data, 1, 100);
hal_state = HAL_MMC_WriteBlocks_DMA(&hmmc1, mmc_data, 0, 1);
hal_state = HAL_MMC_ReadBlocks_DMA(&hmmc1, read_data, 0, 1);
uint16_t start_time = HAL_GetTick();
for (uint32_t i = 0; i < 1000; i++)
{
hal_state = HAL_MMC_WriteBlocks(&hmmc1, mmc_data, i, 1, 100);
if(hal_state != HAL_OK){
printf("i=%d error=%d\n",i,hal_state);
CardState = HAL_MMC_GetCardState(&hmmc1);
}
}
uint16_t end_time = HAL_GetTick();
uint16_t time = end_time - start_time;
printf("Write time = %d",time);
start_time = HAL_GetTick();
for (uint32_t i = 0; i < 1000; i++)
{
hal_state = HAL_MMC_ReadBlocks(&hmmc1, mmc_data, i, 1, 100);
if(hal_state != HAL_OK){
MMC_state = HAL_MMC_GetState(&hmmc1);
CardState = HAL_MMC_GetCardState(&hmmc1);
printf("i=%d error=%d\n",i,hal_state);
}
}
end_time = HAL_GetTick();
time = end_time - start_time;
printf("Read time = %d",time);
|