@
我在我的应用程序中使用
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);
}
请帮助我解决问题。