将STM32的USB初始化为USB从机,使用标准HID协议。控制板自带VBUS供电,因此不需要VBUS、GND引脚。 只要连接2根数据线到电脑即可。 源码分析当使用USB线连接电脑端后,收到电脑端的USB复位包
USBD_OTG_ISR_Handler --> DCD_HandleSof_ISR --> /* Clear interrupt */ OTG_HS_GINTSTS->SOF:在设备模式下,模块将该位置 1 时,指示 USB 上已接收到一个 SOF 令牌。应用程序可通过读取设备状态寄存器来获得当前的帧编号。只有在模块以 FS 模式运行时,才会出现此中断。 GINTSTS.d32 = 0; GINTSTS.b.sofintr = 1; USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32);
DCD_HandleUsbReset_ISR --> /* Clear the Remote Wake-up Signaling */ OTG_HS_DCTL->RWUSIG:应用程序将此位置 1 时,模块会启动远程发送信号,以唤醒 USB 主机。应用程序必须将此位置 1 以使模块退出挂起状态。根据 USB 2.0 规范,应用程序必须在将此位置 1 之后的 1 ms 到15 ms 内将其清零。 dctl.b.rmtwkupsig = 1; USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 );
/* Reset Device Address */ 复位后,设备地址默认为0 OTG_HS_DCFG->DAD: 设备地址(7位, 范围:0~128),0地址为公共地址 dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); dcfg.b.devaddr = 0; USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32);
/* setup EP0 to receive SETUP packets */ USB_OTG_EP0_OutStart(pdev);
/* Clear interrupt */ OTG_HS_GINTSTS->USBRST: USB 复位 (USB reset) 模块将该位置 1 时,指示在 USB 上检测到复位信号。注意: 仅可在设备模式下访问。 gintsts.d32 = 0; gintsts.b.usbreset = 1; USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32);
/*Reset internal state machine */ USBD_DCD_INT_fops->Reset(pdev);
|