【问题标题】:Communication with SD Card with STM32 Processor - SDIO protocol使用 STM32 处理器与 SD 卡通信 - SDIO 协议
【发布时间】:2017-05-05 20:44:55
【问题描述】:

我正在使用基于微控制器 STM32F401RET6 的板 Nucleo F401Re。我将一个 Micro SD 插槽连接到板上,并有兴趣将数据写入 SD 卡并从中读取数据。我使用软件 STM32CubeX 来生成代码,特别是带有内置函数的 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() 中间停止,我收到以下消息:

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

当我不使用函数 HAL_SD_WriteBlocks() 或 HAL_SD_ReadBlocks() 时,不会出现此消息。如果有人已经遇到这个问题并且知道如何解决它,那么一些帮助会拯救我。如果需要,我可以添加其余代码。

【问题讨论】:

    标签: c stm32 iar stm32f4discovery


    【解决方案1】:

    您使用了太多的堆栈空间。您可以在链接描述文件中调整分配的堆栈空间,并在需要时增加它。

    但是,您可以通过以不同方式编写代码来避免这种情况。在上面的示例中,您在堆栈上分配了大缓冲区(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) {
      // ...
    }
    

    【讨论】:

    • 您也可以使用静态声明在 main 中定义缓冲区。
    • 谢谢。我不确定问题是否来自于此,因为如果没有调用内置函数读取和写入 sd 卡,代码就可以完美运行。你知道什么可能导致这些内置函数失败吗?
    • 你试过了吗?在嵌入式系统中分配如此巨大的缓冲区是一个问题,您应该以任何一种方式解决它。我 90% 确定这是根本原因,尤其是因为错误消息表明您的堆栈大小只有 1kB。如果您不调用 HAL_SD_* 函数,缓冲区可能会被优化掉或其他东西
    • 成功了!我现在还有其他问题,但我会首先尝试调试,也许会发布一个单独的问题。谢谢!
    • 不客气 :)。是的,如果您需要其他问题的帮助,您绝对应该创建一个新问题。
    猜你喜欢
    • 2022-08-18
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多