STM32入门教程-系统时钟配置_第1页
STM32入门教程-系统时钟配置_第2页
STM32入门教程-系统时钟配置_第3页
STM32入门教程-系统时钟配置_第4页
STM32入门教程-系统时钟配置_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32系统时钟配置一、STM32的时钟系统时钟是什么?时钟通常是振荡器(如晶振)产生的特定频率的方波信号,时钟周期是时钟频率的倒数,时钟频率1MHz时钟周期为1/1000000=1us。时钟周期是MCU处理指令的最小时间单元,每个程序指令都需要若干个时钟周期,MCU的时钟频率越快,完成一个指令的时间就越短,速度就越快。时钟是MCU运行的基础,好比MCU的脉搏,是MCU性能的重要参数。每个MCU都是在某个特定的时钟频率下进行工作的,如 C51单片机时钟频率为12MHz,而STM32F103的系统时钟频率是72MHz。STM32的时钟系统STM32时钟频率较高,时钟越快功耗越大,同时抗电磁干扰能力也会越弱。而且STM32外设非常多,而通常外设是不需要像系统时钟那么高的频率的,比如看门狗和RTC只需要几十K的时钟即可。另外实际使用的时候通常只会用到有限的几个外设,STM32可以只给需要启动的外设分配时钟,以此来降低功耗。由此可看出STM32的时钟系统较为复杂,它采用了多个时钟源的方法来解决这些问题。STM32有4个独立时钟源:HSI、HSE、LSI、LSE。①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz〜16MHz。③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。其中LSI是作为IWDGCLK(独立看门狗)时钟源和RTC时钟源而独立使用,HSI高速内部时钟HSE高速外部时钟PLL锁相环时钟这三个经过分频或者倍频作为系统时钟来使用

