2016-12-20 4 views
3

Ich verwende das Board Nucleo F401Re basierend auf Mikrocontroller STM32F401RET6. Ich habe einen Micro-SD-Steckplatz an die Karte angeschlossen und daran interessiert, Daten auf die SD-Karte zu schreiben und Daten daraus zu lesen. Ich habe die Software STM32CubeX verwendet, um Code und insbesondere die SD-Bibliothek mit eingebauten Funktionen zu erzeugen. Ich habe versucht, einen einfachen Code zu schreiben, der ein Array in ein spezifisches Array schreibt und versucht, dieselben Daten später zu lesen. Der Code lautet wie folgt:Kommunikation mit SD-Karte mit STM32-Prozessor - SDIO-Protokoll

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

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

    /* Initialize all configured peripherals */ 
    MX_GPIO_Init(); 
    MX_USART2_UART_Init(); 
    MX_SDIO_SD_Init(); 

    char buffer[14] = "Hello, world\n"; 
    uint32_t to_send[512] ; // Te 
    uint32_t to_receive[512]; 
    uint64_t address = 150; 
    HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1); 
    HAL_SD_ReadBlocks(&hsd, to_receive, address, 512, 1); 


    while (1) 
    { 
     HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000); 
     HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000); 

} 

Der Code stoppt in der Mitte der Funktion HAL_Init() und ich erhalte die folgende Meldung:

The stack pointer for stack 'CSTACK' (currently 0x1FFFFD30) is outside the stack range (0x20000008 to 0x20000408) 

Diese Meldung erscheint nicht, wenn ich don Verwenden Sie nicht die Funktionen HAL_SD_WriteBlocks() oder HAL_SD_ReadBlocks(). Wenn jemand dieses Problem bereits hatte und weiß, wie es zu beheben ist, würde mich eine Hilfe retten. Bei Bedarf kann ich den Rest des Codes hinzufügen.

Antwort

5

Sie verwenden zu viel Stapelspeicherplatz. Sie können den zugewiesenen Stapelspeicherplatz im Linker-Skript anpassen und bei Bedarf erhöhen.

Allerdings können Sie das wahrscheinlich vermeiden, indem Sie Ihren Code anders schreiben. In Ihrem Beispiel oben ordnen Sie große Puffer (4kB) auf dem Stapel zu. Tun Sie das nicht, wenn es absolut notwendig ist. Ich beziehe mich auf diese:

int main(void) { 
    // ... 
    uint32_t to_send[512]; 
    uint32_t to_receive[512]; 
    // ... 
} 

Stattdessen Ihre Puffer wie folgt vergeben:

uint32_t to_send[512]; 
uint32_t to_receive[512]; 

int main(void) { 
    // ... 
} 
+1

Sie auch die Puffer innerhalb des Haupt mit einer statischen Deklaration definieren könnte. –

+0

Danke. Ich bin mir nicht sicher, ob das Problem daraus kommt, denn ohne die Aufrufe der integrierten Funktionen lesen und schreiben auf die SD-Karte funktioniert der Code perfekt. Weißt du, was diesen Fehler in diesen eingebauten Funktionen verursachen könnte? –

+1

Haben Sie es versucht? Die Zuweisung solch großer Puffer ist ein Problem in eingebetteten Systemen. Sie sollten es auf jeden Fall beheben. Ich bin 90% sicher, dass dies die Ursache ist, vor allem, da die Fehlermeldung darauf hindeutet, dass Ihr Stack nur 1kB groß ist. Die Puffer werden wahrscheinlich weg optimiert oder etwas, wenn Sie die 'HAL_SD_ *' Funktionen nicht aufrufen – svens