2016-12-20 63 views
3

我正在使用基於微控制器STM32F401RET6的Nucleo F401Re電路板。我連接到一個Micro SD插槽,並有興趣將數據寫入SD卡並從中讀取數據。我使用STM32CubeX軟件生成代碼,特別是內置函數的SD庫。我試圖編寫一個簡單的代碼,將數組寫入特定的數組,並嘗試讀取相同的數據後綴。代碼如下:使用STM32處理器與SD卡通信 - SDIO協議

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); 

} 

在功能HAL_Init(中間的代碼stopps)和我得到了以下信息:

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

此消息未出現時,我不不使用函數HAL_SD_WriteBlocks()或HAL_SD_ReadBlocks()。如果有人已經有這個問題,並知道如何解決它,一些幫助會救我。如果需要,我可以添加其餘的代碼。

回答

5

您使用的堆棧空間太多。您可以調整鏈接器腳本中分配的堆棧空間,並在需要時增加它。

但是,你可以通過不同的方式編寫代碼來避免這種情況。在你上面的例子中,你正在堆棧上分配大的緩衝區(4kB)。除非絕對必要,否則不要這樣做。我指的是這樣的:

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

相反,分配你的緩衝區這樣的:

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

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

你可以內主要使用的是靜態聲明還定義了緩衝區。 –

+0

謝謝。我不確定是否問題來自於此,因爲如果沒有調用內置函數讀取和寫入sd卡,代碼完美工作。你知道什麼可能會導致這些失敗的功能? –

+1

你試過了嗎?在嵌入式系統中分配如此巨大的緩衝區是一個問題,你應該修復它。我90%確定這是根本原因,尤其是因爲錯誤消息表明你的堆棧只有1kB大小。如果你沒有調用'HAL_SD_ *'函數,緩衝區可能會被優化掉或者其他東西。 – svens