打印

外部16M晶振,使用库函数USB不能识别。

[复制链接]
3630|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyx_200|  楼主 | 2011-9-2 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
加载了ST 的 Joystick Mouse demo 程序,在一块8M外部晶体上运行很好,在另一块16M的晶体上却不能识别。

16M的程序修改如下:
void Set_System(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    /* PCLK2 = HCLK */
//----------------------------------------------------------------------------
   // RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div2);  //  // 我修改过的
//----------------------------------------------------------------------------
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
//----------------------------------------------------------------------------
      RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_10);   // 我修改过的
//----------------------------------------------------------------------------
    /* On STICE the PLL output clock is fixed to 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while (RCC_GetSYSCLKSource() != 0x08)
    {}
  }
我是参照下面这个问题修改的。结果还是不正常。各位大虾,我应该如何改?
https://bbs.21ic.com/viewthread.php?tid=229480&highlight=usb%2B%E6%99%B6%E4%BD%93
沙发
IJK| | 2011-9-2 09:55 | 只看该作者
使用16M晶振,改起来挺容易的。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
改为:
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
其它地方基本上都不要改

使用特权

评论回复
板凳
yyx_200|  楼主 | 2011-9-2 10:43 | 只看该作者
使用16M晶振,改起来挺容易的。
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
改为:
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
其它地方基本上都不要改
IJK 发表于 2011-9-2 09:55

按你的方法改过,还是不能识别。

原理应该是16M晶振先4分频后是4M ,然后再 将 PLL 9倍频 4*9=36M
但应该是应该改高速时钟还是低速时钟?

  if (HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* HCLK = SYSCLK */
// 设置AHB时钟(HCLK)  HCLK,该时钟源自系统时钟(SYSCLK)
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   //AHB时钟 = 系统时钟
    /* PCLK2 = HCLK */
  //  RCC_PCLK2Config(RCC_HCLK_Div1);  //设置高速AHB时钟(PCLK2) APB2时钟 = HCLK
    RCC_PCLK2Config(RCC_HCLK_Div4);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);  //设置低速AHB时钟(PCLK1)APB1时钟 = HCLK
   //  RCC_PCLK1Config(RCC_HCLK_Div1);  //设置低速AHB时钟(PCLK1)APB1时钟 = HCLK
    /* On STICE the PLL output clock is fixed to 72 MHz */
//设置PLL时钟源及倍频系数
//PLL的输入时钟 = HSE时钟频率
//PLL输入时钟 x 9
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

使用特权

评论回复
地板
IJK| | 2011-9-2 14:21 | 只看该作者
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
它的目的是 晶振HSE=16M,PLL输出72M。

另外 USB时钟需要使用 /1.5,类似于这样的调用:
  /* Select USBCLK source */
  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

使用特权

评论回复
5
IJK| | 2011-9-2 14:23 | 只看该作者
需要提醒的是,STM32F103的USB时钟 必须是48M

使用特权

评论回复
6
lyy8611| | 2011-9-29 10:54 | 只看该作者
我用的是12M的外部晶振,那应该怎么设置呢?麻烦请教一下,我自己也没怎么看明白

使用特权

评论回复
7
sjnh| | 2011-9-29 16:15 | 只看该作者
按4楼的,只要想方设法把PLL输出72MHz就可以了,然后USB时钟设置:RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

当然也可以设置成48MHz,则USB时钟设置成RCC_USBCLKSource_PLLCLK_Div1,

其它PLL输出就无法设置了

使用特权

评论回复
8
lyy8611| | 2011-10-8 15:19 | 只看该作者
RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_12);
它的目的是 晶振HSE=12M,PLL输出72M,这样子对吧?还有我的波特率要怎么设置呢?

使用特权

评论回复
9
xukong| | 2011-10-12 17:00 | 只看该作者
可以直接:RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);不用必须先分频,分频的目的是为了设置相应的频率,通常都设置系统时钟的频率为72MHz。USB的波特率不用我们去设置,只要供给USB模块的时钟是48MHz就可以。

使用特权

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

本版积分规则

8

主题

40

帖子

0

粉丝