STM32的USB必须使用HSE作为时钟源?有没有人用HSI做USB时钟源的

2019-12-30 19:28发布

本帖最后由 logosz 于 2015-3-24 20:43 编辑

看了下固件库的例子,全部使用的HSE作为时钟源经过锁相环倍频再分频到48MHz。


HSI经过锁相环倍频可以吗。我很早以前测试过,当时好像测试通过了。由于很久了也记不清楚当时是否是采用的HSI。


今天用HSI测试了下,死活测试不过。有没有人遇到过这个情况。有人用HSI做USB的吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
43条回答
68336016
2020-01-04 00:47
本帖最后由 68336016 于 2015-5-28 08:25 编辑
tuy0326 发表于 2015-5-28 03:19
我不相信你用HSI跑起来USB

请看RM0008  P56的时钟树,请问你是怎么配置使用HSI能分成48M的?????

我把2年前做的样板抓图出来,注意上面是有USB插座的,只有一个32.768K的晶振,并没有外部8M晶振,芯片是STM32F103RBT6
你应该相信,我没有必要为了回你这个帖子专门画个作假的PCB,或者写个没有验证过的代码,因为划不来。
后来正式产品我加上了外部晶振,因为几毛钱的事情不能省,毕竟安全第一。


以下PCB是以前做样板验证用的,代码也是当时测试通过对,里面一些注释不一定对,因为2年前测试用的没那么规范。

2.jpg (115.12 KB, 下载次数: 0)

下载附件

2015-5-28 08:18 上传




通过宏来决定用HSI还是HSE
  1. /*******************************************************************************
  2. * Function Name  : RCC_Configuration
  3. * Description    : 配置不同的系统时钟
  4. * Input          : None
  5. * Output         : None
  6. * Return         : None
  7. *******************************************************************************/
  8. void RCC_Configuration(void)
  9. {
  10.         /* RCC system reset(for debug purpose) */
  11.         RCC_DeInit();

  12. #ifdef HSIENABLE                //当使用HSI高速内部时钟作为系统时钟时
  13.         RCC_HSICmd(ENABLE);        //打开内部高速时钟
  14.         //等待HSI准备好
  15.         while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  16.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        //开启FLASH预取指功能
  17.         //FLASH时序控制
  18.         //推荐值:SYSCLK = 0~24MHz   Latency=0
  19.         //       SYSCLK = 24~48MHz  Latency=1
  20.         //       SYSCLK = 48~72MHz  Latency=2
  21.         FLASH_SetLatency(FLASH_Latency_2);
  22.         RCC_HCLKConfig(RCC_SYSCLK_Div1);        //设置HCLK(AHB时钟)=SYSCLK
  23.         RCC_PCLK2Config(RCC_HCLK_Div1);                //PCLK2(APB2) = HCLK
  24.         RCC_PCLK1Config(RCC_HCLK_Div1);                //PCLK1(APB1) = HCLK

  25.         //PLL设置 SYSCLK/2 * 12 = 4*12 = 48MHz
  26.         RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);
  27.         //启动PLL
  28.         RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,不能被DISABLE
  29.         //等待PLL稳定
  30.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){;}

  31.         //设置系统时钟SYSCLK = PLL输出
  32.         RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  33.         //等待PLL成功用作于系统时钟的时钟源,并等待稳定
  34.         // 0x00:HSI作为系统时钟
  35.         // 0x04:HSE作为系统时钟
  36.         // 0x08:PLL作为系统时钟
  37.         while(RCC_GetSYSCLKSource() != 0x08);
  38. #else
  39.         /* Enable HSE */
  40.         RCC_HSEConfig(RCC_HSE_ON);

  41.         /* Wait till HSE is ready */
  42.         HSEStartUpStatus = RCC_WaitForHSEStartUp();

  43.         if(HSEStartUpStatus == SUCCESS)
  44.         {
  45.                 /* HCLK = SYSCLK */
  46.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  47.                 /* PCLK2 = HCLK */
  48.                 RCC_PCLK2Config(RCC_HCLK_Div1);
  49.                 /* PCLK1 = HCLK/2 */
  50.                 RCC_PCLK1Config(RCC_HCLK_Div2);
  51.                 /* Flash 2 wait state */
  52.                 FLASH_SetLatency(FLASH_Latency_2);
  53.                 /* Enable Prefetch Buffer */
  54.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  55.                 /* PLLCLK = 8MHz * 6 = 48 MHz */
  56.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
  57.                 /* Enable PLL */
  58.                 RCC_PLLCmd(ENABLE);
  59.                 /* Wait till PLL is ready */
  60.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  61.                 {
  62.                 }
  63.                 /* Select PLL as system clock source */
  64.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  65.                 /* Wait till PLL is used as system clock source */
  66.                 while(RCC_GetSYSCLKSource() != 0x08);
  67.         }
  68. #endif
  69.         /* Enable DMA1 clock */
  70.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  71.         /* Enable ADC1E clock */
  72.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);       
  73.         /* TIM4 clock source enable */
  74.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  75.         /* Enable GPIOA, GPIOB, GPIOC, GPIOD and AFIO clocks */
  76.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
  77. }
复制代码

  1. /*******************************************************************************
  2. * Function Name  : Set_USBClock
  3. * Description    : Configures USB Clock input (48MHz)
  4. * Input          : None.
  5. * Return         : None.
  6. *******************************************************************************/
  7. void Set_USBClock(void)
  8. {
  9.         /* USBCLK = PLLCLK */
  10.         RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);

  11.         /* Enable USB clock */
  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
  13. }
复制代码

一周热门 更多>