亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

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

2023-06-07 10:05:47 來源:嵌入式開發(fā)愛好者

1. STM32時鐘源主要有:

內(nèi)部時鐘


(資料圖)

外部時鐘

鎖相環(huán)倍頻輸出時鐘

1.1 詳細介紹

HSI(內(nèi)部高速時鐘)

它是RC振蕩器,頻率可以達到8MHZ,可作為系統(tǒng)時鐘和PLL鎖相環(huán)的輸入。

HSE(外部高速時鐘)

接入晶振范圍是4-16MHZ,可作為系統(tǒng)時鐘和PLL鎖相環(huán)的輸入,還可以經(jīng)過128分頻之后輸入給RTC。

LSI(內(nèi)部低速時鐘)

它是RC振蕩器,頻率大概為40KHZ,供給獨立看門狗或者RTC,并且獨立看門口只能依靠LSI作為時鐘源。

LSE(外部低速時鐘)

通常外接32.768MHZ晶振提供給RTC。

PLL(鎖相環(huán))

用來倍頻輸出。因為開發(fā)板外部晶振只有8MHZ,而STM32最大工作頻率是72MHZ。他可以通過HSI輸入,HSE輸入或兩分頻輸入,通過PLL倍頻(2-16),倍頻之后輸入給系統(tǒng)時鐘。

MCO(時鐘輸出管腳)

通常對應(yīng)STM32 PA8,它可以選擇一個時鐘信號輸出,給外部的系統(tǒng)提供時鐘源。

2. 標(biāo)準(zhǔn)庫的時鐘配置

2.1 stm32啟動文件

首先打開startup_stm32f10x_hd.s,該文件為stm32的啟動文件,在該文件內(nèi)會發(fā)現(xiàn)有這么一塊用匯編寫的代碼。

Reset_HandlerPROCEXPORTReset_Handler[WEAK]IMPORT__mainIMPORTSystemInitLDRR0,=SystemInitBLXR0LDRR0,=__mainBXR0ENDP

通過這段匯編代碼可以看出,程序在執(zhí)行main函數(shù)之前,會先執(zhí)行SystemInit函數(shù)。

2.2 SystemInit函數(shù)詳解

voidSystemInit(void){/*ResettheRCCclockconfigurationtothedefaultresetstate(fordebugpurpose)*//*SetHSIONbit*/RCC->CR|=(uint32_t)0x00000001;/*ResetSW,HPRE,PPRE1,PPRE2,ADCPREandMCObits*/#ifndefSTM32F10X_CLRCC->CFGR&=(uint32_t)0xF8FF0000;#elseRCC->CFGR&=(uint32_t)0xF0FF0000;#endif/*STM32F10X_CL*//*ResetHSEON,CSSONandPLLONbits*/RCC->CR&=(uint32_t)0xFEF6FFFF;/*ResetHSEBYPbit*/RCC->CR&=(uint32_t)0xFFFBFFFF;/*ResetPLLSRC,PLLXTPRE,PLLMULandUSBPRE/OTGFSPREbits*/RCC->CFGR&=(uint32_t)0xFF80FFFF;#ifdefSTM32F10X_CL/*ResetPLL2ONandPLL3ONbits*/RCC->CR&=(uint32_t)0xEBFFFFFF;/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x00FF0000;/*ResetCFGR2register*/RCC->CFGR2=0x00000000;#elifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x009F0000;/*ResetCFGR2register*/RCC->CFGR2=0x00000000;#else/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x009F0000;#endif/*STM32F10X_CL*/#ifdefined(STM32F10X_HD)||(definedSTM32F10X_XL)||(definedSTM32F10X_HD_VL)#ifdefDATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif/*DATA_IN_ExtSRAM*/#endif/*ConfiguretheSystemclockfrequency,HCLK,PCLK2andPCLK1prescalers*//*ConfiguretheFlashLatencycyclesandenableprefetchbuffer*/SetSysClock();#ifdefVECT_TAB_SRAMSCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalSRAM.*/#elseSCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalFLASH.*/#endif}

打開內(nèi)部8M時鐘

RCC->CR|=(uint32_t)0x00000001

通過查看寄存器手冊可知,這段代碼為打開內(nèi)部8M時鐘。

設(shè)置時鐘配置寄存器

#ifndefSTM32F10X_CLRCC->CFGR&=(uint32_t)0xF8FF0000;#elseRCC->CFGR&=(uint32_t)0xF0FF0000;#endif/*STM32F10X_CL*/

對應(yīng)寄存器說明可查看《STM32中文參考手冊_V10》的6.3.2 時鐘配置寄存器(RCC_CFGR)章節(jié)。

后續(xù)代碼,有興趣可根據(jù)《STM32中文參考手冊_V10》手冊,查看代碼具體作用。

2.3 SetSysClock()函數(shù)詳解

staticvoidSetSysClock(void){#ifdefSYSCLK_FREQ_HSESetSysClockToHSE();#elifdefinedSYSCLK_FREQ_24MHzSetSysClockTo24();#elifdefinedSYSCLK_FREQ_36MHzSetSysClockTo36();#elifdefinedSYSCLK_FREQ_48MHzSetSysClockTo48();#elifdefinedSYSCLK_FREQ_56MHzSetSysClockTo56();#elifdefinedSYSCLK_FREQ_72MHzSetSysClockTo72();#endif}

system_stm32f10x.c文件中會根據(jù)芯片的型號定義對應(yīng)的宏

#ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)/*#defineSYSCLK_FREQ_HSEHSE_VALUE*/#defineSYSCLK_FREQ_24MHz24000000#else/*#defineSYSCLK_FREQ_HSEHSE_VALUE*//*#defineSYSCLK_FREQ_24MHz24000000*//*#defineSYSCLK_FREQ_36MHz36000000*//*#defineSYSCLK_FREQ_48MHz48000000*//*#defineSYSCLK_FREQ_56MHz56000000*/#defineSYSCLK_FREQ_72MHz72000000#endif

3. 時鐘配置函數(shù)

3.1 時鐘初始化配置函數(shù)

voidSystemInit(void);SYSCLK(系統(tǒng)時鐘)=72MHZ;AHB總線時鐘(HCLK=SYSCLK)=72MHZ;APB1總線時鐘(PCLK1=SYSCLK/2)=36MHZ;APB2總線時鐘(PCLK1=SYSCLK/1)=72MHZ;PLL主時鐘=72MHZ;

3.2 外設(shè)時鐘使能配置函數(shù)

voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);

3.3 時鐘源使能函數(shù)

voidRCC_HSICmd(FunctionalStateNewState);voidRCC_LSICmd(FunctionalStateNewState);voidRCC_PLLCmd(FunctionalStateNewState);voidRCC_RTCCLKCmd(FunctionalStateNewState);

3.4 時鐘源和倍頻因子配置函數(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è)時鐘復(fù)位函數(shù)

voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);

3.6 自定義系統(tǒng)時鐘

voidRCC_HSE_Config(u32div,u32pllm){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);}}

審核編輯:湯梓紅

標(biāo)簽:

上一篇:觀天下!基于SY8843開關(guān)穩(wěn)壓器的電源紋波測試方案
下一篇:最后一頁