STM32F4:使用 FatFs 和 USB 的 SD 卡出现故障

问题描述 投票:0回答:2

(也在SE:电气工程上询问)

在我的应用程序中,我设置了 STM32F4、SD 卡和 USB-CDC(全部使用 CubeMX)。 我使用 PC 向 STM32 发送命令,然后 STM32 在 SD 卡上执行操作。

这些命令是使用“communicationBuffer”(由我实现)处理的,它等待 USB、UART 等上的命令,并在收到

\n
字符时设置一个标志。主循环轮询该标志,如果设置了该标志,则解析器将处理该命令。到目前为止,一切都很好。

当我通过 UART 发送命令时,它工作正常,我可以毫无问题地获取 SD 卡上的文件列表或通过 FatFs 执行其他访问。

当我通过 USB-CDC 接收命令时,就会出现问题。解析器按预期工作,但 FatFs 在

FR_NO_FILESYSTEM (13)
中声明
f_opendir
。 其他 FatFs 命令也会失败并出现此错误代码。

USB 命令失败后,通过 UART 的命令也会失败。看起来好像 USB 不知何故使初始化的 SD 卡驱动程序崩溃了。

知道如何解决此行为吗?或者调试的起点?


我的 USB 实现:

我使用的是CubeMX,因此使用规定的方式初始化USB-CDC接口:

main() 调用

MX_USB_DEVICE_Init(void)

usbd_conf.c
我有:

void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(pcdHandle->Instance==USB_OTG_FS)
  {
  /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */

  /* USER CODE END USB_OTG_FS_MspInit 0 */

    /**USB_OTG_FS GPIO Configuration    
    PA11     ------> USB_OTG_FS_DM
    PA12     ------> USB_OTG_FS_DP 
    */
    GPIO_InitStruct.Pin = OTG_FS_DM_Pin|OTG_FS_DP_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_USB_OTG_FS_CLK_ENABLE();

    /* Peripheral interrupt init */
    HAL_NVIC_SetPriority(OTG_FS_IRQn, 7, 1);
    HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */

  /* USER CODE END USB_OTG_FS_MspInit 1 */
  }
}

接收过程在

usbd_cdc_if.c
中实现如下:

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */

    mRootObject->mUsbBuffer->fillBuffer(Buf, *Len);

    USBD_CDC_ReceivePacket(&hUsbDeviceFS);

    return (USBD_OK);

  /* USER CODE END 6 */ 
}

fillBuffer
的实现如下(我对 UART 和 USB 传输使用相同的实现 - 各个接口具有单独的实例。
mBuf
std::vector<char>
类型的实例变量):

void commBuf::fillBuffer(uint8_t *buf, size_t len)
{
    // Check if last fill has timed out
    if(SystemTime::getMS() - lastActionTime > timeout) {
        mBuf.clear();
    }
    lastActionTime = SystemTime::getMS();

    // Fill new content
    mBuf.insert(mBuf.end(), buf, buf + len);

    uint32_t done = 0;
    while(!done) {
        for(auto i = mBuf.end() - len, ee = mBuf.end(); i != ee; ++i) {
            if(*i == '\n') {
                newCommand = true;
                myCommand = std::string((char*) &mBuf[0],i - mBuf.begin() + 1);

                mBuf.erase(mBuf.begin(), mBuf.begin() + (i - mBuf.begin() + 1));
                break;
            }

        }
        done = 1;
    }
}
usb sd-card stm32
2个回答
0
投票

我解决了问题:

usb_cdc_if.c
中,
#define APP_RX_DATA_SIZE
设置为
4
(出于某种未知原因)。由于这低于数据包大小,因此大于 4 字节的传入数据包会覆盖我的内存。

碰巧,我的记忆的以下部分是指向初始化的 FATFS 文件系统结构的

FATFS* FatFs[]
指针列表。

因此,当 5 个或更多字节的命令到达时,该结构的地址被覆盖。

唷,那是一个艰难的过程。


0
投票

我也想知道解决方案,因为我正在开发一个项目,我将 SD 卡与 FATFS 和 USB 一起使用,但我面临很多问题......

我目前正在开展一个项目,涉及在 STM32F407VG 微控制器上集成用于数据传输和数据记录的 USB 功能。具体来说,我想将数据文件记录在 SD 卡上,并使用户能够通过 USB 从 SD 卡下载这些记录的文件。此外,我希望允许用户通过 USB 将文件从 PC 复制到 SD 卡,全部通过 STM32F407VG 使用 SDIO 通信协议。

我面临着如何使 USB_OTG_FS(On-The-Go 全速 USB)和 SD 卡(使用 FatFS)无缝协作的挑战。我非常感谢您的指导以及您对如何实现这种集成的任何见解。

以下是我的一些具体问题:

How do I configure USB_OTG_FS as a USB Device in STM32CubeMX or other development tools?
What are the essential initialization and setup steps for using the USB_OTG_FS as a USB Device alongside the FatFS library for SD card communication?
Are there any sample code snippets or project examples that demonstrate this integration?
What should I be mindful of when managing the data transfer between the USB and SD card to avoid conflicts or data corruption?
© www.soinside.com 2019 - 2024. All rights reserved.