YAEKi-t*!-;|;\14MHt'HCUb.c唾工离HW・品帝内建斯普忆4旧初迎后内皿甘心号i罪-1LH部靠时冲YAEKi-t*!-;|;\14MHt'HCUb.c唾工离HW・品帝内建斯普忆4旧初迎后内皿甘心号i罪-1LH部靠时冲Qi:tlSAPEk:?^ft?;.Li=lIM■:事不支,IN・阳事P14cLK1A-HBilrt.14心STMmu!-.吒LK2号IS时胖设法帛。NShMg-j^LJTWCLK”4农3”止膻Sti+ i喇g可LXStLKFUG5tL(■创口照娥*vuwaiaADC

储定■■

04,a,t基本时钟源(图中绿色箭头指出):(l)HSI高速内部时钟,RC振荡器,8MHz。(2)HSE高速外部时钟,石英/陶瓷谐振器,8MHz。(3)LSI低速内部时钟,RC振荡器,40kHz。(4)LSE低速外部时钟,RTC石英晶振,32.768kHz。(5)除了上述基本时钟源,还有③中的PLL锁相环倍频时钟源,它是将HSI和HSE倍频后输出。二、PLLCLK-PLL时钟(④)时钟来源:(1)HSI/2 (2)HSE三、SYSCLK-系统时钟(⑤)时钟来源:(1)HSI (2)PLLCLK(3)HSESYSCLK经过分频后,得至I」AHB总线时钟HCLK;HCLK再分频得到APB1总线时钟PCLK1和APB2总线时钟PCLK2;PCLK2分频后得到ADCCLK最大14MHz。四、RTCCLK(]R色框中)时钟来源:(1)HSE/128(2)LSE(3)LSI总括:STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能。系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗STM32为了低功耗,他将所有的外设时钟都设置为disable(不使能),用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是disable(不使能),这样耗能就会减少。这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因五、系统时钟配置方法系统时钟有三个来源,PLLCLK、HSE、HSI。正常情况下,时钟配置是在system_stm32f10x.c中完成,这里的的时钟配置是直接控制寄存器完成的。在stm32f10x_rcc.c中定义了关于时钟配置的库函数,此时未用。打开system_stm32f10x.c,找到UvoidSystemlnit(void),再找到SetSysClock()并查看定义,定义中可知是通过在system_stm32f10x.c中宏定义SYSCLK_FREQ_72MHz选择系统时钟配置函数SetSysClockTo72(),即72MHz的系统时钟就是在此函数中配置的,函数如下:(HSE(不分频)->PLLCLK(9倍频)->72MHz系统时钟)ST官方推荐的外接晶振是8M,所以库函数的设置都是假定你的硬件已经接了8M晶振来运算的.以上东西就是默认晶振8M的时候,推荐的CPU频率选择.在这里选择了:#define SYSCLK_FREQ_72MHz 72000000也就是103系列能跑到的最大值72M,这就是在定义了CPU跑72M的时候,各个系统的速度了他们分别是硬件频率,系统时钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了:#elifdefinedSYSCLK_FREQ_72MHzstaticvoidSetSysClockTo72(void);这就是定义72M的时候,设置时钟的函数.这个函数被SetSysClock()函数调用,而SetSysClock()函数则是被SystemInit()函数调用.最后SystemInit()函数,就是被你调用的了所以设置系统时钟的流程就是:首先用户程序调用SystemInit()函数,这是一个库函数,然后SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用SetSysClock()函数.SetSysClock()函数根据那个#defineSYSCLK_FREQ_72MHz72000000的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置…然后,CPU跑起来了,而且速度是72M,虽然说的有点累赘,但大家只需要知道用户要设置频率,程序中就做的就两个事情:第一个:system_stm32f10x.c中#defineSYSCLK_FREQ_72MHz72000000第二个:调用SystemInit()如果使用内部RC振荡器而不使用外部晶振,请按照如下方法处理:1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。2)对于少于100脚的产品,有2种接法:i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。ii)分别重映射OSC」N和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出‘0'。此方法可以减小功耗并(相对上面i)节省2个外部电阻。重要的时钟:PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2之间的关系要弄清楚;1、HSI:高速内部时钟信号stm32单片机内带的时钟(8M频率)精度较差2、HSE:高速外部时钟信号精度高来源(1)HSE外部晶体/陶瓷谐振器(晶振)(2)HSE用户外部时钟3、LSE:低速外部晶体32.768kHz主要提供一个精确的时钟源一般作为RTC时钟使用时钟配置函数源代码:staticvoidSetSysClockTo72(void){__IOuint32_tStartUpCounter=0,HSEStatus=0;*//*SYSCLK,HCLK,PCLK2andPCLK配置--*//*使能外部高速时钟HSE*/RCC->CR|=((uint32_t)RCC_CR_HSEON);/*等待HSE启动稳定,并做超时处理do{HSEStatus=RCC->CR&RCC_CR_HSERDY;StartUpCounter++;}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));if((RCC->CR&RCC_CR_HSERDY)!=RESET){HSEStatus=(uint32_t)0x01;}else{HSEStatus=(uint32_t)0x00;}if(HSEStatus==(uint32_t)0x01){/*使能Flash预存储缓冲区*/FLASH->ACR|=FLASH_ACR_PRFTBE;/*Flash2waitstate*/FLASH->ACR&=(uint32_t)((uint32_t)〜FLASH_ACR_LATENCY);FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_2;/*HCLK=SYSCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_HPRE_DIV1;/*PCLK2=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1;/*PCLK1=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV2;#ifdefSTM32F10X_CL/*ConfigurePLLs *//*PLL2configuration:PLL2CLK=(HSE/5)*8=40MHz*//*PREDIV1configuration:PREDIV1CLK=PLL2/5=8MHz*/RCC->CFGR2&=(uint32_t)~(RCC_CFGR2_PREDIV2|RCC_CFGR2_PLL2MUL|RCC_CFGR2_PREDIV1|RCC_CFGR2_PREDIV1SRC);RCC->CFGR2|=(uint32_t)(RCC_CFGR2_PREDIV2_DIV5|RCC_CFGR2_PLL2MUL8|RCC_CFGR2_PREDIV1SRC_PLL2|RCC_CFGR2_PREDIV1_DIV5);/*EnablePLL2*/RCC->CR|=RCC_CR_PLL2ON;/*WaittillPLL2isready*/while((RCC->CR&RCC_CR_PLL2RDY)==0){)/*PLLconfiguration:PLLCLK=PREDIV1*9=72MHz*/RCC->CFGR&=(uint32_t)~(RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLSRC|RCC_CFGR_PLLMULL);RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1|RCC_CFGR_PLLSRC_PREDIV1|RCC_CFGR_PLLMULL9);#else/*PLLconfiguration:PLLCLK=HSE*9=72MHz*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL));RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLSRC_HSE|RCC_CFGR_PLLMULL9);#endif/*STM32F10X_CL*//*EnablePLL*/RCC->CR|=RCC_CR_PLLON;/*WaittillPLLisready*/while((RCC->CR&RCC_CR_PLLRDY)==0){)/*SelectPLLassystemclocksource*/RCC->CFGR&=(uint32_t)((uint32_t)〜(RCC_CFGR_SW));RCC->CFGR|=(uint32_t)RCC_CFGR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论