扫描关注一起学嵌入式,一起学习,一起成长
1.1 详细介绍
HSI(内部高速时钟)
它是RC振荡器,频率可以达到8MHZ,可作为系统时钟和PLL锁相环的输入
HSE(外部高速时钟)
【资料图】
接入晶振范围是4-16MHZ,可作为系统时钟和PLL锁相环的输入,还可以经过128分频之后输入给RTC。
LSI(内部低速时钟)
它是RC振荡器,频率大概为40KHZ,供给独立看门狗或者RTC,并且独立看门口只能依靠LSI作为时钟源
LSE(外部低速时钟)
通常外接32.768MHZ晶振提供给RTC
PLL(锁相环)
用来倍频输出。因为开发板外部晶振只有8MHZ,而STM32最大工作频率是72MHZ。他可以通过HSI输入,HSE输入或两分频输入,通过PLL倍频(2-16),倍频之后输入给系统时钟。
MCO(时钟输出管脚)
通常对应STM32 PA8,它可以选择一个时钟信号输出,给外部的系统提供时钟源
2. 标准库的时钟配置
2.1 stm32启动文件
首先打开startup_stm32f10x_hd.s,该文件为stm32的启动文件,在该文件内会发现有这么一块用汇编写的代码。
Reset_HandlerPROCEXPORTReset_Handler[WEAK]IMPORT__mainIMPORTSystemInitLDRR0,=SystemInitBLXR0LDRR0,=__mainBXR0ENDP
通过这段汇编代码可以看出,程序在执行main函数之前,会先执行SystemInit函数。
2.2 SystemInit函数详解
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}
打开内部8M时钟
RCC->CR|=(uint32_t)0x00000001
通过查看寄存器手册可知,这段代码为打开内部8M时钟。
设置时钟配置寄存器
#ifndefSTM32F10X_CLRCC->CFGR&=(uint32_t)0xF8FF0000;#elseRCC->CFGR&=(uint32_t)0xF0FF0000;#endif/*STM32F10X_CL*/
对应寄存器说明可查看《STM32中文参考手册_V10》的6.3.2 时钟配置寄存器(RCC_CFGR)章节。
后续代码,有兴趣可根据《STM32中文参考手册_V10》手册,查看代码具体作用。
2.3 SetSysClock()函数详解
staticvoidSetSysClock(void){#ifdefSYSCLK_FREQ_HSESetSysClockToHSE();#elifdefinedSYSCLK_FREQ_24MHzSetSysClockTo24();#elifdefinedSYSCLK_FREQ_36MHzSetSysClockTo36();#elifdefinedSYSCLK_FREQ_48MHzSetSysClockTo48();#elifdefinedSYSCLK_FREQ_56MHzSetSysClockTo56();#elifdefinedSYSCLK_FREQ_72MHzSetSysClockTo72();#endif}
system_stm32f10x.c文件中会根据芯片的型号定义对应的宏
#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. 时钟配置函数
3.1 时钟初始化配置函数
voidSystemInit(void);SYSCLK(系统时钟)=72MHZ;AHB总线时钟(HCLK=SYSCLK)=72MHZ;APB1总线时钟(PCLK1=SYSCLK/2)=36MHZ;APB2总线时钟(PCLK1=SYSCLK/1)=72MHZ;PLL主时钟=72MHZ;
3.2 外设时钟使能配置函数
voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);
3.3 时钟源使能函数
voidRCC_HSICmd(FunctionalStateNewState);voidRCC_LSICmd(FunctionalStateNewState);voidRCC_PLLCmd(FunctionalStateNewState);voidRCC_RTCCLKCmd(FunctionalStateNewState);
3.4 时钟源和倍频因子配置函数
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 外设时钟复位函数
voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);
3.6 自定义系统时钟
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);}}
觉得文章不错,点击“分享”、“赞”、“在看” 呗!

-
如何选择合适的理财工具?各类理财工具的特点是什么?如何选择合适的理财工具?选择合适的理财产品需要投资者考虑自身投资目标、风险承受能力、产品特点、交易费用等因素,并进行充...
-
什么叫白马股?蓝筹股和白马股哪个好?蓝筹股的价值什么叫白马股?白马股,是指长期绩优、回报率高并具有较高投资价值的股票。一般来说白马股的涨幅是比蓝筹要大的,因为蓝筹太过...
-
301开头的股票是什么股?证券账户开户哪家的费率低?301开头的股票是什么股?301开头的股票代表的是创业板的股票。股票的代码通常由六位数字组成,前三位数字代表的是股票所属的交...
-
企业亏损的原因有哪些?玩短线减少亏损的技巧是什么?企业亏损的原因有哪些?1、客观因素(1)受国际环境影响,出口贸易受挫。(2)国内需求不足造成产品价格下降,影响了企业效益的提...
-
新手理财应该怎么做?适合新手理财的五大投资项目是什么?新手理财应该怎么做?1、测试自己的风险承受能力新手在理财的第一步,应该通过一些交易原件来测试自己的风险承受能力,以及自...
-
如何选择合适的理财工具?各类理财工具的特点是什么?
2023-04-12 08:08:29
-
什么叫白马股?蓝筹股和白马股哪个好?蓝筹股的价值
2023-04-04 09:30:09
-
301开头的股票是什么股?证券账户开户哪家的费率低?
2023-04-04 09:23:47
-
企业亏损的原因有哪些?玩短线减少亏损的技巧是什么?
2023-04-04 09:20:54
-
新手理财应该怎么做?适合新手理财的五大投资项目是什么?
2023-04-04 09:04:31