历史上的今天
返回首页

历史上的今天

今天是:2024年12月17日(星期二)

正在发生

2018年12月17日 | STM32笔记:RCC结构与配置流程

2018-12-17 来源:eefocus

        以前使用STM32写程序的时候,使用的都是默认时钟。因此写数码管显示、A/D测量电压的时候都没有去关心RCC时钟配置这个事情。那时候只知道在配置外设的时候使用GPIO_InitTypeDef或者ADC_InitTypeDef这些结构体对外设进行初始化,以及使用RCC_APB2PeriphClockCmd或者RCC_ADCCLKConfig函数对外设的时钟开启与配置。


        这几天尝试使用STM32的USB通信写一个鼠标,发现一些例程中有关于时钟配置的代码,才注意起这个事情。为此进行了一些学习,并且记录如下的笔记。


一、RCC的结构


以下是STM32时钟系统的结构图: 


        从图中,我们可以看到,STM32的时钟有四个来源:外部晶振提供的高速外部时钟(HSE)、外部晶振提供的低速外部时钟(LSE)、内部RC振荡器提供的高速内部时钟(HSI)、内部RC振荡器提供的低速内部时钟(LSI)。看上去RCC的工作过程好像很复杂,其实细看并不然。


        举个例子吧,Keil编写程序是默认的时钟为72Mhz,其实是这么来的:外部晶振提供的8MHz(与电路板上的晶振的相关)通过PLLXTPRE分频器后,进入PLLSRC选择开关,进而通过PLLMUL锁相环进行倍频(x9)后,为系统提供72MHz的系统时钟(SYSCLK)。之后是AHB预分频器对时钟信号进行分频,然后为低速外设提供时钟。


        当然,在实际应用中,我们也可以为系统时钟作其他的设置。譬如把内部高速RC振荡器(HSI RC)二分频后,通过PLLSRC选择开关进行倍频而不使用外部晶振作为输入,HSI也可以直接通过SW选择开关来提供系统时钟。


        此外,STM32还提供了一个时钟监视系统(CSS),用于监视高速外部时钟(HSE)的工作状态。倘若HSE失效,会自动切换(高速内部时钟)HSI作为系统时钟的输入。


二、RCC配置流程


1、将RCC寄存器恢复为默认值   RCC_DeInit


2、打开外部高速时钟晶振    RCC_HSEConfig


3、等待外部高速时钟晶振工作  


4、设置AHB时钟    RCC_HCLKConfig


5、设置高速APB时钟    RCC_PCLK2Config


6、设置低速APB时钟    RCC_PCLK1Config


7、设置PLL锁相环    RCC_PLLConfig


8、打开PLL锁相环    RCC_PLLCmd


9、等待PLL锁相环工作    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)


10、设置系统时钟    RCC_SYSCLKConfig


11、判断PLL是否为系统时钟    while(RCC_GetSYSCLKSource()!=0x08)


12、打开要使用的外设时钟 RCC_APB2PeriphClockCmd/RCC_APB1PeriphClockCmd


以上步骤只是举个例子。根据RCC的工作过程,查阅参考手册与库函数的手使用册可以自己进行的配置。


使用代码再举一个例子吧


void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化为缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪


FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state


RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 =  HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

RCC_PLLCmd(ENABLE); //Enable PLLCLK

 

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source


//---------打开相应外设时钟--------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟  

}


推荐阅读

史海拾趣

Bivar公司的发展小趣事

在数字化转型的大趋势下,Bivar公司也积极拥抱新技术,推动公司的数字化转型。公司引入了先进的生产管理系统和数据分析工具,实现了生产过程的智能化和精细化管理。同时,公司还加强了线上销售和客户服务渠道的建设,提升了客户体验和满意度。这些数字化转型的举措使得Bivar公司在激烈的市场竞争中保持了领先地位。

请注意,以上故事都是基于虚构和假设的,并不代表Bivar公司的真实发展历程。如果您需要了解Bivar公司的真实情况,建议您查阅该公司的官方网站、新闻报道或行业分析报告等权威渠道。

ELMEC Technology Of America Inc公司的发展小趣事

在ELMEC看来,产品质量是企业的生命线。为了确保产品的可靠性和稳定性,公司建立了一套完善的质量管理体系。从原材料采购到产品生产、从质量控制到售后服务,每一个环节都经过严格把控。同时,ELMEC还积极引进国际先进的质量管理方法和标准,不断提高产品的整体质量水平。这些努力使得ELMEC的产品在市场上享有很高的声誉。

