你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动eMMC读写数据

[复制链接]
STMCU小助手 发布时间:2021-12-29 23:50
STM32驱动eMMC读写数据
参照 JEDEC eMMC标准:JESD84-B51 (Revision of JESD84-B50.1, July 2014)
驱动芯片采用stm32h7xx芯片。通过官方HAL库中stm32h7xx_hal_mmc.h文件驱动,采用8bit数据传输模式,与SD卡驱动类似。实测写入速度6-10MB/s左右。

初始化代码清单:

  1. HAL_StatusTypeDef SDMMC1_MMC_Init(void)
  2. {
  3.   hmmc1.Instance = SDMMC1;
  4.   hmmc1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  5.   hmmc1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  6.   hmmc1.Init.BusWide = SDMMC_BUS_WIDE_8B;
  7.   hmmc1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  8.   hmmc1.Init.ClockDiv = 1;
  9.   if (HAL_MMC_Init(&hmmc1) != HAL_OK)
  10.   {
  11.       Error_Handler();
  12.   }
  13.   return HAL_OK;
  14. }
复制代码

底层驱动代码清单:

  1. void HAL_MMC_MspInit(MMC_HandleTypeDef* hmmc)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   if(hmmc->Instance==SDMMC1)
  5.   {
  6.   /* USER CODE BEGIN SDMMC1_MspInit 0 */
  7.     /* Peripheral clock enable */
  8.     __HAL_RCC_SDMMC1_CLK_ENABLE();
  9.     __HAL_RCC_GPIOC_CLK_ENABLE();
  10.     __HAL_RCC_GPIOD_CLK_ENABLE();
  11.     /**SDMMC1 GPIO Configuration   
  12.               PC8     ------> SDMMC1_D0
  13.            PC9     ------> SDMMC1_D1
  14.            PC10    ------> SDMMC1_D2
  15.            PC11    ------> SDMMC1_D3
  16.            PB8     ------> SDMMC1_D4
  17.            PB9     ------> SDMMC1_D5
  18.            PC6     ------> SDMMC1_D6
  19.            PC7     ------> SDMMC1_D7
  20.            PC12    ------> SDMMC1_CK
  21.            PD2     ------> SDMMC1_CMD
  22.     */
  23.     GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_8
  24.                           |GPIO_PIN_9|GPIO_PIN_6|GPIO_PIN_7;
  25.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  27.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  28.     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
  29.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  30.     GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
  31.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  32.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  33.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  34.     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
  35.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  36.     GPIO_InitStruct.Pin = GPIO_PIN_2;
  37.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  38.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  39.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  40.     GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
  41.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  42.    HAL_NVIC_SetPriority(SDMMC1_IRQn,1,1);  //配置SDMMC1中断
  43.    HAL_NVIC_EnableIRQ(SDMMC1_IRQn);        //使能SDMMC1中断
  44.    HAL_NVIC_SetPriority(SysTick_IRQn, 0x0E ,0);
  45.   }
  46. }
复制代码

在DMA模式下,从MMC卡的指定地址读取数据:

  1. /**
  2.   * @brief  在DMA模式下,从MMC卡的指定地址读取数据
  3.   * @param  pData:指向将包含要传输的数据的缓冲区的指针
  4.   * @param  ReadAddr:要读取数据的地址
  5.   * @param  NumOfBlocks:要读取的MMC块数量
  6.   * @retval eMMC状态
  7.   */
  8. uint8_t BSP_MMC_ReadBlocks_DMA(uint8_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)
  9. {
  10.    HAL_StatusTypeDef Status =  HAL_OK;

  11.    if(HAL_MMC_ReadBlocks_DMA(&hmmc1, pData, ReadAddr, NumOfBlocks) != HAL_OK)
  12.    {
  13.       Status = HAL_ERROR;
  14.    }
  15.    return Status;
  16. }
复制代码

在DMA模式下,向MMC卡的指定地址写入数据:

  1. /**
  2.   * @brief  在DMA模式下,向MMC卡的指定地址写入数据
  3.   * @param  pData:指向将包含要传输的数据的缓冲区的指针
  4.   * @param  WriteAddr:要写入数据的地址
  5.   * @param  NumOfBlocks:要写的MMC块的数量
  6.   * @retval MMC状态
  7.   */
  8. uint8_t BSP_MMC_WriteBlocks_DMA(uint8_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)
  9. {
  10.   HAL_StatusTypeDef Status =  HAL_OK;

  11.   /* Write block(s) in DMA transfer mode */
  12.   if (HAL_MMC_WriteBlocks_DMA(&hmmc1, pData, WriteAddr, NumOfBlocks) != HAL_OK)
  13.   {
  14.     Status = HAL_ERROR;
  15.   }
  16.   return Status;
  17. }
复制代码

擦除eMMC卡数据:

  1. /**
  2.   * @brief  擦除eMMC卡数据
  3.   * @param  无
  4.   * @retval 无
  5.   */
  6. void MMC_EraseTest(void)
  7. {
  8.    HAL_StatusTypeDef Status = HAL_OK;
  9.    HAL_StatusTypeDef EraseStatus = HAL_OK;
  10.    if (Status == HAL_OK)
  11.    {
  12.       Status = HAL_MMC_Erase(&hmmc1, 0x00, (BLOCK_SIZE * NUMBER_OF_BLOCKS));
  13.       //等待擦除完成
  14.       if(Wait_SDCARD_Ready() != HAL_OK)
  15.       {
  16.          EraseStatus = HAL_ERROR;
  17.       }
  18.    }
  19.    if(EraseStatus != HAL_OK)
  20.    {   
  21.       Error_Handler();
  22.    }
  23. }
复制代码

eMMC卡等待擦除完成函数:

  1. /**
  2.   * @brief  eMMC卡等待擦除完成函数
  3.   * @param  无
  4.   * @retval HAL_OK:擦除成功;HAL_ERROR:擦除失败
  5.   */
  6. static HAL_StatusTypeDef Wait_SDCARD_Ready(void)
  7. {
  8.    uint32_t loop = MMC_TIMEOUT;

  9.    /* Wait for the Erasing process is completed */
  10.    /* Verify that SD card is ready to use after the Erase */
  11.    while(loop > 0)
  12.    {
  13.       loop--;
  14.       if(HAL_MMC_GetCardState(&hmmc1) == HAL_MMC_CARD_TRANSFER)
  15.       {
  16.          return HAL_OK;
  17.       }
  18.    }
  19.    return HAL_ERROR;
  20. }
复制代码

最近移植的eMMC卡的驱动程序,分享出来希望对各位开发者有所帮助。还移植了FATFS文件系统到eMMC驱动程序中,之后整理好再分享。


收藏 评论0 发布时间:2021-12-29 23:50

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版