ST意法半导体
直播中

tulin

13年用户 1282经验值
私信 关注
[问答]

使用cubeIDE为使用DMA的1位模式SDIO接口生成代码,f_open无法正常工作怎么解决?

大家好,
我正在使用 STM32f4 发现板及其包含 SD 卡接口的头板。我正在使用 cubeIDE 为使用 DMA 的 1 位模式 SDIO 接口生成代码。但问题出在f_open指令,同时逐步调试它正常工作意味着它返回值为零,但如果我跳过它并且如果我直接跳到新行它返回值是 13。我无法理解是什么导致了这个问题?
下面我包括时钟配置的代码片段
  • RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  •           RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  •           RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  •           /** Configure the main internal regulator output voltage
  •           */
  •           __HAL_RCC_PWR_CLK_ENABLE();
  •           __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  •           /** Initializes the CPU, AHB and APB busses clocks
  •           */
  •           RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  •           RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  •           RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  •           RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  •           RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  •           RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  •           RCC_OscInitStruct.PLL.PLLM = 8;
  •           RCC_OscInitStruct.PLL.PLLN = 168;
  •           RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  •           RCC_OscInitStruct.PLL.PLLQ = 7;
  •           if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •           {
  •             Error_Handler();
  •           }
  •           /** Initializes the CPU, AHB and APB busses clocks
  •           */
  •           RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  •                                       |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  •           RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  •           RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  •           RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  •           RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  •           if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  •           {
  •             Error_Handler();
  •           }
  •           PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  •           PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  •           if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  •           {
  •             Error_Handler();
  •           }
SDIO_SD_Init
  • hsd.Instance = SDIO;
  •   hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  •   hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  •   hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  •   hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  •   hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  •   hsd.Init.ClockDiv = 7;
DMA初始化
  • /* DMA controller clock enable */
  •   __HAL_RCC_DMA2_CLK_ENABLE();
  •   /* DMA interrupt init */
  •   /* DMA2_Stream3_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);
  •   HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
  •   /* DMA2_Stream6_IRQn interrupt configuration */
  •   HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 0, 0);
  •   HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
和主要代码
  • uint8_t sd_state = BSP_SD_Init();
  •                 uint8_t file_state;
  •                 if(sd_state != MSD_OK)
  •                 {
  •                         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  •                         *uc_status= sd_state;
  •                         return;
  •                 }
  •                 file_state = f_mount(&SDFatFS, (TCHAR const*)SDPath, 0);
  •                 if(file_state != FR_OK)
  •                 {
  •                         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  •                         *uc_status=file_state;
  •                 }
  • //                char curr_time_str[20];
  • //                time_t curr_time = get_current_time();
  • //                itoa(curr_time, curr_time_str, 10);
  •                 //file_state = f_open(&SDFile, strcat(curr_time_str, ".LOG"), FA_WRITE | FA_CREATE_ALWAYS);
  •                 HAL_Delay(1000);
  •                 file_state = f_open(&SDFile, "/sd20.txt", FA_WRITE | FA_CREATE_ALWAYS);
  •                 if (file_state != FR_OK)
  •                 {
  •                         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  •                         *uc_status=file_state;
  •                 }
  •                 HAL_Delay(1000);
  •                 file_state = fprintf(&SDFile,"%d",1234);
  •                 if(file_state == -1)
  •                 {
  •                         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  •                                                 *uc_status=file_state;
  •                 }
  •                 HAL_Delay(1000);
  •                 file_state = f_close(&SDFile);
  •                 if (file_state != FR_OK)
  •                 {
  •                         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
  •                         *uc_status=file_state;
  •                 }









回帖(1)

贾飞世

2023-1-29 09:52:20
AHB/APB2 与 PLLQ 时钟之间存在相互依赖关系,PLL 需要运行才能为卡端的 SDIO 提供时钟。该时钟最高可达 75 MHz,尽管这对于 CRYP/USB 不可行。旁路模式有勘误表(因此 ST 建议使用 75 和 48 MHz 作为补救措施),并且需要禁用流量控制。所有 MicroSD 的额定频率应为 50 MHz,75 MHz 的卡时钟为 37.5 MHz。必须考虑接线和端接以实现卡的最大速率。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分