마이크로 컨트롤러 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() 함수를 사용하지 마십시오. 누군가 이미이 문제를 가지고 있고 그것을 고치는 법을 알고 있다면, 어떤 도움이 나를 구할 것입니다. 필요한 경우 나머지 코드를 추가 할 수 있습니다.
또한 정적 선언을 사용하여 주 내에서 버퍼를 정의 할 수 있습니다. –
감사합니다. 나는 문제가 그것에서 오는지 모르지만 내장 된 함수를 호출하지 않고 SD 카드에 코드를 읽고 쓰면 코드가 완벽하게 작동하기 때문이다. 내장 된 함수에서이 실패를 일으킬 수있는 것이 무엇인지 알고 있습니까? –
시도해 보셨습니까? 그런 거대한 버퍼를 할당하는 것은 임베디드 시스템에서 문제가된다. 어느쪽으로 든 고쳐야한다. 저는 90 %가 근본 원인이라고 확신합니다. 특히 오류 메시지가 스택의 크기가 1kB 밖에되지 않기 때문에 그렇습니다. 버퍼가 아마도'HAL_SD_ *'함수를 호출하지 않으면 최적화되거나 사라질 것입니다. – svens