用 STM32F407 做了个USB 从机设备,Windows 无法识别,换成STM例程 HID_Standalone,MSC_Standalone 也无法识别 确认情况如下: 1.USB线接的是对的,用万用表测过顺序是正确的,依次为 VBUS,D-,D+,ID,GND。D-接PA11 USBDM,D+接PA12 USBDP 2.ID线悬空,D+用1.5K电阻上拉,VBUS 不接,程序里修改为 hpcd.Init.vbus_sensing_enable = 0 3.晶振是 25MHZ,分频 RCC_OscInitStruct.PLL.PLLM = 25; USB时钟应该是 48MHZ的,其实例程里的晶振就是25MHZ,不用改 4.使用 Device Monitoring Studio 抓包,可以抓到48个上下行成对的包,都是成功的,大都是 URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT | URB_FUNCTION_VENDOR_OTHER | URB_FUNCTION_SELECT_CONFIGURATION 然后 Windows 报告:无法识别,在设备管理器里删除,重新枚举,也不行,不是一上电就上拉的问题。 请大侠们指点! |
stm32 USB的CDC类传输掉数据
STM32F105 USB接收数据不断进入中断,出现“死机”现象
关于STM32CubeMX配置的USB例程电脑无法识别问题
STM32F407 USB-HS-OTG是否不外接PHY可以做虚拟串口?
如何做一个USB从机键盘用stm32f407
用STM32F4 Cube MX生成的USB Device C代码的BUG
USB Device + FatFS + SDIO 模拟U盘意外只读问题
USB Device + FatFS + SDIO 问题
STM32H7配置成USB DEVICE时,连接电脑时不进入中断
STM32F446 USB和串口1 冲突
枚举时能看得到进 OTG_FS_IRQHandler 中断一次
d:\b.png
我的连接方法
你这是明显用的HS-OTG核的FS模式啊,配置编译选项用我上面说的试试。
试过加 USE_USB_OTG_FS,USE_EMBEDDED_PHY啊,不过是 USE_USB_OTG_FS,不是 USE_USB_OTG_HS。
全部编译宏如下:
USE_HAL_DRIVER,STM32F407xx,USE_STM324xG_EVAL,USE_USB_FS,USE_USB_OTG_FS,USE_EMBEDDED_PHY
我要怎样改?
我看你用的HAL下的USB库,我用的是标准库,有多大区别我不太清楚,你先修改成下面的试试。
USE_HAL_DRIVER,STM32F407xx,USE_STM324xG_EVAL,USE_USB_OTG_HS,USE_EMBEDDED_PHY
再确认下,你是不是用的HS-USB引脚通信的,如果是要修改为USE_USB_OTG_HS!
你好,没有外接 PHY啊,不能用 HS 模式吧,我用的是 PA11,PA12(USBDM/USBDP)两个管脚,CubeMx图形化工具生成 FS 模式的 USB 也是自动选择这两个脚的,用这两个脚会有问题吗?
USE_EMBEDDED_PHY是内嵌的,407应该有2组USB吧,一组全速一组高速的,都可以作为全速从设备使用,所以你就要明确你用的是哪个,然后初始化对应的USB外设。
嗯,查了,PA11,PA12是 FS 口, HS 的要外接 PHY
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hpcd->Instance == USB_OTG_FS)
{
/* Configure USB FS GPIOs */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* Configure DM DP Pins */
GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure VBUS Pin */
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure ID pin */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Enable USB FS Clocks */
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
/* Set USBFS Interrupt to the lowest priority */
HAL_NVIC_SetPriority(OTG_FS_IRQn, 7, 0);
/* Enable USBFS Interrupt */
HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
}
else if(hpcd->Instance == USB_OTG_HS)
{
/* Configure USB FS GPIOs */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
/* CLK */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* D0 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* D1 D2 D3 D4 D5 D6 D7 */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5 |\
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* STP */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* NXT */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
/* DIR */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
/* Enable USB HS Clocks */
__HAL_RCC_USB_OTG_HS_CLK_ENABLE();
__HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();
/* Set USBHS Interrupt to the lowest priority */
HAL_NVIC_SetPriority(OTG_HS_IRQn, 7, 0);
/* Enable USBHS Interrupt */
HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
}
}
1.我买的是16MHZ晶振,调试时偶然调用了HAL_RCC_GetSysClockFreq(); ,返回 262500000!我一倒着推算,晶振是25MHZ的,商家真是! 随改成25MHZ,无果,今天又改回16MHZ试,Widows竟然认了USB!HAL_RCC_GetSysClockFreq()函数不知干什么用的,不靠谱!
记得中间曾在16MHZ与25MHZ间来回改,为什么不行原因不知道,但现在确定晶振是16MHZ的没错。
2.中间也曾出现过24对Urb上下行包收发成功的记录,为什么没能识别,另外一个原因是 startup_stm32f407xx.s 函数堆栈太小!
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
ST东西丰富,五花八门,将0x00000400改成0x00000800,0x00000200改成0x00003000就可以了,U盘就安装成功了。堆栈小了枚举一定会失败,而且没有哪儿会报错。