• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

新手疑虑:STM32L151外接3.6864MHz晶振,主频

FEItwo 2018-11-14 浏览量:1514
有个项目,是用STM32L151,外接3.6864MHz晶振,OSC32IN和OSC32out没接晶振。
按个人理解,时钟应该是3.6864*8/2=14.7456M但是我看代码里还是基于8M来设置的。
Main.c里这么注释的:
RCC_GetClocksFreq(&RCC_Clocks);      //获取系统时钟频率外部晶振8.00M倍频后系统时钟8.000*8/2=32.00M 

对应的RCC_GetClocksFreq如下:
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
   uint32_t tmp = 0 pllmul = 0 plldiv = 0 pllsource = 0 presc = 0 msirange = 0;
   /* Get SYSCLK source -------------------------------------------------------*/
   tmp = RCC->CFGR & RCC_CFGR_SWS;
   
   switch (tmp)
   {
     case 0x00:  /* MSI used as system clock */
       msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE ) >> 13;
       RCC_Clocks->SYSCLK_Frequency = (((1 << msirange) * 64000) - (MSITable[msirange] * 24000));
       break;
     case 0x04:  /* HSI used as system clock */
       RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
       break;
     case 0x08:  /* HSE used as system clock */
       RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
       break;
     case 0x0C:  /* PLL used as system clock */
       /* Get PLL clock source and multiplication factor ----------------------*/
       pllmul = RCC->CFGR & RCC_CFGR_PLLMUL;
       plldiv = RCC->CFGR & RCC_CFGR_PLLDIV;
       pllmul = PLLMulTable[(pllmul >> 18)];
       plldiv = (plldiv >> 22) + 1;
       
       pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
       if (pllsource == 0x00)
       {
         /* HSI oscillator clock selected as PLL clock entry */
         RCC_Clocks->SYSCLK_Frequency = (((HSI_VALUE) * pllmul) / plldiv);
       }
       else
       {
         /* HSE selected as PLL clock entry */
         RCC_Clocks->SYSCLK_Frequency = (((HSE_VALUE) * pllmul) / plldiv);
       }
       break;
     default:
       RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
       break;
   }


在system_stm32lxx.c里,看到倍频分频设置值跟外接8M一样,几乎没改动。
    /*  PLL configuration: PLLCLK = (HSE * 8) / 2 = 32MHz */
     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_PLLMUL8 | RCC_CFGR_PLLDIV2);


难道是用了默认的内部8M频率?哪位恳请帮理一下。新手对RCC还是有点糊涂。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • STM32默认的时钟源是内部的8M,如果要用外部时钟源,需要修改HSE_Value
    • 发布于 2018-11-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:4
  • 这要看你rtc的时钟来源了,是不是这里设置的有问题
    • 发布于2018-11-17
    • 举报
    • 评论 0
    • 0
    • 0

  • HSE_VALUE必须是外部晶振的频率才可以正常工作,如8M就是800000000
    • 发布于2018-11-29
    • 举报
    • 评论 0
    • 0
    • 0

  • 一般都是检查你的晶振来源,看你的晶振是否能正常工作
    • 发布于2018-12-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个数值需要设置的跟你的晶振一样,不然是不能正常的
    • 发布于2018-12-19
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

新手疑虑:STM32L151外接3.6864MHz晶振,主频