求教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时钟配置存在问题,但是看手册该改的地方都改了,
实在想不明白还有什么地方遗漏,特来请教各位大神,我这程序到底是漏什么地方没修改
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
huarana
1楼-- · 2019-12-28 00:57
可以对照cubemx看看时钟树 参考一下
way2888
2楼-- · 2019-12-28 05:47
huarana 发表于 2017-6-1 21:07
可以对照cubemx看看时钟树 参考一下

我用cubemx建的虚拟COM工程,USB还是识别不了
takashiki
3楼-- · 2019-12-28 11:41
 精彩回答 2  元偷偷看……
Jacy
4楼-- · 2019-12-28 17:21
系统时钟用72M?还是你系统要用16*9=144MHz?要是144MHz的话分不到48M给USB,只有主频在48M,72M、96M的情况下USB的时钟才能得到48M,如果你用16M外部晶振,那你把系统改成3倍频或者6倍频就好了,产生48MHz的系统时钟,或者96MHz。对应USB分频系数分别是1和2
way2888
5楼-- · 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吗?
takashiki
6楼-- · 2019-12-28 22:31
way2888 发表于 2017-6-2 22:12
感谢回复,事实上16M晶振是可以使USB时钟为48M的,主时钟先HSE二分频再提供到PLL,就能把系统时钟倍频到72M ...

STM32不支持USB低速设备哦,所以应该是不行的。
也许可以将USB时钟搞到6MHz来支持低速设备(系统时钟6M/9M)?没有验证过。

一周热门 更多>