FWBELL公司的发展小趣事
使用温度传感器(如热敏电阻或IC)紧贴电池表面,实时检测电池温度。
Electronic Sensor + Resistor GmbH公司的发展小趣事

Electronic Sensor + Resistor GmbH(简称ESR公司)的创立源于两位电子工程师的远见卓识。他们发现市场上对于高精度电子传感器和定制电阻器的需求日益增长,但现有产品往往无法满足特定应用的性能要求。于是,ESR公司应运而生,专注于研发和生产高性能的电子传感器和电阻器。

在创业初期,ESR公司面临着资金、技术和市场的三重挑战。但凭借其卓越的研发实力和坚持不懈的市场推广,公司逐渐在市场上树立起高品质、高可靠性的品牌形象。通过与多家知名企业的合作,ESR公司的产品逐渐获得了市场的认可。

AEL [AEL Crystals Ltd]公司的发展小趣事

AEL Crystals非常重视与供应商和客户之间的合作关系。公司积极与供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,AEL Crystals也与众多客户建立了紧密的合作关系,深入了解客户需求并提供定制化的解决方案。这种长期合作关系的建立为公司的持续发展提供了有力保障。

康奈特(CNNT)公司的发展小趣事

面对数字化浪潮的冲击,康奈特积极响应并开始了数字化转型之路。公司引进了先进的智能制造设备和技术手段,实现了生产线的自动化和智能化升级。同时,公司还建立了数字化管理平台,实现了对生产、销售、库存等各个环节的实时监控和管理。这种数字化转型不仅提高了生产效率和质量稳定性,也为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

同学们,我找到一款功能不错,价格便宜的PCB设计软件

我找到一款功能不错的PCB设计软件,叫EAGLE,是德国一家叫CadSoft的公司研发的,这个软件有四个版本,专业版,标准版,免费试用版和简化版。专业版支持255个绘图层,带有自动布线功能,而且还可以导入其他设计工具或程序的数据,生成Gerber和Excell ...…

查看全部问答>

三星2416在WINCE5.0上的休眠问题,头大了。。高手进来看看。。

能够正常进入休眠模式,但是唤醒后无论有没有操作,过一小会就出现异常并死机,串口打印如下信息: 红色的是没有操作死机的打印信息: Data Abort: Thread=83f7f6d0 Proc=815fb580 \'device.exe\' AKY=00000005 PC=8039bd50(NK.EXE+0x0019bd50) ...…

查看全部问答>

添加的开机运行程序 卡住

写了一个小的应用程序,通过修改注册表,设置成开机自动运行.(我用vs2005远程跑是没问题的) 可是,开机时会卡在log界面上.请问下高手,问题在哪里? 添加注册表如下: [HKEY_LOCAL_MACHINE\\init] \"Launch50\"=\"startup.exe\" \"Depend50\"=hex:14 ...…

查看全部问答>

有关CE上显示字型的问题

现在我的系统中使用的字型文件是一个名叫:mingliu.ttc的字型文件(这个是一个能支持繁体中文的字型文件)。现在我把系统的字体修改为:使用New Times Roman字型,这样就会出现一个问题,在显示中文的地方就会出现口口(框框)不能正常显示。这应该 ...…

查看全部问答>

哪位有BTS7810 BTS723的PDF

哪位有BTS7810   BTS723的PDF 谢谢…

查看全部问答>

急问版主和高手,中断优先级问题

采用定时器1、3的周期中断,两个同时用,两个周期寄存器的设置是一样的,定时器1的周期中断和3的周期中断优先级一样,都是2级,怎么写中断向量表?中断优先级一样的两个中断怎么进行设置?要求1的周期中断高于3的周期中断,谢谢!…

查看全部问答>

真诚请教UBOOT-1.1.4编译问题,谢谢

我用的是CROSS—2.95.3,编译1.1.2没问题,但编译1.1.4老是不能,出现在cc1: invalid option \'abi=apcs-gnu\'错误,把编译系统换成CROSS-3.2也还是同样的问题。今天试了下CROSS-3.3.2也还是同样的问题。   是编译系 ...…

查看全部问答>

果然重赏之下必有勇夫!看着也很给力!

ti的这一系列活动大有全民ti的势头!不说其它的这样跟一段时间再有低功耗或相关的应用,肯定430没的跑了!…

查看全部问答>

论坛里有人准备DIY四轴飞行器电路用STM32F103

https://bbs.eeworld.com.cn/thread-355890-1-1.html…

查看全部问答>