2016-12-20 13 views
3

마이크로 컨트롤러 STM32F401RET6 기반의 Nucleo F401Re 보드를 사용하고 있습니다. 보드에 마이크로 SD 슬롯을 연결하고 SD 카드에 데이터를 쓰고 데이터를 읽는 데 관심이있었습니다. 필자는 STM32CubeX 소프트웨어를 사용하여 코드를 생성했으며, 특히 내장 된 기능을 갖춘 SD 라이브러리를 생성했습니다. 특정 배열에 배열을 쓰고 같은 데이터를 나중에 읽으려고하는 간단한 코드를 작성하려고했습니다.STM32 프로세서 - SDIO 프로토콜을 사용하는 SD 카드와의 통신

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

관련 문제