大家好,
我正在使用
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;
- }