本帖最后由 besthuman 于 2016-6-7 12:25 编辑
我在stm32f439上做USB虚拟串口的开发。之前在stm32f407开发时用的全速内置PHY,没有问题。因为在f439上需要做U盘和USB虚拟串口两个功能,所以VCP采用的是高速模式下的全速核,结果发现以下问题,求高手或有相关开发经验的帮忙分析一下。我用的St的Cube库 V11.0:
1.刚开始枚举时发现驱动有一个黄色感叹号,后来发现是VCP枚举时需要手动malloc申请内存,是我堆空间设的小所致。解决后,发现我多次插拔USB,差不多十次左右,黄色感叹号又出现了。再次插拔又恢复正常
2.用VCP传输文件时,发现txt和hex文件都能成功,唯独传输bin文件(700多K)时,大概只能传输100多k,串口设备就报“写文件被意外中断”的错误
3.VCP写数据时调用了官方API后,由cube库去发送数据。发现API返回成功,但数据却没发出去。调用的API为 USBD_CDC_SetTxBuffer(&USBD_Device, pSrc, len);
if(USBD_CDC_TransmitPacket(&USBD_Device) == USBD_OK)
{}
我的硬件配置如下,请大神帮忙啊
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hpcd->Instance == USB_OTG_HS)
{
/* Configure USB FS GPIOs */
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure DM DP Pins */
GPIO_InitStruct.Pin = (//GPIO_PIN_13 |
GPIO_PIN_14 | GPIO_PIN_15);
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;//GPIO_AF10_OTG_HS;//
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_RESET);
/* Enable USB FS Clocks */
__HAL_RCC_USB_OTG_HS_CLK_ENABLE();
/* Set USBFS Interrupt priority */
HAL_NVIC_SetPriority(OTG_HS_IRQn, 6, 0);
/* Enable USBFS Interrupt */
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_SET);
}
}
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
{
/* Change Systick prioity */
NVIC_SetPriority (SysTick_IRQn, 0);
#ifdef USE_USB_HS
/*Set LL Driver parameters */
hpcd.Instance = USB_OTG_HS;
hpcd.Init.dev_endpoints = 4;
hpcd.Init.use_dedicated_ep1 = 0;
hpcd.Init.ep0_mps = 0x40;
hpcd.Init.dma_enable = 0;
hpcd.Init.low_power_enable = 0;
hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
hpcd.Init.Sof_enable = 0;
hpcd.Init.speed = PCD_SPEED_FULL;
hpcd.Init.vbus_sensing_enable = 1;//DISABLE;//1;
/* Link The driver to the stack */
hpcd.pData = pdev;
pdev->pData = &hpcd;
/*Initialize LL Driver */
HAL_PCD_Init(&hpcd);
HAL_PCDEx_SetRxFiFo(&hpcd, 0x80);
HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40);
HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80);
// HAL_PCDEx_SetRxFiFo(&hpcd, 0x200);
// HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x80);
// HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x174);
#endif
return USBD_OK;
} |