OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4838|回复: 6

阿波罗开发板stm32h743的sd+usb+fatfs,U盘打开文件失败求助!

[复制链接]

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-9-11
在线时间
6 小时
发表于 2022-4-29 09:55:10 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 tai0105 于 2022-4-29 09:57 编辑

有劳各位大佬!
使用stm32cubemax创建的工程,usb host选择支持所有class,但实际只使用hid和msc。
现在的现象:
sd卡挂载,读取正常,U盘挂载成功,但是打开/创建文件失败,后来发现本应在U盘创建的文件被创建到sd卡去了,如果没有插入sd卡,在U盘尝试创建文件时f_open返回 12(FR_NOT_ENABLED,/* (12) The volume has no work area */).
sd卡挂载代码:
uint8_t storage_mount_sd(void)
{
    BSP_SD_Init();
    uint8_t res = 0;
    if (HAL_SD_CARD_TRANSFER == HAL_SD_GetCardState(&hsd1))
    {
        res = f_mount(&SDFatFS, SDPath, 1);
        if (res == FR_OK)
        {
            printf("mount sd success.\n");
            res = f_open(&SDFile, "0:/sd_excel.xls", FA_WRITE | FA_CREATE_ALWAYS);
            if (res == FR_OK)
            {
                printf("open sd file success.\n");
                // char data_time[64];
                // calendar_get_data_time_string(data_time, 0);
                // int32_t num = f_puts(data_time, &SDFile);
                // printf("wirte %d char into file.\n", num);
                f_puts("123\t335\tasd\r\n456\t23\t", &SDFile);
                f_close(&SDFile);
                return 1;
            }
            else
            {
                printf("open sd file failed.\n");
                return 0;
            }
        }
        else
        {
            printf("mount sd failed.\n");
            return 0;
        }
    }
    else
    {
        return 0;
    }
}


fatfs.c文件代码如下:
uint8_t retSD;    /* Return value for SD */
char SDPath[4];   /* SD logical drive path */
FATFS SDFatFS;    /* File system object for SD logical drive */
FIL SDFile;       /* File object for SD */
uint8_t retUSBH;    /* Return value for USBH */
char USBHPath[4];   /* USBH logical drive path */
FATFS USBHFatFS;    /* File system object for USBH logical drive */
FIL USBHFile;       /* File object for USBH */

/* USER CODE BEGIN Variables */

/* USER CODE END Variables */

void MX_FATFS_Init(void)
{
  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
  /*## FatFS: Link the USBH driver ###########################*/
  retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);

  /* USER CODE BEGIN Init */
  /* additional user code for init */
  /* USER CODE END Init */
}

usb_host.c文件代码:
static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id);

/*
* -- Insert your external function declaration here --
*/
/* USER CODE BEGIN 1 */
// #include "key_names.c"
void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
{
  /* Prevent unused argument(s) compilation warning */
  // printf("hid %d event\n", (uint8_t)USBH_HID_GetDeviceType(phost));
  HID_TypeTypeDef dev_type = USBH_HID_GetDeviceType(phost);
  {
    if (dev_type == HID_KEYBOARD)
    {
      HID_KEYBD_Info_TypeDef *info = USBH_HID_GetKeybdInfo(phost);
      // uint8_t ascii_code = USBH_HID_GetASCIICode(info);
      // printf("keyborad \"%d\" \n", ascii_code);
      keyborad_got_info_event_handler(info);
    }
  }
  UNUSED(phost);
}

static void __mount_udisk(void)
{
  uint32_t free;
  uint8_t res = f_mount(&USBHFatFS, USBHPath, 1);
  if (res == FR_OK)
  {
    printf("usb disk mount successed.\n");

    res = f_error(&USBHFile);
    printf("usb disk error %d\n", res);

    res = f_getfree(USBHPath, (DWORD *)&free, (FATFS **)&USBHFatFS);
    if (FR_OK == res)
    {
      res = f_error(&USBHFile);
      printf("usb disk error %d\n", res);
      printf("usb disk free space %d\n", free);

      res = f_open(&USBHFile, "1:/usb.txt", FA_WRITE | FA_CREATE_ALWAYS); //此处尝试了usb.txt和1:/usb.txt的文件名,1:/usb.txt会进入hard fault
      if (FR_OK == res)
      {
        printf("usb disk put string test\n");
        int32_t num = f_puts("usb disk put string test.\n", &USBHFile);
        printf("usb disk write %d into file\n", num);
        f_close(&USBHFile);
      }
      else
      {

        printf("test open file failed %d.\n", res);
      }
    }
    else
    {
      printf("usb disk get free failed.\n");
    }
  }
  else
  {
    printf("usb disk mount failed.\n");
  }
}

