Forum: Mikrocontroller und Digitale Elektronik STM32 SD-Karte und Cube


von Anderl (Gast)


Lesenswert?

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...

von Selbstloser Helfer (Gast)


Lesenswert?

Aktiviere Glaskugel... Moment... Geht gleich los...

von Stefan F. (Gast)


Lesenswert?

Das ist jetzt wohl eine neue Form der Salamitaktik, wo wir am Anfang nur 
mal kurz dran riechen dürfen.

von Anderl (Gast)


Lesenswert?

/* USER CODE BEGIN Header */
/**
  ************************************************************************ 
******
  * @file           : main.c
  * @brief          : Main program body
  ************************************************************************ 
******
  * @attention
  *
  * <h2><center>&copy; 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 */
}

von Anderl (Gast)


Lesenswert?

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 */

}

von Stefan F. (Gast)


Lesenswert?

Anderl schrieb:
> Lande momentan beim mounten der SD-Karte immer im HardFault Handler...

Benutze den Debugger um genau herauszufinden, welche Codestelle das ist.

von Anderl (Gast)


Lesenswert?

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?

von Selbstloser Helfer (Gast)


Lesenswert?

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!

von Mike J. (linuxmint_user)


Lesenswert?

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.

von Anderl (Gast)


Lesenswert?

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...

von Guest (Gast)


Lesenswert?

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.

von Mike J. (linuxmint_user)


Lesenswert?

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 ?

von Johannes S. (Gast)


Lesenswert?

Das sollte unbedingt mit DMA konfiguriert werden, das Pollen der FIFOs 
ist mit HAL zu langsam und unzuverlässig.

von Anderl (Gast)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.