STM32學習筆記(四) RCC外設的學習和理解


  RCC時鍾模塊並不好理解,初次接觸我也是一頭霧水,而且我真正掌握它的時候也比較晚,是我在學習uC/os-II,需要分析時鍾時才有了深刻認識。但在學習中我卻一定要把放在了前列,因為這是整個嵌入式最重要的基礎之一,可以說是M3芯片的心臟。初學者理解是比較困難,但是掌握清晰對於嵌入式操作系統特別是Timer定時器以及通訊領域具有重大意義。下面進入正題,先上一章RCC模塊的結構圖:

初看此圖是不是感覺太復雜了,事實上我第一次看這張圖的時候也是的,完全理不清結構,不過不用擔心,下面我就分層帶你來理解這幅圖。

 (1)時鍾源(4個晶振源,1個中介源)

      HSI(RC):  內部高速晶振,~8MHz

      HSE(Osc): 外部高速晶振(與電路設計時選擇有關,25MHz)

      LSE(Osc): 外部低速晶振(默認為32.768KHZ)

      LSI(RC):  內部低速晶振,~40KHz

      PLLCLK:  鎖向環倍頻輸出,最大頻率小於72MHz,注:PLLCLK來源HSE,HSE/2,HSI/2

(2)系統時鍾源

     SYSCLK:  系統時鍾

    來源HSI,PLLCLK,HSE,若CSS(時鍾監視系統)檢測到HSE失效,SYSCLK = HSI;

(3)主要輸出時鍾源

    HCLK:高性能總線時鍾(SYSCLK通過AHB Prescaler,最高72MHZ)

    PCLK1:外設1區域時鍾(通過APB1 Prescaler,最高36MHZ)

    PCLK2:外設2區域時鍾(通過APB2 Prescaler,最高72MHZ)

  此外APB1,APB2外設時鍾除了給對應外設區域提供時鍾外,還可通過TIMERX Prescaler分配不同的定時器時鍾。

     ADCCLK:ADC外設時鍾(PCLK2通過ADC Prescaler)

    USBCLK:通用串行接口時鍾(PLLCLK通過USB Prescaler,等於48MHZ)

    RTCCLK:實時時鍾,來源LSI,LSE,HSE/128

    IWDGCLK:獨立看門狗時鍾,來源LSI

    MCO: 輸出內部時鍾

     從上面看,我們前面學到的GPIOD外設還有后面的USART等的時鍾都沒有提到,為什么,其實它們包含在PCLK1,PCLK2這兩個外設區域時鍾里,也就是說他們的外設時鍾來源於該區域的時鍾。下面是STM32Fxxx固件函數庫中15.2.22以及15.2.23所提到的圖,包含所有外設對應的區域:

PCLK1時鍾區域:

 

 

 PCLK2時鍾區域:

 

  通過上訴兩張圖可以清晰的知曉我在第一章節流水燈時時鍾使能如此選擇APB2外設的原因,當然我是以stm32f10x為例的,如果你使用不同的芯片就要去查相應的寄存器手冊。了解了這些其實已經對系統時鍾掌握差不多了,下面我就以寄存器控制方式展現嵌入式時鍾的配置(庫函數操作對於理解時鍾配置過程的幫助並不大,特別只是單純調用而沒有理解每個函數內容的情況下)。

(4)系統時鍾配置實例(以使用HSE晶振,最后系統時鍾為50MHZ為例)

   注:RCC寄存器功能可參考《STM32中文參考手冊》6.3(互聯型產品)    

unsigned char PLL = 4;            //PLL為設定放大的倍數
unsigned char temp = 0; //1.HSE時鍾使能 //時鍾控制寄存器 RCC->CR RCC->CR &= 1<<16;                 //使能HSE
While(!(RCC-CR)>>17)); //判斷HSE就緒標志位 //2.配置PLL,APB2,APB1,AHB //時鍾配置寄存器RCC->CFGR RCC->CFGR |= 0x00000400; PLL-=2;                
//AHBCLK = SysTick, APB2CLK = AHBCLK,APB1CLK = AHBCLK/2
RCC->CFGR |= PLL<<18;        //參考寄存器功能表,0010~4倍,依次增加,最大9倍 RCC->CFGR |= 3<<16; //HSE/2作為PLL的輸入
//3.FLASH預存取即時鍾配置 //FLASH預存取寄存器FLASH->ACR
//注:具體參見《STM32閃存flash編程》,但有一點要注意,系統時鍾大於30MHZ后一定需要配置,默認24MHZ后就需要配置 FLASH->ACR |= 0x32;     //
開啟預存取,2個等待周期
//4.PLL使能    //時鍾控制寄存器 RCC->CR RCC->CR |= 1<<24;    //PLL使能 while(!(RCC->CR>>25)); //判斷PLL使能標志位 //5.PLL作為系統時鍾 RCC->CFGR | = 0x00000002; //PLL作為系統時鍾 while(temp!=0x02) //PLL成功作為系統時鍾,標志位 {   temp= RCC->CFGR>>2;   temp&= 0x03; }

   通過上述方式就完成了時鍾的一般外設的時鍾初始化設置,配置系統時鍾50MHZ,APB2外設時鍾50MHZ,APB1外設時鍾25MHZ,理解了這些,延時時間和通訊速率等通過計算即可精確的知曉,這對於整個stm32的學習以及后續理解嵌入式實時操作系統都具有重要意義。


免責聲明!

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



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