ST意法半导体
直播中

曹利娟

8年用户 990经验值
私信 关注
[问答]

连接到PC时无法将USB端口识别为设备是为什么?如何解决?

@
我在我的应用程序中使用 STM32F469 MCU,我在 FS 的设备模式下使用 USB。
在这里,我无法转到“OTG_FS_IRQHandler”中断处理程序,而且 PC 无法识别虚拟端口。
它在主机模式下运行良好,电路板成功检测到笔式驱动器并将数据写入其中。
如果我在 STM32F217 上使用同一个库,它可以正常工作。
系统时钟配置为 168MHz。
以下是我用过的功能
#define USB_OTG_HS_BASE_ADDR 0x40040000
#define USB_OTG_FS_BASE_ADDR 0x50000000
无效 usbDevInit()
{
  USB_OTG_BSP_disableVBUS();
USBH_Disconnect(&USB_OTG_Core);
delay_ms(10);
usbStatus = USB_DEV;
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb); // USB 设备初始化
delay_ms(20);
}
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
        USB_OTG_CORE_ID_TypeDef coreID,
        USBD_DEVICE *pDevice,         
        USBD_Class_cb_TypeDef *class_cb)
{
/* 硬件初始化 */
USB_OTG_BSP_Init(pdev);
  
USBD_DeInit(pdev);  
/*注册类和用户回调*/
pdev->dev.class_cb = class_cb;
pdev->dev.usr_device = pDevice;   
  
/* 设置 USB OTG 核心参数 */
DCD_Init(pdev, coreID);  
/* 启用中断 */
USB_OTG_BSP_EnableInterrupt(pdev);
}
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
{
        GPIO_InitTypeDef GPIO_InitStructure;  
        
        RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE);   
        
        /* 配置 SOF VBUS ID DM DP 引脚 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 |GPIO_Pin_11 |GPIO_Pin_12;
        
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  
  
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG1_FS);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS);
  
        /* 这用于 ID 行调试 */
        
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,启用);
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ;
        如果(usbStatus == USB_HOST)
/* 为延时函数初始化定时器 */
USB_OTG_BSP_timeInit();
        
}
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev)
{
/* 软件初始化 */
        USBD_Suspend(pdev);
        USB_OTG_BSP_DisableInterrupt(pdev);
  
返回USBD_OK;
}
void DCD_Init(USB_OTG_CORE_HANDLE *pdev ,
       USB_OTG_CORE_ID_TypeDef 核心ID)
{
uint32_t我;
USB_OTG_EP *ep;
  
USB_OTG_SelectCore (pdev, coreID);
  
pdev->dev.device_status = USB_OTG_DEFAULT;
pdev->dev.device_address = 0;
  
/* 初始化 ep 结构 */
for (i = 0; i < pdev->cfg.dev_endpoints ; i++)
{
  ep = &pdev->dev.in_ep;
  /* 初始化 ep 结构 */
  ep->is_in = 1;
  ep->num = i;
  ep->tx_fifo_num = i;
  /* 控制直到 ep 被激活 */
  ep->type = EP_TYPE_CTRL;
  ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
  ep->xfer_buff = 0;
  ep->xfer_len = 0;
}
  
for (i = 0; i < pdev->cfg.dev_endpoints; i++)
{
  ep = &pdev->dev.out_ep;
  /* 初始化 ep 结构 */
  ep->is_in = 0;
  ep->num = i;
  ep->tx_fifo_num = i;
  /* 控制直到 ep 被激活 */
  ep->type = EP_TYPE_CTRL;
  ep->maxpacket = USB_OTG_MAX_EP0_SIZE;
  ep->xfer_buff = 0;
  ep->xfer_len = 0;
}
  
USB_OTG_DisableGlobalInt(pdev);
  
/*初始化核心(通用初始化)*/
USB_OTG_CoreInit(pdev);
/* 强制设备模式*/
USB_OTG_SetCurrentMode(pdev, DEVICE_MODE);
  
/* 初始化设备 */
USB_OTG_CoreInitDev(pdev);
  
  
/* 启用 USB 全局中断 */
USB_OTG_EnableGlobalInt(pdev);
}
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = OTG_FS_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);  
        
}
请帮助我解决问题。







回帖(1)

黄飞高

2023-1-4 09:54:50
FirmwareProjectsSTM32469I_EVALApplicationsUSB_DeviceCDC_Standalone 下提供的示例,它可能对您有所帮助。
此外,确保您已正确配置中断并启用 NVIC。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分