打印

请问香板,STM32L15XX在使用USB时,HSE为何不能作为系统时钟

[复制链接]
5650|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xusnwise 于 2011-7-12 15:38 编辑

请问香板,STM32L15XX在使用USB时,HSE为何不能作为系统时钟。

我把PLL的VCO配置为96M,然后用PLL的4分频作为HCLK,系统可以工作,
USB也能传输,这样的话功耗很大啊,我用纽扣电池供电的。

我又试了,把USB配置为96M后,用HSE的4M做HCLK,这样USB不能通讯了。
我的HCLK不能用那么高的频率的,太耗电。

请教下香板
沙发
xusnwise|  楼主 | 2011-7-12 16:31 | 只看该作者
我的HSE用的4M的晶体, 似乎只有把系统时钟配置为12M, 24M, 这样的频率,USB模块
才能正常工作。

使用特权

评论回复
板凳
vigia| | 2011-7-12 17:04 | 只看该作者
我猜测SYSCLK在USB应用下应该有个最小值,因为48M的时钟是给USB收发器用的,USB寄存器的访问还是要用到PCLK1的。不过可惜手册上面没有找到这样的说明。

使用特权

评论回复
地板
香水城| | 2011-7-12 17:49 | 只看该作者
在数据手册中找到相应的说明,请看时钟树的框图下面的注释:使用USB功能时,必须同时使能HSE和PLL,并且CPU应该运行于24MHz或32MHz。

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00277537.pdf

STM32L151xx_Clock_Tree.GIF (35.02 KB )

STM32L151xx_Clock_Tree.GIF

使用特权

评论回复
5
香水城| | 2011-7-12 17:51 | 只看该作者
其实LZ的担心是多虑了,当你接上USB的时候,根本不需要再使用电池供电,USB端口可以提供足够的供电。

使用特权

评论回复
6
xusnwise|  楼主 | 2011-7-12 20:17 | 只看该作者
香板,我现在就是这样配置的,PLL为96MHZ,
PLL的4分频24MHZ作为 系统时钟, 关键是我的系统大部分时间是不连接USB的,
我想降低功耗不想用24MHZ这么高的系统频率啊, 但不用24MHZ有不能和USB通讯。
有没有办法让CPU在不连接USB时工作在4M主频下,连了USB工作在24MHZ主频下

使用特权

评论回复
7
xusnwise|  楼主 | 2011-7-12 20:24 | 只看该作者
我晕倒,我的手册RM0038和香板的不一样啊,这让我怎么开发。刚开始看到香板的图片,我还埋怨自己做事不认真呢,原来不是我的
错啊,手册我也仔细看了,就是没看到这个提示,原来是版本不一样啊
我在ST官网上下的。

untitled.JPG (61.58 KB )

untitled.JPG

使用特权

评论回复
8
xusnwise|  楼主 | 2011-7-12 20:30 | 只看该作者
有木有办法让CPU在不连USB时4MHZ工作,
连了USB就24MHZ工作?

请教下,谢谢。
香板真是热心啊,赞。以后神马LM3S, M051都不用了,呵呵

使用特权

评论回复
9
xusnwise|  楼主 | 2011-7-12 20:33 | 只看该作者
用了一段时间M051,感觉很是不爽,ADC的VREF居然是固定的AVDD,
Timer没有UP_DOWM mode,不能双向计数,手册写的超简洁,要配合
代码库才知道什么功能,我撤出了

使用特权

评论回复
10
香水城| | 2011-7-12 21:35 | 只看该作者
1) 4楼的截图不是来自RM0038,是来自STM32L151的数据手册,我不是在4楼给出了文档的下载地址了嘛?

2)没有连接USB电缆时,根本不用使能USB模块,这样怎么会有时钟频率的限制呢?
连接USB电缆之后才需要使能USB模块,这时系统是由USB供电,不会影响电池的寿命。

使用特权

评论回复
11
xusnwise|  楼主 | 2011-7-13 08:32 | 只看该作者
本帖最后由 xusnwise 于 2011-7-13 09:14 编辑

