STM32單片機如何使用內部晶振


STM32F030F4P6,uVision開發環境為例,注意了,若使用其它相近芯片,本文僅供參考

引用請注明出處:https://www.cnblogs.com/beiyhs/p/11211691.html

//***********************************************************************************   北有寒山  ***********************

        1、打開項目,查看startup_stm32f0xx.s或startup_stm32f030.s; 啟動時是調用SystemInit函數     

            

                   

    找到system_stm32f0xx.c並打開查看SystemInit函數,里面又調用了SetSysClock()

                       

 

   2、還在該文件內往下找到找到static void SetSysClock(void)函數;

       

 

 

   3、用以下代碼拷貝粘貼替換SetSysClock(void)函數:

       static void SetSysClock(void)

      {
         __IO uint32_t StartUpCounter = 0, HSIStatus = 0; 

        RCC->CR &= ~((uint32_t)RCC_CR_HSEON);                                     //關閉外部時鍾 
         RCC->CR |= ((uint32_t)RCC_CR_HSION);                                                  //使能內部時鍾 HSI
       do                                                                                                                    //等待內部時鍾起振
           {
            HSIStatus = RCC->CR & RCC_CR_HSIRDY;                                              // 設置RCC
            StartUpCounter++;                                                                                         //啟動計數器
            }
       while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));  // 等待 HSE 啟動穩定

       if ((RCC->CR & RCC_CR_HSIRDY) != RESET)                                             //判斷啟動狀態
           {
            HSIStatus = (uint32_t)0x01;
           }
       else
           {
             HSIStatus = (uint32_t)0x00;                                                                       //啟動不成功
            }

       if (HSIStatus == (uint32_t)0x01) //啟動成功
           {
            /* Enable Prefetch Buffer and set Flash Latency */
           FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;      //flash總線時鍾使能

           /* HCLK = SYSCLK */      //AHB總線時鍾HCLK(是系統時鍾SYSCLK經過AHB分頻器分頻后得到的時鍾,

                                                   //一般設置1分頻,HCLK=SYSSCLK=48MHz; 

           RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;    //AHB總線時鍾  HCLK = SYSCLK/1=48MHz

           /* PCLK = HCLK */         //APB總線時鍾PCLK等於AHB總線時鍾/1   PCLK=HCLK/1
           RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;                    // PCLK=HCLK/1=48M/1=48M

           /* PLL configuration = HSI/2 * 12= 48 MHz */
           RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
           RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);   

                                                                                                                    //RC時鍾2分頻后 進行12倍頻
                                                                                                                    //=8M/2*12=48M
           RCC->CR |= RCC_CR_PLLON;                                                      //使能鎖相環倍頻開關 /* Enable PLL */

           while((RCC->CR & RCC_CR_PLLRDY) == 0)                                //等待鎖相環就緒
                   { }

           /* Select PLL as system clock source * /                                           //選擇鎖相環輸出時鍾作為系統時鍾
           RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
           RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

           while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
                    { }                                                                                          //等待鎖相環輸出時鍾已經成為系統時鍾
            }
         else
               { }                                                                                              //啟動失敗,在此寫代碼
       }

 

4、 存盤重編譯一下就OK啦,是不是嗖易Z,小伙伴們看明白了嗎? 

5、過程重新捋一遍:內部8M的RC時鍾/2=4M,然后12倍頻=4*12=48M, AHB輸出48M給AHB總線, APB輸

      出48M給APB外設、ADC、串口、倍頻器后各個TIM用。

6、系統時鍾SYSCLK經AHB分頻后叫HCLK,HCLK經APB分頻后叫PCLK。需要關注的是,查看

     STM32F030F4P6的2019版datasheet,芯片內部沒有APB1,只有APB,其它相似芯片是有APB1的。所以

     使用固件庫只用到RCC_CFGR_PPRE_DIV1而沒有RCC_CFGR_PPRE1_DIV1。

      DIV1是APB不分頻,DIV2是2分頻,然后直接給倍頻器再進各個TIM。

      如果在APB內是DIV1,后面的倍頻器不倍頻直接進各個TIM使用。

      如果在APB內是DIV2、4、8、16,則分頻后還要在后面的倍頻器乘以2再進各個TIM使用。

      嗯,有點繞,琢磨一下吧。

 7、注意:RCC->CR &= ~((uint32_t)RCC_CR_HSEON);  這句是關閉外部時鍾,關閉后,原來連接外部晶振

       的PF0、PF1方可作為普通IO口使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM