STM32時(shí)鐘庫(kù)函數(shù)RCC_DeInit介紹
掃描二維碼
隨時(shí)隨地手機(jī)看文章
void RCC_DeInit(void)
{
RCC->CR |= (uint32_t)0x00000001; //開(kāi)啟內(nèi)部8MHz時(shí)鐘
#ifndef STM32F10X_CL //STM32F10X_CL指的是STM32互聯(lián)系列微處理器
RCC->CFGR &= (uint32_t)0xF8FF0000; //其它類型處理器的CFGR寄存器中27-31位是保留位,24-26為MCO位
#else//而互聯(lián)型處理器的CFGR寄存器中,28-31位是保留位,24-27位屬M(fèi)CO
RCC->CFGR &= (uint32_t)0xF0FF0000; //初始化CFGR寄存器,詳見(jiàn)注釋第1條
#endif
RCC->CR &= (uint32_t)0xFEF6FFFF; //初始化CR寄存器,詳見(jiàn)注釋第2條
RCC->CR &= (uint32_t)0xFFFBFFFF; //位18=0,HSE沒(méi)有旁路,只有在HSE關(guān)閉時(shí)才可以設(shè)置
RCC->CFGR &= (uint32_t)0xFF80FFFF; //設(shè)置CFGR寄存器,詳見(jiàn)注釋第3條
#ifdef STM32F10X_CL //互聯(lián)型微控制器的設(shè)置
RCC->CR &= (uint32_t)0xEBFFFFFF;
RCC->CIR = 0x00FF0000;
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
RCC->CIR = 0x009F0000; //初始化CIR時(shí)鐘中斷寄存器,詳見(jiàn)注釋第4條
RCC->CFGR2 = 0x00000000;
#else
RCC->CIR = 0x009F0000;
#endif
}
注釋:
1、位26(27)-24=000: 微控制器沒(méi)有時(shí)鐘輸出;
位15-14=00: PCLK2(APB2時(shí)鐘)二分頻后作為ADC時(shí)鐘;
位13-11=000: HCLK不分頻,即APB2高速時(shí)鐘PCLK2等于AHB時(shí)鐘;
位10-8=000: 低速APB1時(shí)鐘(PCLK1)不分頻;
位7-4=0000: AHB時(shí)鐘不分頻,等于系統(tǒng)時(shí)鐘SYSCLK;
位3-2=00: HSI(內(nèi)部高速時(shí)鐘)作為系統(tǒng)時(shí)鐘;
位1-0=00:HSI(內(nèi)部高速時(shí)鐘)作為系統(tǒng)時(shí)鐘。
2、位24=0: PLL關(guān)閉;
位19=0: 時(shí)鐘檢測(cè)器關(guān)閉,當(dāng)外部時(shí)鐘就緒后開(kāi)啟;
位16=0: 外部時(shí)鐘HSE關(guān)閉。
3、位22=0:PLL時(shí)鐘1.5倍分頻作為USB時(shí)鐘;
位21-18=0000: PLL二倍頻輸出,只有PLL關(guān)閉時(shí)才可以設(shè)置;
位17=0: HSE不分頻,只有PLL關(guān)閉時(shí)才可以設(shè)置;
位16=0:HSI時(shí)鐘2分頻后作為PLL輸入時(shí)鐘,只有PLL關(guān)閉時(shí)才可以設(shè)置;
4、位23=1:清除時(shí)鐘安全系統(tǒng)中斷標(biāo)志位;
位20=1: 清除PLL就緒中斷標(biāo)志位;
位19=1: 清除HSE就緒中斷標(biāo)志位;
位18=1:清除HSI就緒中斷標(biāo)志位;
位17=1: 清除LSE就緒中斷標(biāo)志位;
位16=1:清除LSI就緒中斷標(biāo)志位。
在STM32中有5個(gè)時(shí)鐘源:①、HSI是高速內(nèi)部時(shí)鐘,RC震蕩器,頻率為 8MHz。②、HSE是高速外部時(shí)鐘,可接石英/陶瓷諧振器,或者接外部時(shí)鐘源,頻率范圍為4MHz~16MHz。③、LSI是低速內(nèi)部時(shí)鐘,RC振蕩器,頻率為40kHz。④、LSE是低速外部時(shí)鐘,接頻率為32.768kHz的石英晶體。⑤、PLL為鎖相環(huán)倍頻輸出,其時(shí)鐘輸入源可選擇為HIS/2、HSE或HSE/2。倍頻可選擇為2~16倍,但其輸出頻率最大不得超過(guò)72MHz。
系統(tǒng)時(shí)鐘SYSCLK,它是供STM32中絕大部分器件工作的時(shí)鐘源,系統(tǒng)時(shí)鐘可選擇為PLL輸出、HSI或者HSE。系統(tǒng)時(shí)鐘的做大頻率為72MHz,它通過(guò)AHB分頻器分頻后送給個(gè)模塊使用,AHB分頻器可選擇1、2、4、8、16、32、64、128、256、512分頻。AHB分頻器輸出的時(shí)鐘送給5大模塊使用:
1.送給AHB總線、內(nèi)核、內(nèi)存和DMA使用的HCLK時(shí)鐘。2.通過(guò)8分頻后送給Cortex的系統(tǒng)定時(shí)器時(shí)鐘。3.直接送給Cortex的空閑運(yùn)行時(shí)鐘PCLK。4.送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設(shè)使用(PCLK1,最大頻率36MHz),另一路送給定時(shí)器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器2、3、4使用。5.送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設(shè)使用(PCLK2,最大頻率72MHz),另一路送給定時(shí)器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時(shí)鐘輸出供定時(shí)器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。連接在APB1(低速外設(shè))上的設(shè)備有:電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門(mén)狗、Timer2、Timer3、Timer4。連接在APB2(高速外設(shè))上的設(shè)備有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口、第二功能IO口。寄存器描述:typedef struct
{
vu32 CR; //HSI,HSE,CSS,PLL等的使能
vu32 CFGR; //PLL等的時(shí)鐘源選擇以及分頻系數(shù)設(shè)定
vu32 CIR; //清除/使能時(shí)鐘就緒中斷
vu32 APB2RSTR; //APB2線上外設(shè)復(fù)位寄存器
vu32 APB1RSTR; //APB1線上外設(shè)復(fù)位寄存器
vu32 AHBENR; //DMA,SDIO等時(shí)鐘使能
vu32 APB2ENR; //APB2線上外設(shè)時(shí)鐘使能
vu32 APB1ENR; //APB1線上外設(shè)時(shí)鐘使能
vu32 BDCR; //備份域控制寄存器
vu32 CSR;
} RCC_TypeDef;
時(shí)鐘控制寄存器(RCC_CR)
31~26252423~2019181716保留PLLRDYPLLON保留CSSONHSEBYPHSERDYHSEONeg:RCC->CR|=0x00010000;//外部高速時(shí)鐘使能HSEON
RCC->CR|=0x01000000;//使能PLLON
RCC->CR>>25;//等待PLL鎖定
時(shí)鐘配置寄存器(RCC_CFGR)
31:2726:24232221:181716保留MCO[2:0]保留USBPREPLLMUL[3:0]PLLXTPREPLLSRC15:1413:1110:87:43:21:0ADCPRE[1:0]PPRE2[2:0]PPRE1[2:0]HPRE[3:0]SWS[1:0]SW[1:0]位26:24MCO: 微控制器時(shí)鐘輸出 (Microcontroller clock output)
由軟件置’1’或清零。
0xx:沒(méi)有時(shí)鐘輸出;
100:系統(tǒng)時(shí)鐘(SYSCLK)輸出;
101:內(nèi)部RC振蕩器時(shí)鐘(HSI)輸出;
110:外部振蕩器時(shí)鐘(HSE)輸出;
111:PLL時(shí)鐘2分頻后輸出。
位22USBPRE:USB預(yù)分頻 (USB prescaler)
由軟件置’1’或清’0’來(lái)產(chǎn)生48MHz的USB時(shí)鐘。在RCC_APB1ENR寄存器中使能USB時(shí)鐘之前,必須保證該位已經(jīng)有效。如果USB時(shí)鐘被使能,該位不能被清零。
0:PLL時(shí)鐘1.5倍分頻作為USB時(shí)鐘
1:PLL時(shí)鐘直接作為USB時(shí)鐘
位21:18PLLMUL:PLL倍頻系數(shù) (PLL multiplication factor)
由軟件設(shè)置來(lái)確定PLL倍頻系數(shù)。只有在PLL關(guān)閉的情況下才可被寫(xiě)入。
注意:PLL的輸出頻率不能超過(guò)72MHz
0000:PLL 2倍頻輸出1000:PLL 10倍頻輸出
0001:PLL 3倍頻輸出1001:PLL 11倍頻輸出
0010:PLL 4倍頻輸出1010:PLL 12倍頻輸出
0011:PLL 5倍頻輸出1011:PLL 13倍頻輸出
0100:PLL 6倍頻輸出1100:PLL 14倍頻輸出
0101:PLL 7倍頻輸出1101:PLL 15倍頻輸出
0110:PLL 8倍頻輸出1110:PLL 16倍頻輸出
0111:PLL 9倍頻輸出1111:PLL 16倍頻輸出
位17PLLXTPRE:HSE分頻器作為PLL輸入 (HSE divider for PLL entry)
由軟件置’1’或清’0’來(lái)分頻HSE后作為PLL輸入時(shí)鐘。只能在關(guān)閉PLL時(shí)才能寫(xiě)入此位。
0:HSE不分頻
1:HSE 2分頻
位16PLLSRC:PLL輸入時(shí)鐘源 (PLL entry clock source)
由軟件置’1’或清’0’來(lái)選擇PLL輸入時(shí)鐘源。只能在關(guān)閉PLL時(shí)才能寫(xiě)入此位。
0:HSI振蕩器時(shí)鐘經(jīng)2分頻后作為PLL輸入時(shí)鐘
1:HSE時(shí)鐘作為PLL輸入時(shí)鐘。
位15:14ADCPRE[1:0]:ADC預(yù)分頻 (ADC prescaler)
由軟件置’1’或清’0’來(lái)確定ADC時(shí)鐘頻率
00:PCLK2 2分頻后作為ADC時(shí)鐘
01:PCLK2 4分頻后作為ADC時(shí)鐘
10:PCLK2 6分頻后作為ADC時(shí)鐘
11:PCLK2 8分頻后作為ADC時(shí)鐘
位13:11PPRE2[2:0]:高速APB預(yù)分頻(APB2) (APB high-speed prescaler (APB2))
由軟件置’1’或清’0’來(lái)控制高速APB2時(shí)鐘(PCLK2)的預(yù)分頻系數(shù)。
0xx:HCLK不分頻
100:HCLK 2分頻
101:HCLK 4分頻
110:HCLK 8分頻
111:HCLK 16分頻
位10:8PPRE1[2:0]:低速APB預(yù)分頻(APB1) (APB low-speed prescaler (APB1))
由軟件置’1’或清’0’來(lái)控制低速APB1時(shí)鐘(PCLK1)的預(yù)分頻系數(shù)。
警告:軟件必須保證APB1時(shí)鐘頻率不超過(guò)36MHz。
0xx:HCLK不分頻
100:HCLK 2分頻
101:HCLK 4分頻
110:HCLK 8分頻
111:HCLK 16分頻
位7:4HPRE[3:0]: AHB預(yù)分頻 (AHB Prescaler)
由軟件置’1’或清’0’來(lái)控制AHB時(shí)鐘的預(yù)分頻系數(shù)。
0xxx:SYSCLK不分頻
1000:SYSCLK 2分頻1100:SYSCLK 64分頻
1001:SYSCLK 4分頻1101:SYSCLK 128分頻
1010:SYSCLK 8分頻1110:SYSCLK 256分頻
1011:SYSCLK 16分頻1111:SYSCLK 512分頻
位3:2SWS[1:0]:系統(tǒng)時(shí)鐘切換狀態(tài) (System clock switch status)
由硬件置’1’或清’0’來(lái)指示哪一個(gè)時(shí)鐘源被作為系統(tǒng)時(shí)鐘。
00:HSI作為系統(tǒng)時(shí)鐘;
01:HSE作為系統(tǒng)時(shí)鐘;
10:PLL輸出作為系統(tǒng)時(shí)鐘;
11:不可用。
位1:0SW[1:0]:系統(tǒng)時(shí)鐘切換 (System clock switch)
由軟件置’1’或清’0’來(lái)選擇系統(tǒng)時(shí)鐘源。
00:HSI作為系統(tǒng)時(shí)鐘;
01:HSE作為系統(tǒng)時(shí)鐘;
10:PLL輸出作為系統(tǒng)時(shí)鐘;
11:不可用
eg: RCC->CFGR=0x00000400;//APB1=DIV2;APB2=DIV1(不分頻);AHB=DIV1(不分頻);
根據(jù)STM32庫(kù)