OpenEdv-开源电子网

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

STM32F407-USB-IAP跳转过后USB枚举问题

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-6-25
在线时间
4 小时
发表于 2019-11-27 17:22:59 | 显示全部楼层 |阅读模式
5金钱
项目全部由STM32CubeMX生成,IAP参考原子哥的例程以及官网的例程;
插入带SD卡的读卡器的时候,IAP可以正常升级并且跳转到APP,跳转后读卡器还能正常枚举,然后使用。
但是换成普通的U盘就不行了,虽然IAP的时候可以正常使用,但是在跳转到APP之后,一直卡在获取设备描述符那个位置。
对这个U盘重新进行插拔动作,还是可以继续使用的。
再声明一个,除了换普通的U盘有这种异样,其他的IO都是正常使用的。
附上卡死的位置代码(由STM32CubeMX)
  1. /**
  2.   * @brief  USBH_HandleEnum
  3.   *         This function includes the complete enumeration process
  4.   * @param  phost: Host Handle
  5.   * @retval USBH_Status
  6.   */
  7. static USBH_StatusTypeDef USBH_HandleEnum (USBH_HandleTypeDef *phost)
  8. {
  9.   USBH_StatusTypeDef Status = USBH_BUSY;

  10.   switch (phost->EnumState)
  11.   {
  12.   case ENUM_IDLE:
  13.     /* Get Device Desc for only 1st 8 bytes : To get EP0 MaxPacketSize */
  14.     if ( USBH_Get_DevDesc(phost, 8U) == USBH_OK)  //死在这个判断上
  15.     {
  16.       phost->Control.pipe_size = phost->device.DevDesc.bMaxPacketSize;

  17.       phost->EnumState = ENUM_GET_FULL_DEV_DESC;

  18.       /* modify control channels configuration for MaxPacket size */
  19.       USBH_OpenPipe (phost,
  20.                            phost->Control.pipe_in,
  21.                            0x80U,
  22.                            phost->device.address,
  23.                            phost->device.speed,
  24.                            USBH_EP_CONTROL,
  25.                            (uint16_t)phost->Control.pipe_size);

  26.       /* Open Control pipes */
  27.       USBH_OpenPipe (phost,
  28.                            phost->Control.pipe_out,
  29.                            0x00U,
  30.                            phost->device.address,
  31.                            phost->device.speed,
  32.                            USBH_EP_CONTROL,
  33.                            (uint16_t)phost->Control.pipe_size);

  34.     }
  35.     break;

  36.   case ENUM_GET_FULL_DEV_DESC:
  37.     /* Get FULL Device Desc  */
  38.     if ( USBH_Get_DevDesc(phost, USB_DEVICE_DESC_SIZE)== USBH_OK)
  39.     {
  40.       USBH_UsrLog("PID: %xh", phost->device.DevDesc.idProduct );
  41.       USBH_UsrLog("VID: %xh", phost->device.DevDesc.idVendor );

  42.       phost->EnumState = ENUM_SET_ADDR;

  43.     }
  44.     break;

  45.   case ENUM_SET_ADDR:
  46.     /* set address */
  47.     if ( USBH_SetAddress(phost, USBH_DEVICE_ADDRESS) == USBH_OK)
  48.     {
  49.       USBH_Delay(2U);
  50.       phost->device.address = USBH_DEVICE_ADDRESS;

  51.       /* user callback for device address assigned */
  52.       USBH_UsrLog("Address (#%d) assigned.", phost->device.address);
  53.       phost->EnumState = ENUM_GET_CFG_DESC;

  54.       /* modify control channels to update device address */
  55.       USBH_OpenPipe (phost,
  56.                            phost->Control.pipe_in,
  57.                            0x80U,
  58.                            phost->device.address,
  59.                            phost->device.speed,
  60.                            USBH_EP_CONTROL,
  61.                            (uint16_t)phost->Control.pipe_size);

  62.       /* Open Control pipes */
  63.       USBH_OpenPipe (phost,
  64.                            phost->Control.pipe_out,
  65.                            0x00U,
  66.                            phost->device.address,
  67.                            phost->device.speed,
  68.                            USBH_EP_CONTROL,
  69.                            (uint16_t)phost->Control.pipe_size);
  70.     }
  71.     break;

  72.   case ENUM_GET_CFG_DESC:
  73.     /* get standard configuration descriptor */
  74.     if ( USBH_Get_CfgDesc(phost,
  75.                           USB_CONFIGURATION_DESC_SIZE) == USBH_OK)
  76.     {
  77.       phost->EnumState = ENUM_GET_FULL_CFG_DESC;
  78.     }
  79.     break;

  80.   case ENUM_GET_FULL_CFG_DESC:
  81.     /* get FULL config descriptor (config, interface, endpoints) */
  82.     if (USBH_Get_CfgDesc(phost,
  83.                          phost->device.CfgDesc.wTotalLength) == USBH_OK)
  84.     {
  85.       phost->EnumState = ENUM_GET_MFC_STRING_DESC;
  86.     }
  87.     break;

  88.   case ENUM_GET_MFC_STRING_DESC:
  89.     if (phost->device.DevDesc.iManufacturer != 0U)
  90.     { /* Check that Manufacturer String is available */

  91.       if ( USBH_Get_StringDesc(phost,
  92.                                phost->device.DevDesc.iManufacturer,
  93.                                phost->device.Data,
  94.                                0xFFU) == USBH_OK)
  95.       {
  96.         /* User callback for Manufacturing string */
  97.         USBH_UsrLog("Manufacturer : %s",  (char *)(void*)phost->device.Data);
  98.         phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC;

  99. #if (USBH_USE_OS == 1U)
  100.         phost->os_msg = (uint32_t)USBH_STATE_CHANGED_EVENT;
  101. #if (osCMSIS < 0x20000U)
  102.         (void)osMessagePut(phost->os_event, phost->os_msg, 0U);
  103. #else
  104.         (void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, NULL);
  105. #endif
  106. #endif
  107.       }
  108.     }
  109.     else
  110.     {
  111.      USBH_UsrLog("Manufacturer : N/A");
  112.      phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC;

  113. #if (USBH_USE_OS == 1U)
  114.      phost->os_msg = (uint32_t)USBH_STATE_CHANGED_EVENT;
  115. #if (osCMSIS < 0x20000U)
  116.      (void)osMessagePut(phost->os_event, phost->os_msg, 0U);
  117. #else
  118.      (void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, NULL);
  119. #endif
  120. #endif
  121.     }
  122.     break;

  123.   case ENUM_GET_PRODUCT_STRING_DESC:
  124.     if (phost->device.DevDesc.iProduct != 0U)
  125.     { /* Check that Product string is available */
  126.       if ( USBH_Get_StringDesc(phost,
  127.                                phost->device.DevDesc.iProduct,
  128.                                phost->device.Data,
  129.                                0xFFU) == USBH_OK)
  130.       {
  131.         /* User callback for Product string */
  132.         USBH_UsrLog("Product : %s",  (char *)(void *)phost->device.Data);
  133.         phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC;
  134.       }
  135.     }
  136.     else
  137.     {
  138.       USBH_UsrLog("Product : N/A");
  139.       phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC;

  140. #if (USBH_USE_OS == 1U)
  141.       phost->os_msg = (uint32_t)USBH_STATE_CHANGED_EVENT;
  142. #if (osCMSIS < 0x20000U)
  143.       (void)osMessagePut(phost->os_event, phost->os_msg, 0U);
  144. #else
  145.       (void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, NULL);
  146. #endif
  147. #endif
  148.     }
  149.     break;

  150.   case ENUM_GET_SERIALNUM_STRING_DESC:
  151.     if (phost->device.DevDesc.iSerialNumber != 0U)
  152.     { /* Check that Serial number string is available */
  153.       if ( USBH_Get_StringDesc(phost,
  154.                                phost->device.DevDesc.iSerialNumber,
  155.                                phost->device.Data,
  156.                                0xFFU) == USBH_OK)
  157.       {
  158.         /* User callback for Serial number string */
  159.          USBH_UsrLog("Serial Number : %s",  (char *)(void*)phost->device.Data);
  160.         Status = USBH_OK;
  161.       }
  162.     }
  163.     else
  164.     {
  165.       USBH_UsrLog("Serial Number : N/A");
  166.       Status = USBH_OK;

  167. #if (USBH_USE_OS == 1U)
  168.       phost->os_msg = (uint32_t)USBH_STATE_CHANGED_EVENT;
  169. #if (osCMSIS < 0x20000U)
  170.       (void)osMessagePut(phost->os_event, phost->os_msg, 0U);
  171. #else
  172.       (void)osMessageQueuePut(phost->os_event, &phost->os_msg, 0U, NULL);
  173. #endif
  174. #endif
  175.     }
  176.     break;

  177.   default:
  178.     break;
  179.   }
  180.   return Status;
  181. }
复制代码


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

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-27 18:05:16 | 显示全部楼层
帮顶                                                            
成功没有捷径
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-6-25
在线时间
4 小时
 楼主| 发表于 2019-11-27 19:03:46 | 显示全部楼层
没有大神遇到这种吗
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-6-25
在线时间
4 小时
 楼主| 发表于 2019-12-2 20:18:53 | 显示全部楼层
自顶一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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