static void __application_state_handler(void)
{
  switch (Appli_state)
  {
  case APPLICATION_IDLE:
    break;
  case APPLICATION_START:
    Appli_state = APPLICATION_IDLE;
    break;
  case APPLICATION_READY:
    __mount_udisk();
    Appli_state = APPLICATION_IDLE;
    break;
  case APPLICATION_DISCONNECT:
    f_mount(NULL, USBHPath, 0);
    Appli_state = APPLICATION_IDLE;
    break;
  default:
    break;
  }
}
/* USER CODE END 1 */

/**
* Init USB host library, add supported class and start the library
* @retval None
*/
void MX_USB_HOST_Init(void)
{
  /* USER CODE BEGIN USB_HOST_Init_PreTreatment */
  // HAL_PWREx_EnableUSBVoltageDetector();
  /* USER CODE END USB_HOST_Init_PreTreatment */

  /* Init host Library, add supported class and start the library. */
  if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_RegisterClass(&hUsbHostFS, USBH_AUDIO_CLASS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_RegisterClass(&hUsbHostFS, USBH_CDC_CLASS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_RegisterClass(&hUsbHostFS, USBH_HID_CLASS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_RegisterClass(&hUsbHostFS, USBH_MTP_CLASS) != USBH_OK)
  {
    Error_Handler();
  }
  if (USBH_Start(&hUsbHostFS) != USBH_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USB_HOST_Init_PostTreatment */

  /* USER CODE END USB_HOST_Init_PostTreatment */
}

/*
* Background task
*/
void MX_USB_HOST_Process(void)
{
  /* USB Host Background task */
  USBH_Process(&hUsbHostFS);
  __application_state_handler();
}
/*
* user callback definition
*/
static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id)
{
  /* USER CODE BEGIN CALL_BACK_1 */

  switch (id)
  {
  case HOST_USER_SELECT_CONFIGURATION:
    break;

  case HOST_USER_DISCONNECTION:
    Appli_state = APPLICATION_DISCONNECT;
    break;

  case HOST_USER_CLASS_ACTIVE:
    if ((USBH_MSC_CLASS)->ClassCode == USBH_GetActiveClass(phost))
    {
      Appli_state = APPLICATION_READY;
    }
    else
    {
      Appli_state = APPLICATION_IDLE;
    }
    break;

  case HOST_USER_CONNECTION:
    Appli_state = APPLICATION_START;
    break;

  default:
    break;
  }
  /* USER CODE END CALL_BACK_1 */
}







正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-4-29 10:09:33 | 显示全部楼层
去掉/试试,也就是“1:usb.txt”
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-9-11
在线时间
6 小时
 楼主| 发表于 2022-4-29 10:50:35 | 显示全部楼层
Egoista 发表于 2022-4-29 10:09
去掉/试试,也就是“1:usb.txt”

这种方式也试过,跟1:/usb.txt 一样会进入hardfault。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-9-11
在线时间
6 小时
 楼主| 发表于 2022-4-29 11:00:46 | 显示全部楼层
Egoista 发表于 2022-4-29 10:09
去掉/试试,也就是“1:usb.txt”

改掉链接驱动的顺序,是U盘盘符为0:/, sd为1:/这个情况下任何文件名称试图在U盘创建文件都是直接hard fault.
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2019-6-27
在线时间
15 小时
发表于 2022-4-29 11:15:37 | 显示全部楼层
tai0105 发表于 2022-4-29 10:50
这种方式也试过,跟1:/usb.txt 一样会进入hardfault。

看问题描述像是盘号乱了,但是看init函数里顺序确实是SD第一,USB第二,要不你把0: 2:试一遍?没办法了,有病乱投医嘛
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-9-11
在线时间
6 小时
 楼主| 发表于 2022-4-29 11:29:57 | 显示全部楼层
Egoista 发表于 2022-4-29 11:15
看问题描述像是盘号乱了,但是看init函数里顺序确实是SD第一,USB第二,要不你把0: 2:试一遍?没办法 ...

试了现在我只能把sd从工程删掉单试U盘了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2013-9-11
在线时间
6 小时
 楼主| 发表于 2022-4-29 19:39:19 | 显示全部楼层
Egoista 发表于 2022-4-29 11:15
看问题描述像是盘号乱了,但是看init函数里顺序确实是SD第一,USB第二,要不你把0: 2:试一遍?没办法 ...

我单独建了一个工程,只有sd卡和usb msc,然后莫名其妙的它就行了。。。。。配置一个都没变,相关代码一行都没改。。。。我对usb太菜了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表