首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F4: SD卡使用FatFs和USB失败

STM32F4: SD卡使用FatFs和USB失败
EN

Stack Overflow用户
提问于 2016-11-06 16:38:33
回答 1查看 1.1K关注 0票数 0

(在SE: Electrical Engineering上也被问到)

在我的应用程序中,我设置了一个STM32F4、SD卡和USB(都带有CubeMX)。使用PC机,我向STM32发送命令,然后由它在SD卡上执行操作.

这些命令是使用"communicationBuffer“(由我实现)来处理的,它等待通过USB、UART、.并在接收到\n字符时设置一个标志。主循环轮询此标志,如果设置了该标志,解析器将处理该命令。到现在为止还好。

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

当我通过USB接收命令时,问题就会发生.解析器按预期工作,但是FatFs声称FR_NO_FILESYSTEM (13)f_opendir中。另外,其他FatFs命令也会在此错误代码中失败。

在一个USB命令失败后,通过UART的命令也会失败.看起来,似乎USB以某种方式使初始化的SD卡驱动程序崩溃了.

知道我该怎么解决这个问题吗?还是调试的起点?

我的USB实现:

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

main()调用MX_USB_DEVICE_Init(void)

usbd_conf.c,我有:

代码语言:javascript
复制
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中实现如下:

代码语言:javascript
复制
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使用相同的实现--为各自的接口使用不同的实例。mBufstd::vector<char>类型的实例变量):

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 19:47:29

我解决了这个问题:

usb_cdc_if.c中,#define APP_RX_DATA_SIZE被设置为4 (原因不明)。由于这比数据包大小低,所以大于4个字节的传入数据包覆盖了我的内存。

发生了这样的情况,我内存的下面部分是FATFS* FatFs[]指针列表,指向初始化的Filesystem结构。

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

哎呀,那可真难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40451782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档