求教STM32F103 16MH晶振如何配置USB虚拟串口

2019-12-27 18:58发布

前几天看见有大神用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时钟配置存在问题,但是看手册该改的地方都改了,
实在想不明白还有什么地方遗漏,特来请教各位大神,我这程序到底是漏什么地方没修改
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
way2888
2019-12-28 21:09
本帖最后由 way2888 于 2017-6-2 22:37 编辑
Jacy 发表于 2017-6-2 15:24
系统时钟用72M?还是你系统要用16*9=144MHz?要是144MHz的话分不到48M给USB,只有主频在48M,72M、96M的情 ...


感谢回复,事实上16M晶振是可以使USB时钟为48M的,主时钟先HSE二分频再提供到PLL,就能把系统时钟倍频到72M的,然后USB时钟2*PLL/3就是48M了,
我把8M的开发板换了16M晶振,就用上面设置就直接通过了,对比发现原来怎么都不能识别的是USBDM加上拉,而一直都可以的是USBDP加上拉,
这次算是给坑了,想问USDDM加上拉有可能识别出USB吗?

一周热门 更多>