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

STM32L486+CubeMX+SDMMC+DMA+FATFS出错

[复制链接]
启明丶廿五 提问时间:2023-1-29 17:08 / 未解决

收藏 评论1 发布时间:2023-1-29 17:08

举报

1个回答
启明丶廿五 回答时间:2023-1-29 17:34:14
使用CubeMX(版本6.7.0,STM32CubeL4 Firmware Package V1.17.0 / 11-February-2021 )生成工程,修改了下面几个地方:void MX_SDMMC1_SD_Init(void)
{

  /* USER CODE BEGIN SDMMC1_Init 0 */

  /* USER CODE END SDMMC1_Init 0 */

  /* USER CODE BEGIN SDMMC1_Init 1 */

  /* USER CODE END SDMMC1_Init 1 */
  hsd1.Instance = SDMMC1;
  hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  hsd1.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
  hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B;
  hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd1.Init.ClockDiv = 0;
  /* USER CODE BEGIN SDMMC1_Init 2 */
  hsd1.Init.BusWide = SDMMC_BUS_WIDE_1B;    //初始化时改为1线,否则卡死在BSP_SD_Init中
  /* USER CODE END SDMMC1_Init 2 */

}
金士顿32G内存卡运行正常,更换为16G内存卡却总是卡在下面的死循环:while(!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DBCKEND))
  {
    if(__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXDAVL))
    {
      *(tempscr + index) = SDMMC_ReadFIFO(hsd->Instance);
      index++;
    }

    if((HAL_GetTick() - tickstart) >=  SDMMC_DATATIMEOUT)
    {
      return HAL_SD_ERROR_TIMEOUT;
    }
  }

测试主函数:
main(void)
{
  /* USER CODE BEGIN 1 */
  uint32_t ii;
  DWORD frr;
  FATFS *FSS;
        SD_POWER_ON;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDMMC1_SD_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
          {
                HAL_Delay(1000u);
                if(BSP_SD_Init() == MSD_OK)
                {
                          retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
                          if(retSD==0u)
                          {
                                  retSD = f_mount(&SDFatFS,(TCHAR const *)SDPath,1u);
                                FSS = &SDFatFS;
                                retSD = f_getfree((TCHAR const *)SDPath,&frr,&FSS);
                               
                                ii = frr*(SDFatFS.csize)/2048;
                                retSD = f_mkdir("TEST0");
                                retSD = f_mkdir("TEST1");
                                retSD = f_mkdir("TEST2");
                                f_mount(NULL,(TCHAR const*)SDPath,1u);
                          }
                          OKcnt++;
                }
                else
                {
                        ERRcnt++;
                }
        }
  }
  /* USER CODE END 3 */
}




关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版