stm32之RCC寄存器学习
RCC(Reset Clock Controller) —— 復(fù)位與時鐘控制
一、復(fù)位
STM32F10xxx支持三種復(fù)位形式,分別為系統(tǒng)復(fù)位、上電復(fù)位和備份區(qū)域復(fù)位。?
系統(tǒng)復(fù)位:除了時鐘控制器的RCC_CSR寄存器中的復(fù)位標志位和備份區(qū)域中的寄存器以外,系統(tǒng)
復(fù)位將復(fù)位所有寄存器至它們的復(fù)位狀態(tài)。
電源復(fù)位:將復(fù)位除了備份區(qū)域外的所有寄存器。 ?
備份區(qū)域復(fù)位:備份區(qū)域擁有兩個專門的復(fù)位,它們只影響備份區(qū)域。
?
?
二、時鐘
有四種時鐘:高速外部時鐘信號(HSE)——?HSE外部晶體/陶瓷諧振器 、HSE用戶外部時鐘
高速內(nèi)部時鐘信號(HSI)——?由內(nèi)部8MHz的RC振蕩器產(chǎn)生
低速外部時鐘信號(LSE)——?32.768kHz的低速外部晶體或陶瓷諧振器
低速內(nèi)部時鐘信號(LSI)——?LSI時鐘頻率大約40kHz(在30kHz和60kHz之間)
時鐘的輸出:微控制器允許輸出時鐘信號到外部MCO引腳。 可以時鐘配置寄存器來選擇輸出的時鐘。
?
其中:
PLLMUL?用于設(shè)置 STM32 的 PLLCLK, STM32 支持 2~16 倍頻設(shè)置。我們常用
的是 8M 外部晶振+9 倍頻設(shè)置,剛好得到 72Mhz 的 PLLCLK。
SW 是 STM32 的 SYSCLK(系統(tǒng)時鐘)切換開關(guān),從上圖可以看出, SYSCLK 的
來源可以是 3個:HSI、PLLCLK和 HSE。
CSS是時鐘安全系統(tǒng),可以通過軟件被激活。一旦其被激活,時鐘監(jiān)測器將在HSE振蕩器啟動延遲后被
使能,并在HSE時鐘關(guān)閉后關(guān)閉 。
三、時鐘啟動過程
1、開機或復(fù)位時使用內(nèi)部時鐘
2、用軟件進行切換,嘗試開啟外部時鐘
3、如果開啟成功,則使用外部時鐘,否則使用內(nèi)部
四、配置時鐘的步驟
1、APB1、APB2的外設(shè)接口復(fù)位結(jié)束(即RESET),關(guān)閉APB1、APB2的外設(shè)時鐘?
打開內(nèi)部8MHz振蕩器,復(fù)位RCC->CFGR中的SW[1:0]、HPRE[3:0]、PRE1[2:0]、PRE2[2:0]、ADCPRE[2:0]、MCO[2:0]
復(fù)位RCC->CR中的HSEON、CSSON、PLLON、HSEBYP
復(fù)位RCC->CFGR中的PLLSRC、PLLXTPRE、PLLMUL[3:0]、USBPRE
關(guān)閉RCC->CIR中的所有中斷
2、使能外部高速時鐘晶振HSE
3、等待外部高速時鐘晶振工作穩(wěn)定
4、設(shè)置AHB時鐘的預(yù)分頻(在這之前要先執(zhí)行FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH))
5、設(shè)置APB1時鐘的預(yù)分頻
6、設(shè)置APB2時鐘的預(yù)分頻
7、設(shè)置PLL的時鐘源以及PLL的倍頻數(shù),然后使能PLL
8、等待PLL工作穩(wěn)定
9、選擇SYSCLK的時鐘源
10、判斷PLL是否是系統(tǒng)時鐘(若選擇SYSCLK的時鐘源是PLL的話)
11、打開要使用的外設(shè)時鐘
?
五、代碼
void RCC_Init(void) {RCC->APB1RSTR = 0x00000000; //APB1、APB2復(fù)位結(jié)束RCC->APB2RSTR = 0x00000000;RCC->AHBENR = 0x00000014; //睡眠模式時閃存和 SRAM 時鐘使能,其他關(guān)閉(其實可以注釋掉,因為AHBENR復(fù)位的值就是該值)RCC->APB1ENR = 0x00000000; //關(guān)閉APB1、APB2的外設(shè)時鐘RCC->APB2ENR = 0x00000000; RCC->CR |= 0x00000001; //使能內(nèi)部時鐘HSIRCC->CFGR &= 0xF8FF0000; //復(fù)位RCC->CFGR中的SW[1:0],HPRE[3:0],PRE1[2:0],PRE2[2:0],ADCPRE[2:0],MCO[2:0]RCC->CR &= 0xFEF2FFFF; //復(fù)位HSEON、CSSON、PLLON、HSEBYPRCC->CFGR &= 0xFF80FFFF; //復(fù)位RCC->CFGR中的PLLSRC,PLLXTPRE,PLLMUL[3:0],USBPRERCC->CIR &= 0x00000000; //關(guān)閉所有中斷[12:0] RCC->CR |= (1<<16); //使能HSEwhile(!(RCC->CR & (1<<17))); //等待HSE穩(wěn)定 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 預(yù)取指緩存使能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); //使能PLLwhile(!(RCC->CR & (1<<25))); //等待PLL鎖定 RCC->CFGR |= 0x00000002; //選擇PLL輸出作為SYSCLKwhile(!(RCC->CFGR & (2<<2))); //等待 PLL 作為系統(tǒng)時鐘設(shè)置成功//下面就是打開所要用的外設(shè)時鐘(RCC_AHBENR、RCC_APB1ENR、RCC_APB2ENR) }?
仿真結(jié)果為:
轉(zhuǎn)載于:https://www.cnblogs.com/Recca/p/7786967.html
總結(jié)
以上是生活随笔為你收集整理的stm32之RCC寄存器学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jzoj4891 摆书
- 下一篇: 第七次scrum meeting记录