历史上的今天
返回首页

历史上的今天

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

正在发生

2018年12月17日 | STM32 时钟配置之寄存器操作

2018-12-17 来源:eefocus

1 时钟


1.1时钟树


Stm32 的时钟配置必须要参考时钟树,时钟树决定了时钟的配置的路径,兼着参考RCC寄存器就可以配置不同的时钟频率了。另外STM32外部晶振推荐为8M,所以用外部时钟时最好采用推荐值。



1.2 时钟配置


程序刚启动的时候,stm32采用的为内部高速时钟,通过上图的时钟树可以发现内部8M时钟通过SW成为系统时钟。RCC_CR的复位值为0x000XX83,展开后为HSION为1,也印证了时钟默认为内部高速时钟。如果需要采用外部时钟,需要按照如下的方式配置。


1、时钟初始化,即将时钟的寄存器采用默认值。


2、开始外部时钟且外部时钟起震准备就绪。


3、设置PLLXTPRE(只能在关闭PLL时才能写入此位),可选择分频不分频。


4、设置进入PLL的源时钟(只能在关闭PLL时才能写入此位)。因为采用外部时钟所以只有一种设置。


5、设置PLL倍频系数PLLMUL(只有在PLL关闭的情况下才可被写入)。


6、开启PLL,且准备就绪。


7、设置SW,选择时钟源为系统时钟。


8、判断是否是预选的时钟为系统时钟。


注:必须在使能每个PLL之前完成PLL的配置(选择时钟源、预分频系数和倍频系数等),同时应该在它们的输入时钟稳定(就绪位)后才能使能。一旦使能了PLL,这些参数将不能再被改变。AHB,APB1,APB2。只要系统时钟确定了,他们就确定了,但是和系统是几分频需要在系统时钟开启前设置好,这个是设置项,并不是开启项。另外,由于FASH取指用的是AHB的频率,在采用不同的系统频率时,在时钟配置的时候需要延时。这里需要参考stm32的FLASH编程手册。在开启PLL时钟之前需要设置FLASH->ACR|=0x32;目的是flash的取指的稳定性需要和系统时钟构成某种关系。


1.3程序实现


如上,外部晶振为8M,系统时钟为72M的配置程序如下。


/*


@brife:this is source file for system clock


@editor:houchao


*/


#include"stm32f10x.h"


#include"System_Clock.h"


voidRCC_DeInit()


