Hi Habe hier einen STM32F407 und an dessen SDIO eine SD-Karte angeschlossen. Weis wer ein Beispiel oder Tutorial um die SDIO und FATFS mit dem ST Cube HAL Generator zum laufen zu bekommen? Lande momentan beim mounten der SD-Karte immer im HardFault Handler...
Das ist jetzt wohl eine neue Form der Salamitaktik, wo wir am Anfang nur mal kurz dran riechen dürfen.
/* USER CODE BEGIN Header */ /** ************************************************************************ ****** * @file : main.c * @brief : Main program body ************************************************************************ ****** * @attention * * <h2><center>© Copyright (c) 2020 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: * www.st.com/SLA0044 * ************************************************************************ ****** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "fatfs.h" #include "usb_device.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ SD_HandleTypeDef hsd; SPI_HandleTypeDef hspi1; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); static void MX_SDIO_SD_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* 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_SPI1_Init(); MX_SDIO_SD_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_FATFS_Init(); MX_USB_DEVICE_Init(); /* USER CODE BEGIN 2 */ FATFS sdFatFs; // File system object for SD disk logical drive char sdPath[4]; // SD disk logical drive path FIL myFile; // File object FRESULT res = FR_OK; // FatFs function common result code uint8_t wtext[] = "Hello world"; // File write buffer uint8_t rtext[100]; // File read buffer uint32_t byteswritten, bytesread; // File write/read counts res = f_mount(&sdFatFs, (TCHAR const*) sdPath, 0); if (res != FR_OK) { // Fehler beim Mounten return -1; } res = f_open(&myFile, "TEST.TXT", FA_CREATE_ALWAYS | FA_WRITE); if (res != FR_OK) { // Fehler beim Erstellen oder Öffnen der Datei return -1; } res = f_write(&myFile, wtext, sizeof(wtext),(void *) &byteswritten); if (res != FR_OK) { // Fehler beim Beschreiben der Datei return -1; } f_close(&myFile); // Schliessen der Datei res = f_open(&myFile, "TEST.TXT", FA_READ); if (res != FR_OK) { // Fehler beim Öffnen der Datei return -1; } res = f_read(&myFile, rtext, sizeof(rtext),(UINT*) &bytesread); if ((bytesread == 0) || (res != FR_OK)) { // Fehler beim Lesen aus der Datei return -1; } f_close(&myFile); // Schliessen der Datei FATFS_UnLinkDriver(sdPath); // Trennen des SDIO-Treibers von der Middleware-Komponente /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
Hier noch der SDIO init: * @brief SDIO Initialization Function * @param None * @retval None */ static void MX_SDIO_SD_Init(void) { /* USER CODE BEGIN SDIO_Init 0 */ /* USER CODE END SDIO_Init 0 */ /* USER CODE BEGIN SDIO_Init 1 */ /* USER CODE END SDIO_Init 1 */ 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 = 3; /* USER CODE BEGIN SDIO_Init 2 */ /* USER CODE END SDIO_Init 2 */ }
Anderl schrieb: > Lande momentan beim mounten der SD-Karte immer im HardFault Handler... Benutze den Debugger um genau herauszufinden, welche Codestelle das ist.
Bin ein Stück weiter. Hängt sich wohl hiermit auf: FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ Mit nem oszi kann ich kurz Datenverkehr auf den Datenleitungen sehen. CLK kommt mit 9,6Mhz wenn SD-Karte drin. Ohne mit 400KHz. Daher vermute ich dass die Initalisierung der Karte selber wahrscheinlich hinhaut?
Gibt es Warnungen beim kompilieren? Was sagt der Stack Trace, wenn Du im Hardfault hängen bleibst (sollte anzeigen, wo der Fehler passiert ist)? Kann es sein, dass man als zweites Argument bei f_mount nicht einen Pfad übergeben sollte (notfalls "")? Ich habe das Gefühl, das die Übergabe eines nach const char* gecasteten uninitialisierten Strings keinen Sinn ergibt. Casten nur, wenn man weiß, was man tut!
Selbstloser Helfer schrieb: > Ich habe das Gefühl, das die Übergabe eines nach const char* gecasteten > uninitialisierten Strings keinen Sinn ergibt. Das wird er nur übernommen haben und ich nutze das ja auch so wenn ich Strings übergebe. Bevor man sich an die Software her macht und dort irgend etwas versucht zu optimieren, sollte man sich die Hardware anschauen um zu sehen ob es nicht schon hieran scheitert. Er wird schlichtweg vergessen haben einen Kondensator zwischen Vcc und GND nahe am SD-Karten-Adapter zu plazieren. @TO Zeig uns mal deinen Aufbau/Schaltung.
Mike J. schrieb: > @TO > Zeig uns mal deinen Aufbau/Schaltung. hab hier ein Fertiges DM-STF4BB Board. Und ja das ist Kacke designt. Mit CLK noch weiter runteretzn gehts... MLCC ist an der SD Karte, aber Leitungsführung usw... Wenn man sich mal wieder blind auf Evalkits verlässt...
Das ist oftmals auch die SD-Karte und nicht zwingend die Leitungsführung. Da solltest du mal verschiedene probieren. Und auch die internen Pull-Ups sind eigentlich zu groß da sollten externe sein, falls das nicht der Fall ist kann auch das ein Problem sein.
Anderl schrieb: > Bin ein Stück weiter. > > Hängt sich wohl hiermit auf: > FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O > layer */ > > Mit nem oszi kann ich kurz Datenverkehr auf den Datenleitungen sehen. > CLK kommt mit 9,6Mhz wenn SD-Karte drin. Ohne mit 400KHz. Daher vermute > ich dass die Initalisierung der Karte selber wahrscheinlich hinhaut? Anderl schrieb: > Mit CLK noch weiter runteretzn gehts... Du hast die clock-Geschwindigkeit verringert und es geht jetzt ?
Das sollte unbedingt mit DMA konfiguriert werden, das Pollen der FIFOs ist mit HAL zu langsam und unzuverlässig.
Johannes S. schrieb: > Das sollte unbedingt mit DMA konfiguriert werden, das Pollen der > FIFOs > ist mit HAL zu langsam und unzuverlässig. Wie konfiguriert man dass bzw. auf was muss ich da achten? Hab mit DMA noch nichts gemacht.
Anderl schrieb: > Wie konfiguriert man dass bzw. auf was muss ich da achten? Hab mit DMA > noch nichts gemacht. das müsste im CubeMX in der SDIO Komponente einstellbar sein. in SDIO DMA Settings, ADD Rx/Tx DMA.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.