使用MCU为STM32F105VC,新建工程,使用Keil 自带ST std库,以及ST Legacy usb otg 库,
问题一为VBUS检测的设计疏漏
问题二为usb device无法正常枚举,使用库中参考工程也是一样情况,使用CubeMX生成工程验证了硬件正常,
最终使用Legacy工程和HAL工程运行对比工作状态发现Legacy中的异常状态,检查各处差异,发现驱动中读取到的系统时钟数值异常,跟踪时钟初始化代码并对于CubeMX中时钟树,发现整个usb的时钟都是异常的,按照CubeMX中的值调整后一切恢复正常。
问题根源为Keil中CMSIS CORE文件中bug,计算中默认认为F10x CL系列单片机使用25M晶振,导致PLL倍频因子计算错误,最终导致usb时钟异常。
#ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
按照HSE为8M来计算,将分频和倍频因子分别改为2和10.