我的意思是,我的CPU使用HSE工作在4M,连接USB时无法通信。
如果CPU使用PLL配置在24M,连接USB可以工作。
不连接USB,也让CPU工作在24M,这很耗电啊,我的系统大部分时间在
采集数据不连接USB, 让我运行在24M太离谱了吧

而且即使CPU使用PLL做时钟, HCLK如果不配置为12M或者24M, USB
是无法连接的。

贴上程序。
void        RCC_Config(void)
{
        RCC_DeInit();
        /* use external osc 4M */
        RCC_HSEConfig(RCC_HSE_ON);
        /* Wait for hse startup */
        while(!RCC_WaitForHSEStartUp());
        /* Select the HSE as the PLL source */
        /* Config the pll clock 96M HZ      */
        RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_24, RCC_PLLDiv_4);
        /* Select the HSE as the system clk */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);   这里配置为PLL,USB才能工作,使用HSE就不行

        /* Set system clk as HCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   这里HCLK不配置为12,24M, USB无法工作
        /* Set APB1_CLK = HCLK */
        RCC_PCLK1Config(RCC_HCLK_Div1);
        /* Set APB2_CLK = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PLL enable */
        RCC_PLLCmd(ENABLE);
        /* wait for PLL stable */
        while( RCC_GetSYSCLKSource() != 0x08 );

}

使用特权

评论回复
12
huangqi412| | 2011-7-13 09:13 | 只看该作者
不知道你的应用能不能这么干:平时配置为低速,检测USB脚,一旦检测到,切换电源,切换配置为高速。  再一旦检测到拔出,又切换电源,切换到低速

使用特权

评论回复
13
香水城| | 2011-7-13 09:46 | 只看该作者
不知道你的应用能不能这么干:平时配置为低速,检测USB脚,一旦检测到,切换电源,切换配置为高速。  再一旦检测到拔出,又切换电源,切换到低速
huangqi412 发表于 2011-7-13 09:13


对!

LZ需要检测USB电缆的插入和拔出,比如通过判断USB +5V进行监测。

使用特权

评论回复
14
huangqi412| | 2011-7-13 11:06 | 只看该作者
香主,LZ也可能应用比较特殊而无法这么干。 先得看LZ具体应用和要求。

使用特权

评论回复
15
香水城| | 2011-7-13 11:28 | 只看该作者
香主,LZ也可能应用比较特殊而无法这么干。 先得看LZ具体应用和要求。
huangqi412 发表于 2011-7-13 11:06


哈哈,即使LZ不想使用5V-3V的LDO,也可以通过判断USB +5V监测USB电缆的插入和拔出,然后切换时钟频率。

使用特权

评论回复
16
yinyangdianzi| | 2011-7-14 11:03 | 只看该作者
STM32L152万岁

使用特权

评论回复
17
wuqiushan741826| | 2013-3-15 22:23 | 只看该作者
香水城 发表于 2011-7-13 11:28
哈哈,即使LZ不想使用5V-3V的LDO,也可以通过判断USB +5V监测USB电缆的插入和拔出,然后切换时钟频率。 ...

切换时钟频率时,可能对一些延时不准确,导致一些芯片无法工作怎么办???请教香板

使用特权

评论回复
18
wuwovicky| | 2015-3-14 13:20 | 只看该作者
xusnwise 发表于 2011-7-13 08:32
我的意思是,我的CPU使用HSE工作在4M,连接USB时无法通信。
如果CPU使用PLL配置在24M,连接USB可以工作。
...

我用的是STM32L151C8,我只将PLLMUX配置成96M,就能够使用USB了,我还做过实验,将PLLMUX配置成48M,然后PLL输出24M,USB不工作,只有将PLLMUX配置成96M,USB才能正常工作
    /*  PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
                                        RCC_CFGR_PLLDIV));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMUL12);

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
        
    /* Select HSE as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE;

    /* Wait till HSE is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_HSE)
    {
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

294

帖子

0

粉丝