1. STM32的時(shí)鐘源主要有:
內(nèi)部時(shí)鐘
外部時(shí)鐘
鎖相環(huán)倍頻輸出時(shí)鐘
1.1 詳細(xì)介紹
HSI(內(nèi)部高速時(shí)鐘)
它是RC振蕩器,頻率可以達(dá)到8MHZ,可作為系統(tǒng)時(shí)鐘和PLL鎖相環(huán)的輸入
HSE(外部高速時(shí)鐘)
接入晶振范圍是4-16MHZ,可作為系統(tǒng)時(shí)鐘和PLL鎖相環(huán)的輸入,還可以經(jīng)過(guò)128分頻之后輸入給RTC。
LSI(內(nèi)部低速時(shí)鐘)
它是RC振蕩器,頻率大概為40KHZ,供給獨(dú)立看門(mén)狗或者RTC,并且獨(dú)立看門(mén)口只能依靠LSI作為時(shí)鐘源
LSE(外部低速時(shí)鐘)
通常外接32.768MHZ晶振提供給RTC
PLL(鎖相環(huán))
用來(lái)倍頻輸出。因?yàn)殚_(kāi)發(fā)板外部晶振只有8MHZ,而STM32最大工作頻率是72MHZ。他可以通過(guò)HSI輸入,HSE輸入或兩分頻輸入,通過(guò)PLL倍頻(2-16),倍頻之后輸入給系統(tǒng)時(shí)鐘。
MCO(時(shí)鐘輸出管腳)
通常對(duì)應(yīng)STM32 PA8,它可以選擇一個(gè)時(shí)鐘信號(hào)輸出,給外部的系統(tǒng)提供時(shí)鐘源
2. 標(biāo)準(zhǔn)庫(kù)的時(shí)鐘配置
2.1 stm32啟動(dòng)文件
首先打開(kāi)startup_stm32f10x_hd.s,該文件為stm32的啟動(dòng)文件,在該文件內(nèi)會(huì)發(fā)現(xiàn)有這么一塊用匯編寫(xiě)的代碼。
Reset_HandlerPROC EXPORTReset_Handler[WEAK] IMPORT__main IMPORTSystemInit LDRR0,=SystemInit BLXR0 LDRR0,=__main BXR0 ENDP
通過(guò)這段匯編代碼可以看出,程序在執(zhí)行main函數(shù)之前,會(huì)先執(zhí)行SystemInit函數(shù)。
2.2 SystemInit函數(shù)詳解
voidSystemInit(void) { /*Reset the RCC clock configuration to the default reset state(for debug purpose)*/ /*Set HSION bit*/ RCC->CR|=(uint32_t)0x00000001; /*Reset SW,HPRE,PPRE1,PPRE2,ADCPRE and MCO bits*/ #ifndefSTM32F10X_CL RCC->CFGR&=(uint32_t)0xF8FF0000; #else RCC->CFGR&=(uint32_t)0xF0FF0000; #endif/*STM32F10X_CL*/ /*Reset HSEON,CSSON and PLLON bits*/ RCC->CR&=(uint32_t)0xFEF6FFFF; /*Reset HSEBYP bit*/ RCC->CR&=(uint32_t)0xFFFBFFFF; /*Reset PLLSRC,PLLXTPRE,PLLMUL and USBPRE/OTGFSPRE bits*/ RCC->CFGR&=(uint32_t)0xFF80FFFF; #ifdefSTM32F10X_CL /*Reset PLL2ON and PLL3ON bits*/ RCC->CR&=(uint32_t)0xEBFFFFFF; /*Disable all interrupts and clear pending bits*/ RCC->CIR=0x00FF0000; /*Reset CFGR2 register*/ RCC->CFGR2=0x00000000; #elifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(defined STM32F10X_HD_VL) /*Disable all interrupts and clear pending bits*/ RCC->CIR=0x009F0000; /*Reset CFGR2 register*/ RCC->CFGR2=0x00000000; #else /*Disable all interrupts and clear pending bits*/ RCC->CIR=0x009F0000; #endif/*STM32F10X_CL*/ #ifdefined(STM32F10X_HD)||(defined STM32F10X_XL)||(defined STM32F10X_HD_VL) #ifdefDATA_IN_ExtSRAM SystemInit_ExtMemCtl(); #endif/*DATA_IN_ExtSRAM*/ #endif /*Configure the System clock frequency,HCLK,PCLK2 and PCLK1 prescalers*/ /*Configure the Flash Latency cycles and enable prefetch buffer*/ SetSysClock(); #ifdefVECT_TAB_SRAM SCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;/*Vector Table Relocation in Internal SRAM.*/ #else SCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;/*Vector Table Relocation in Internal FLASH.*/ #endif }
打開(kāi)內(nèi)部8M時(shí)鐘
RCC->CR|=(uint32_t)0x00000001
通過(guò)查看寄存器手冊(cè)可知,這段代碼為打開(kāi)內(nèi)部8M時(shí)鐘。
設(shè)置時(shí)鐘配置寄存器
#ifndefSTM32F10X_CL RCC->CFGR&=(uint32_t)0xF8FF0000; #else RCC->CFGR&=(uint32_t)0xF0FF0000; #endif/*STM32F10X_CL*/
對(duì)應(yīng)寄存器說(shuō)明可查看《STM32中文參考手冊(cè)_V10》的6.3.2 時(shí)鐘配置寄存器(RCC_CFGR)章節(jié)。
后續(xù)代碼,有興趣可根據(jù)《STM32中文參考手冊(cè)_V10》手冊(cè),查看代碼具體作用。
2.3 SetSysClock()函數(shù)詳解
staticvoidSetSysClock(void) { #ifdefSYSCLK_FREQ_HSE SetSysClockToHSE(); #elifdefined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elifdefined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elifdefined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elifdefined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elifdefined SYSCLK_FREQ_72MHz SetSysClockTo72(); #endif }
system_stm32f10x.c文件中會(huì)根據(jù)芯片的型號(hào)定義對(duì)應(yīng)的宏
#ifdefined(STM32F10X_LD_VL)||(defined STM32F10X_MD_VL)||(defined STM32F10X_HD_VL) /*#define SYSCLK_FREQ_HSEHSE_VALUE*/ #defineSYSCLK_FREQ_24MHz24000000 #else /*#define SYSCLK_FREQ_HSEHSE_VALUE*/ /*#define SYSCLK_FREQ_24MHz24000000*/ /*#define SYSCLK_FREQ_36MHz36000000*/ /*#define SYSCLK_FREQ_48MHz48000000*/ /*#define SYSCLK_FREQ_56MHz56000000*/ #defineSYSCLK_FREQ_72MHz72000000 #endif
3. 時(shí)鐘配置函數(shù)
3.1 時(shí)鐘初始化配置函數(shù)
voidSystemInit(void); SYSCLK(系統(tǒng)時(shí)鐘)=72MHZ; AHB總線時(shí)鐘(HCLK=SYSCLK)=72MHZ; APB1總線時(shí)鐘(PCLK1=SYSCLK/2)=36MHZ; APB2總線時(shí)鐘(PCLK1=SYSCLK/1)=72MHZ; PLL主時(shí)鐘=72MHZ;
3.2 外設(shè)時(shí)鐘使能配置函數(shù)
voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalState NewState); voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalState NewState); voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);
3.3 時(shí)鐘源使能函數(shù)
voidRCC_HSICmd(FunctionalState NewState); voidRCC_LSICmd(FunctionalState NewState); voidRCC_PLLCmd(FunctionalState NewState); voidRCC_RTCCLKCmd(FunctionalState NewState);
3.4 時(shí)鐘源和倍頻因子配置函數(shù)
voidRCC_HSEConfig(uint32_tRCC_HSE); voidRCC_SYSCLKConfig(uint32_tRCC_SYSCLKSource); voidRCC_HCLKConfig(uint32_tRCC_SYSCLK); voidRCC_PCLK1Config(uint32_tRCC_HCLK); voidRCC_PCLK2Config(uint32_tRCC_HCLK);
3.5 外設(shè)時(shí)鐘復(fù)位函數(shù)
voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalState NewState); voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalState NewState);
3.6 自定義系統(tǒng)時(shí)鐘
voidRCC_HSE_Config(u32 div,u32 pllm) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); if(RCC_WaitForHSEStartUp()==SUCCESS) { RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PLLConfig(div,pllm); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET) RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK) while(RCC_GetSCLKSource()!=0x08); } }
審核編輯:湯梓紅
-
振蕩器
+關(guān)注
關(guān)注
28文章
4014瀏覽量
140872 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365085 -
pll
+關(guān)注
關(guān)注
6文章
889瀏覽量
136433 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1901瀏覽量
133242 -
時(shí)鐘源
+關(guān)注
關(guān)注
0文章
98瀏覽量
16331
原文標(biāo)題:STM32時(shí)鐘詳解
文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
STM32時(shí)鐘詳解
STM32時(shí)鐘詳解 精選資料推薦
系統(tǒng)時(shí)鐘RCC詳解
詳解STM32的時(shí)鐘樹(shù)時(shí)鐘信號(hào)
STM32時(shí)鐘樹(shù)案例詳解
STM32的時(shí)鐘樹(shù)詳解
STM32最小系統(tǒng)和時(shí)鐘詳解

STM32系統(tǒng)時(shí)鐘RCC詳解

【自學(xué)筆記】STM32時(shí)鐘系統(tǒng)詳解

2.STM32的存儲(chǔ)器、電源和時(shí)鐘體系

STM32時(shí)鐘系統(tǒng)與時(shí)鐘啟動(dòng)順序詳解

單片機(jī)STM32時(shí)鐘詳解

評(píng)論