前几天看见有大神用USB虚拟3COM,我用8M晶振的开发板可以通过,但是用16MHZ的晶振就不行,
用3.5的库,修改了2个地方,把外部晶振频率8M改16M,
1. #define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */
2. /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
在8M晶振配置上(以上代码) 增加以下代码
if(HSE_VALUE==16000000UL)
{ RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_HSE_Div2); // 16M2分频即8M,PLL=8M*9=72M
RCC->CFGR&= ~RCC_CFGR_USBPRE; // USB时钟72M/1.5=48M
}
这样修改后USB虚拟COM还是失败,但是用USART1串口打印的数据都正确,波特率也一样没错,那就证明PLL=72M是没错了,可是就是不明白USB识别不了
用回8M的开发板只修改#define HSE_VALUE ((uint32_t)8000000) 就正常,证明枚举过程的程序没有错,我估计是USB时钟配置存在问题,但是看手册该改的地方都改了,
实在想不明白还有什么地方遗漏,特来请教各位大神,我这程序到底是漏什么地方没修改
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我用cubemx建的虚拟COM工程,USB还是识别不了
感谢回复,事实上16M晶振是可以使USB时钟为48M的,主时钟先HSE二分频再提供到PLL,就能把系统时钟倍频到72M的,然后USB时钟2*PLL/3就是48M了,
我把8M的开发板换了16M晶振,就用上面设置就直接通过了,对比发现原来怎么都不能识别的是USBDM加上拉,而一直都可以的是USBDP加上拉,
这次算是给坑了,想问USDDM加上拉有可能识别出USB吗?
STM32不支持USB低速设备哦,所以应该是不行的。
也许可以将USB时钟搞到6MHz来支持低速设备(系统时钟6M/9M)?没有验证过。
一周热门 更多>