{


         RCC->APB1RSTR&=(uint32_t)0x00000000;//


         RCC->APB2RSTR&=(uint32_t)0X00000000;//


         RCC->AHBENR&=(uint32_t)0x00000014;//


         RCC->APB1ENR&=(uint32_t)0x00000000;//


         RCC->APB2ENR&=(uint32_t)0x00000000;//


         RCC->CR|=0X00000001;//


        while(0==((RCC->CR>>1) &0x00000001));


        RCC->CFGR&=(uint32_t)0XFFFFFFFE;//


        while((RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==1);//


        RCC->CIR&=(uint32_t)0x00000000;//


}


/*


@brife:


@editor£ºhouchao


*/


voidsystem_clock(void)


{


         RCC_DeInit();


         RCC->CR |= (uint32_t) 0X00010000;


         while(0==((RCC->CR>>17)&0x00000001));


         //APB1=DIV2;APB2=DIV1;AHB=DIV1;


         RCC->CFGR=0X00000400;


        RCC->CFGR &=0xfffeffff;


        RCC->CFGR |=0x00007000;


        RCC->CFGR|=7<<18;//


         FLASH->ACR|=0x32;       //FLASH 2


         RCC->CR|=0x01000000;  //PLLON


         while(!(RCC->CR>>25));//


         RCC->CFGR|=0x00000002;//


         while(((RCC->CFGR>>2)&0x03)!=0x02);//


}


如上的程序在调试的过程中,发现程序下载后,单片机无法启动,经过排查程序出现在


while((RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==1);//确定内部时钟为高速时钟


当判断为 (RCC->CFGR>>2)!=1&&(RCC->CFGR>>3)==0时,程序无法跳出该语句。


该语句目的是保证单片机工作在内部时钟的频率下,仔细一看,不对呀,这条语句搞的太复杂了吧,于是化简如下:


while(((RCC->CFGR>>2)& 0x03 )!=0x00); 通过LED灯闪烁的频率证明,mcu的时钟发生切换,现在又存在另外一个问题,我们切换后的时钟,系统时钟到底是以多少的频率在跑呢?看到这里,我们发现该单片机能够将系统时钟通过配置输出到特定的单片机管脚,我们配置后,通过示波器看该管脚的波形,就知道了我们设置的系统时钟是否是我们预想的结果。



推荐阅读

史海拾趣

驰兴电感(Coilank)公司的发展小趣事

驰兴电感深知客户是企业发展的根基。公司始终坚持以客户为中心的服务理念,为客户提供全方位、个性化的服务。无论是产品选型、技术支持还是售后服务,驰兴电感都能及时响应客户需求,提供满意的解决方案。这种贴心的服务赢得了客户的信赖和支持,也为公司的持续发展奠定了坚实基础。

HCC Industries公司的发展小趣事

近年来,随着全球对环境保护和可持续发展的重视,HCC Industries积极响应号召,制定了绿色可持续发展战略。公司加大了对环保技术和绿色产品的研发投入,推出了一系列符合环保标准的微电子部件产品。同时,HCC还通过优化生产工艺和节能减排措施,降低了生产过程中的能源消耗和污染排放。这一战略不仅赢得了客户和消费者的广泛赞誉,也为公司带来了更加可持续的发展前景。

FCI / Amphenol公司的发展小趣事

2005年,FCI迎来了新的发展机遇。贝恩资本,一家在全球近75个工业领域和技术公司有着丰富投资经验的私有投资基金,决定收购FCI。贝恩资本的加入为FCI提供了强大的财力和国际业务支持,使得FCI在连接器市场上更具竞争力。这一收购也标志着FCI正式迈入了一个新的发展阶段。

Amphenol公司的发展故事

EPCOS (TDK)公司的发展小趣事

在国际化布局方面,TDK-EPC公司始终保持着积极开放的态度。公司通过设立海外研发中心、生产基地和销售网络等方式,不断拓展国际市场。同时,公司还积极参与国际竞争和合作,与全球众多知名企业建立了长期稳定的合作关系。这些举措不仅提升了TDK-EPC公司的品牌影响力和市场竞争力,也为公司的长期发展提供了有力保障。

广芯电子(BROADCHIP)公司的发展小趣事

2009年10月1日,EPCOS与TDK元件事业部合并,成立了TDK-EPC公司。这次合并进一步增强了EPCOS在电子元器件领域的实力,使其在全球市场中的地位更加稳固。合并后,TDK-EPC公司继续秉承EPCOS的技术创新和产品拓展战略,不断推出具有竞争力的新产品和解决方案,以满足客户日益增长的需求。

Custom Mmic Design Services Inc公司的发展小趣事

随着市场竞争的加剧,CMDS意识到仅仅依靠技术创新是不够的,还需要提供差异化的服务。于是,公司推出了定制化MMIC设计服务,根据客户的具体需求和应用场景,量身定制解决方案。这种服务模式不仅提高了客户满意度,也增强了CMDS的市场竞争力。通过不断优化服务流程和提高设计质量,CMDS逐渐在定制化服务市场上树立了良好的口碑。

问答坊 | AI 解惑

锂离子电池智能充电器硬件的设计

锂离子电池具有较高的能量重量和能量体积比,无记忆效应,可重复充电次数多,使用寿命长,价格也越来越低。一个良好的充电器可使电池具有较长的寿命。利用C8051F310单片机设计的智能充电器,具有较高的测量精度,可很好的控制充电电流的大小,适时 ...…

查看全部问答>

天下最有才的辞职信

  亲爱的老板:    昨天外面下了一场雨嗳,这让我想起我国著名诗人汪国真的诗句:“总有些这样的时候,正是为了爱,才悄悄躲开,躲开的是身影,躲不开的,却是那份,默默的情怀。……“    领导你看,他写得多好啊,我一边读他的诗,一边 ...…

查看全部问答>

容阻降压电路输出电流过小

咖啡机降压电路为容阻降压,怎样解决容阻降压电路输出电流过小的问题,一般只能有几十mA…

查看全部问答>

mobile5.0下如何把ToolBar移动到顶部(vc2005)?

大家好,为什么mobile下面无法将工具栏放在顶部?有没有哪位遇到过类似问题?…

查看全部问答>

verilog HDL程序错误问题

一个数字跑表程序,clk:时钟信号;clr:异步复位信号;pause:暂停信号;msh,msl:百分秒高位和低位:sh,sl:秒高位和低位;mh,ml:分高位和低位module paobiao(msh,msl,sh,sl,mh,ml,clk,clr,pause);output [3:0]msh,msl,sh,sl,mh,ml;input&nbs ...…

查看全部问答>

工作,唉。

上学的时候吧想工作,一直认为上班好,可上班了觉得还是上学好啊,呵呵。开始的时候觉得工作了很新鲜,慢慢的就变得麻木啦,开始的时候还在想要不要换工作,最后还是决定坚持下去,不三心二意的换来换去的,没了换工作的烦恼,缺有了新的烦恼,那就 ...…

查看全部问答>

新手求救!定义bit变量!

我用c写程序的时候想定义一个可位操作的变量,可是430不支持bit指令,请高手赐教怎么实现?…

查看全部问答>

【共享】芯嵌stm32入门教程 + 视频

(一)芯嵌stm32入门视频,下载地址:http://pan.baidu.com/share/link?shareid=2052956608&uk=3942664303 芯嵌stm32入门视频之一《stm32入门初探》 芯嵌stm32入门视频之二《芯嵌stm32使用指南》 芯嵌stm32入门视频之三《JLink的安装和使用》 ...…

查看全部问答>

MDK474编译老出错

       领的LPC1500的板子之后,最近才抽得空出来玩NXP,可是编程环境一直弄不出来,急死我了!!!!!!! 在官网下了 MSK 474,装好之后也破解了 在论坛里在了个例程想看下板子能不能工作,可是编译一直不通过,老是提示 ...…

查看全部问答>

已知磁芯 如何选择骨架?

新手在此弱弱地请教一个问题  已知磁芯 如何选择骨架?是每个对应的磁芯可以能找到相对应的骨架吗? \0\0\0eeworldpostqq…

查看全部问答>