stm32之RCC寄存器學習


RCC(Reset Clock Controller) —— 復位與時鍾控制

一、復位

STM32F10xxx支持三種復位形式,分別為系統復位、上電復位和備份區域復位。 

系統復位:除了時鍾控制器的RCC_CSR寄存器中的復位標志位和備份區域中的寄存器以外,系統
復位將復位所有寄存器至它們的復位狀態。

電源復位:將復位除了備份區域外的所有寄存器。  

備份區域復位:備份區域擁有兩個專門的復位,它們只影響備份區域。

 

 

二、時鍾

有四種時鍾:高速外部時鍾信號(HSE)—— HSE外部晶體/陶瓷諧振器 、HSE用戶外部時鍾

      高速內部時鍾信號(HSI)—— 由內部8MHzRC振盪器產生

      低速外部時鍾信號(LSE)—— 32.768kHz的低速外部晶體或陶瓷諧振器

      低速內部時鍾信號(LSI)—— LSI時鍾頻率大約40kHz(30kHz60kHz之間)

時鍾的輸出:微控制器允許輸出時鍾信號到外部MCO引腳。 可以時鍾配置寄存器來選擇輸出的時鍾。

 

其中:

PLLMUL 用於設置 STM32 PLLCLKSTM32 支持 2~16 倍頻設置。我們常用
的是 8M 外部晶振+9 倍頻設置,剛好得到 72Mhz PLLCLK

SW STM32 SYSCLK(系統時鍾)切換開關,從上圖可以看出, SYSCLK
來源可以是 3個:HSIPLLCLKHSE

CSS是時鍾安全系統,可以通過軟件被激活。一旦其被激活,時鍾監測器將在HSE振盪器啟動延遲后被
使能,並在HSE時鍾關閉后關閉 。

三、時鍾啟動過程

1、開機或復位時使用內部時鍾
2、用軟件進行切換,嘗試開啟外部時鍾
3、如果開啟成功,則使用外部時鍾,否則使用內部

四、配置時鍾的步驟

1、APB1、APB2的外設接口復位結束(即RESET),關閉APB1、APB2的外設時鍾 

  打開內部8MHz振盪器,復位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]

  復位RCC->CR中的HSEON、CSSON、PLLON、HSEBYP

  復位RCC->CFGR中的PLLSRC、PLLXTPRE、PLLMUL[3:0]USBPRE

  關閉RCC->CIR中的所有中斷

2、使能外部高速時鍾晶振HSE

3、等待外部高速時鍾晶振工作穩定

4、設置AHB時鍾的預分頻(在這之前要先執行FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH))

5、設置APB1時鍾的預分頻

6、設置APB2時鍾的預分頻

7、設置PLL的時鍾源以及PLL的倍頻數,然后使能PLL

8、等待PLL工作穩定

9、選擇SYSCLK的時鍾源

10、判斷PLL是否是系統時鍾(若選擇SYSCLK的時鍾源是PLL的話)

11、打開要使用的外設時鍾

 

五、代碼

void RCC_Init(void)
{
    RCC->APB1RSTR = 0x00000000;   //APB1、APB2復位結束
    RCC->APB2RSTR = 0x00000000;
    RCC->AHBENR   = 0x00000014;   //睡眠模式時閃存和 SRAM 時鍾使能,其他關閉(其實可以注釋掉,因為AHBENR復位的值就是該值)
    RCC->APB1ENR  = 0x00000000;   //關閉APB1、APB2的外設時鍾
    RCC->APB2ENR  = 0x00000000; 

    RCC->CR      |= 0x00000001;   //使能內部時鍾HSI
    RCC->CFGR    &= 0xF8FF0000;   //復位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]
    RCC->CR      &= 0xFEF2FFFF;   //復位HSEON、CSSON、PLLON、HSEBYP
    RCC->CFGR    &= 0xFF80FFFF;   //復位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRE
    RCC->CIR     &= 0x00000000;   //關閉所有中斷[12:0]

    RCC->CR      |= (1<<16);      //使能HSE
    while(!(RCC->CR & (1<<17)));  //等待HSE穩定

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);          // 預取指緩存使能
    FLASH_SetLatency(FLASH_Latency_2);                             //FLASH_Latency_2  2延時周期

    RCC->CFGR    |= 0x00000400;      //AHB不分頻,APB1二分頻,APB2不分頻
    RCC->CFGR    |= 0x001D0000;      //配置PLL:HSE為輸入時鍾,HSE不分頻,9倍頻輸出
    RCC->CR      |= (1<<24);         //使能PLL
    while(!(RCC->CR & (1<<25)));     //等待PLL鎖定

    RCC->CFGR    |= 0x00000002;      //選擇PLL輸出作為SYSCLK
    while(!(RCC->CFGR & (2<<2)));    //等待 PLL 作為系統時鍾設置成功

    //下面就是打開所要用的外設時鍾(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR)
}

 

仿真結果為:


免責聲明!

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



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