问答

汇集网友智慧,解决技术难题

21ic问答首页 - 时钟怎么还是32M?

时钟怎么还是32M?

zyf部长2020-09-29
回答 +关注 18
1968人浏览 21人回答问题 分享 举报
21 个回答
  • 而且我在程序里也没找到内部HSI之类的代码
  • 但这产品需要精确延时
  • 怀疑是HSI内部8M的
  • 这是cubeMX生成的代码?
  • 这也太邪乎了,没有8M,怎么结果会是个8M的
  • 对RCC有点糊涂
  • 也没有发现用此晶振3.6864MHz晶振代替系统默认的8M。
  • 我在相关代码里没找到使用HSI的语句
  • 利用的内部的HSI 8M来计算的

  • 对应的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);

您需要登录后才可以回复 登录 | 注册