RCC时钟配置

合集下载

STM32系统时钟RCC(基于HAL库)

STM32系统时钟RCC(基于HAL库)

STM32系统时钟RCC(基于HAL库)基础认识为什么要有时钟:时钟就是单⽚机的⼼脏,其每跳动⼀次,整个单⽚机的电路就会同步动作⼀次。

时钟的速率决定了两次动作的间隔时间。

速率越快,单⽚机在单位时间内所执⾏的动作将越多。

时钟是单⽚机运⾏的基础,时钟信号推动单⽚机内各个部分执⾏相应的指令。

时钟系统就是CPU的脉搏,决定cpu速率。

为什么这么多个时钟源:STM32系统是复杂的,⾼精度、低精度、⾼速、低速等,且可以对每个时钟源进⾏开关操作,可以把不需要使⽤的关闭掉。

这可以让单⽚机适⽤更多的环境中,把选择权利交个了开发者,开发者可以从精度、功耗、资源等多⽅⾯考虑。

STM32时钟:从时钟源的⾓度可分为:l 外部时钟(E)l 内部时钟(I)从时钟速率的⾓度分为:l ⾼速时钟(HS)l 低速时钟(LS)STM32在芯⽚复位后默认选⽤的是内部的⾼速时钟(HSI)进⾏⼯作,如果需要使⽤外部⾼速时钟(HSE)的话需要经过软件操作相关的寄存器配置。

外部时钟模式外部的⾼速和低速时钟均有这三个可选项⽬,图中是CubeMX提供的外部时钟选择:可选类型为l Disable(关闭,不使⽤外部时钟)l BYPASS Clock Source(旁路时钟源)l Crystal/Ceramic Resonator(外部晶体/陶瓷谐振器)外部晶体/陶瓷谐振器模式该模式较为常见,这可以为系统时钟提供较为精确的时钟源。

该时钟源是由外部⽆源晶体与MCU内部时钟驱动电路共同配合形成,有⼀定的启动时间,精度较⾼。

为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容必须尽可能地靠近振荡器引脚。

负载电容值必须根据所选择的晶体来具体调整。

整体上讲,陶瓷晶体和⽯英晶体的主要区别就在于精度和温度稳定性上。

⽯英晶体⽐陶瓷晶体精度要⾼,温度稳定性要好。

旁路时钟源模式该模式下必须提供外部时钟。

外部时钟信号(50%占空⽐的⽅波、正弦波或三⾓波)必须连到SOC_IN引脚,此时OSC_OUT引脚对外呈⾼阻态。

stm32基于库函数--RCC时钟配置

stm32基于库函数--RCC时钟配置

stm32基于库函数--RCC时钟配置1.时钟复位RCC_DeInit();2.开启HSERCC_HSEConfig(RCC_HSE_ON);3.选择PLL倍频HSERCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);4.设置系统时钟为PLL后的时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);5.设置系统各部分时钟/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */RCC_PCLK2Config(RCC_HCLK_Div1);/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */RCC_PCLK1Config(RCC_HCLK_Div2);6.开启功能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);7.综合示例代码void RCC_Configuration(void) {/* 定义枚举类型变量 HSEStartUpStatus */ErrorStatus HSEStartUpStatus;/* 复位系统时钟设置*/RCC_DeInit();/* 开启HSE*/RCC_HSEConfig(RCC_HSE_ON);/* 等待HSE起振并稳定*/HSEStartUpStatus = RCC_WaitForHSEStartUp();/* 判断HSE起是否振成功,是则进入if()内部 */if(HSEStartUpStatus == SUCCESS) {/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */RCC_PCLK2Config(RCC_HCLK_Div1);/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */RCC_PCLK1Config(RCC_HCLK_Div2);/* 设置FLASH延时周期数为2 */FLASH_SetLatency(FLASH_Latency_2);/* 使能FLASH预取缓存 */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* 使能PLL */RCC_PLLCmd(ENABLE);/* 等待PLL输出稳定 */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);/* 选择SYSCLK时钟源为PLL */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待PLL成为SYSCLK时钟源 */while(RCC_GetSYSCLKSource() != 0x08); }/* 打开APB2总线上的GPIOA时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_AP B2Periph_USART1, ENABLE);}2018-7-15 11:41:46 meetwit。

STM32F0系列寄存器操作02RCC时钟配置

STM32F0系列寄存器操作02RCC时钟配置

STM32F0系列寄存器操作02RCC时钟配置对于STM32F0系列的RCC时钟配置,以下是一个超过1200字的例子:RCC(Reset and Clock Control)是用于配置和控制STM32F0系列微控制器的时钟的模块。

时钟系统对于微控制器的运行非常重要,因为它影响到系统的性能、功耗和稳定性。

在使用STM32F0系列微控制器时,首先需要配置RCC模块的寄存器,以确定各种时钟源的频率、分频系数和使能状态。

以下是配置RCC模块的步骤:1.选择系统时钟源:RCC_CFGR寄存器用于选择系统时钟源。

主要的时钟源有内部高速时钟HSI(高速内部),外部晶体时钟HSE(高速外部),外部低速时钟LSI(低速内部)和外部低速时钟LSE(低速外部)。

可以使用RCC_CFGR寄存器的SW位域来选择时钟源。

2.设置时钟频率和分频系数:根据应用的需求,可以设置时钟的频率和分频系数。

RCC_CFGR寄存器的HPRE、PPRE、和PLLMUL位域用于设置时钟的分频系数。

同时,还可以使用RCC_CFGR2和RCC_CFGR3寄存器来设置PLL(锁相环)的输入时钟和分频因子。

3.使能时钟源:RCC_APB2ENR、RCC_APB1ENR和RCC_AHBENR寄存器用于使能各个外设的时钟源。

可以使用这些寄存器的位域来控制外设时钟的使能状态。

4.时钟安全配置:RCC_CFGR寄存器的MCO和MCOPRE位域用于配置主要时钟输出的时钟安全特性。

可以设置MCO和MCOPRE位域来输出主时钟信号、内部时钟信号或外部时钟信号。

配置完毕后,需要等待时钟系统配置完成。

通过读取RCC_CFGR寄存器的SWS位域,可以确保时钟系统配置已经生效。

一旦配置完成后,系统将按照配置的时钟源和频率来运行。

在使用STM32F0系列微控制器时,正确配置RCC时钟是非常重要的。

这样可以确保系统的稳定性、性能和功耗都能达到预期的要求。

通过操作RCC模块的相关寄存器,可以实现对时钟源和频率的灵活配置,以满足不同应用的需求。

STM32 RCC复位时钟配置寄存器

STM32   RCC复位时钟配置寄存器

RCCSTM32 的RCC看起来还是蛮复杂的,英文全称是Reset Clock Config,复位时钟配置,以下基本网上贴的,整理了一下,非原创哈。

一、时钟概述STM32有多个时钟源,分别是:HSI: 内部高速时钟(上电默认启动),因精度不高所以先不采用,以后如果需要再使用LSI:内部低速时钟,精度不高,一般用于IWDGCLKHSE:外部高速时钟,系统时钟一般采用它,经过PLL倍频作为系统同时钟LSE:外部低速时钟,一般专门用于RTC,等到RTC模块时再使用二、配置流程1.将RCC寄存器重新设置为默认值RCC_DeInit(default 默认)2.打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3.等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();4.设置AHB时钟RCC_HCLKConfig;5.设置高速APB2时钟 RCC_PCLK2Config;6.设置低速速APB1时钟RCC_PCLK1Config7.设置PLL RCC_PLLConfig8.打开PLL RCC_PLLCmd(ENABLE);9.等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)10.设置系统时钟RCC_SYSCLKConfig11.判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)至此系统时钟已经配置完成,STM32的每个模块都有自己的时钟,如果要使用某个模块,必须使能这个模块的时钟。

使能对应模块的时钟,STM32有个库函数,RCC_APB2PeriphClockCmd(对应模块,ENABLE)(72MHZ)或者RCC_APB1PeriphClockCmd(对应模块,ENABLE)(36MHZ);其中不同的模块有不同的时钟源,下面列举各个模块的时钟源:AHB2 时钟用于以下资源:(APB2:72MHZ)RCC_APB2Periph_AFIO 功能复用 IO 时钟RCC_APB2Periph_GPIOA GPIOA 时钟RCC_APB2Periph_GPIOB GPIOB 时钟RCC_APB2Periph_GPIOC GPIOC 时钟RCC_APB2Periph_GPIOD GPIOD 时钟RCC_APB2Periph_GPIOE GPIOE 时钟RCC_APB2Periph_ADC1 ADC1 时钟RCC_APB2Periph_ADC2 ADC2 时钟RCC_APB2Periph_TIM1 TIM1 时钟RCC_APB2Periph_SPI1 SPI1 时钟RCC_APB2Periph_USART1 USART1 时钟RCC_APB2Periph_ALL 全部 APB2外设时钟AHB1 时钟用于以下资源:(APB1:36MHZ)RCC_APB1Periph_TIM2 TIM2 时钟RCC_APB1Periph_TIM3 TIM3 时钟RCC_APB1Periph_TIM4 TIM4 时钟RCC_APB1Periph_WWDG WWDG时钟RCC_APB1Periph_SPI2 SPI2 时钟RCC_APB1Periph_USART2 USART2 时钟RCC_APB1Periph_USART3 USART3 时钟RCC_APB1Periph_I2C1 I2C1 时钟RCC_APB1Periph_I2C2 I2C2时钟RCC_APB1Periph_USB USB 时钟RCC_APB1Periph_CAN CAN时钟RTC 时钟来源:RCC_RTCCLKSource_LSE 选择 LSE 作为RTC 时钟RCC_RTCCLKSource_LSI 选择 LSI 作为RTC 时钟RCC_RTCCLKSource_HSE_Div128 选择 HSE 时钟频率除以 128 作为 RTC时钟ADC 时钟来源:该时钟源自 APB2 时钟(PCLK2)RCC_PCLK2_Div2 ADC 时钟= PCLK / 2RCC_PCLK2_Div4 ADC 时钟= PCLK / 4RCC_PCLK2_Div6 ADC 时钟= PCLK / 6RCC_PCLK2_Div8 ADC 时钟= PCLK / 8USB 时钟来源:该时钟来源于PLLCLK时钟的预分频三、RCC配置实例代码,与解析void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;RCC_DeInit();//复位RCC模块的寄存器,复位成缺省值RCC_HSEConfig(RCC_HSE_ON);//开启HSE时钟,咱是用HSE的时钟作为PLL的时钟源HSEStartUpStatus = RCC_WaitForHSEStartUp();//获取HSE启动状态if(HSEStartUpStatus == SUCCESS) //如果HSE启动成功{FLASH_PrefetchBufferCmd(ENABLE);//开启FLASH的预取功能FLASH_SetLatency(FLASH_Latency_2);//FLASH延迟2个周期,RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置HCLK,PCLK2,PCLK1,PLLRCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);RCC_PLLCmd(ENABLE);//启动PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//等待PLL启动完成RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟while(RCC_GetSYSCLKSource() !=0x80)//检查是否将HSE 9倍频后作为系统时钟{}}}和STM32超频比较相关,Ourdev上有个超频的帖蛮有意思的有兴趣的可以看看,附上网址:/bbs/bbs_content_all.jsp?bbs_sn=3554410总之,STM32的时钟看起来比较复杂,但是可以不用去深究,使用STM32的库函数还是很好用的,虽然效率低了点,但是其实只使用很少的次数,无所谓了,要想STM32跑起来,按照上述配置就好了,千万不要忘记为使用的模块分配时钟,不要像我,跑个LED,忘记给IO分配时钟,还在纳闷呢,为什么不亮.(摘自网络).总结:我比这位原作者好点,我第一次让STM32跑两个灯一下就顺利了.就是第一次KEIL联不上STM32有点郁闷,在网上升级了,STLINK还是不行.后来得知,原来STLINK升级版本好几个了,找了新的版本总算跟4.12联上了.我的STLINK版本号J1STM32有五个时钟源:HSI、HSE、LSI、LSE、PLL1.1HSI:高速内部时钟、RC振荡器、频率为8MHz、时钟精度较差(上电默认启动),可作为备用时钟源(时钟安全系统CSS)。

单片机rcc的介绍

单片机rcc的介绍

单片机rcc的介绍
单片机中的RCC(Reset and Clock Control)模块是用于控制
系统时钟和复位的重要模块。

它通常包括时钟源选择、时钟频率控制、复位控制等功能。

首先,RCC模块负责选择单片机的时钟源。

单片机通常具有多
个时钟源,例如内部振荡器、外部晶体振荡器、PLL(锁相环)等。

RCC模块允许开发人员选择适合应用需求的时钟源,并配置时钟源
的频率。

其次,RCC模块也负责配置时钟的分频和倍频。

通过RCC模块,开发人员可以对时钟频率进行调节,以满足不同外设的时钟要求,
同时也可以降低功耗或者提高性能。

此外,RCC模块还负责控制系统的复位。

它包括对系统的软件
复位和外部复位的控制,确保系统在启动时处于可靠的状态。

总的来说,RCC模块在单片机中扮演着控制系统时钟和复位的
重要角色,通过对时钟源的选择和时钟频率的配置,以及对系统复
位的控制,确保单片机系统的稳定运行和可靠性。

除了以上介绍的功能,RCC模块还可能包括一些其他特定单片机厂商提供的特色功能,例如低功耗模式控制、时钟输出控制等。

在实际应用中,开发人员需要根据具体的单片机型号和厂商提供的技术文档来详细了解RCC模块的具体功能和使用方法,以便充分发挥其作用。

RCC时钟模块外设的详细分析和理解的资料概述

RCC时钟模块外设的详细分析和理解的资料概述

RCC 时钟模块外设的详细分析和理解的资料概述
RCC 时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识。

但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的基础之一,可以说是M3 芯片的心脏。

初学者理解是比较困难,但是掌握清晰对于嵌入式操作系统特别是Timer 定时器以及通讯领域具有重大意义。

下面进入正题,先上一张RCC 模块的结构图:
初看此图是不是感觉太复杂了,事实上我第一次看这张图的时候也是的,完全理不清结构,不过不用担心,下面我就分层带你来理解这幅图。

(1)时钟源(4 个晶振源,1 个中介源)
HSI(RC):内部高速晶振,~8MHz
HSE(Osc):外部高速晶振(与电路设计时选择有关,25MHz)。

RCC寄存器

RCC寄存器

时钟控制寄存器(RCC_CR)偏移地址: 0x00复位值: 0x000 XX83,X代表未定义访问: 无等待状态, 字, 半字和字节访问时钟配置寄存器(RCC_CFGR)偏移地址: 0x04复位值: 0x0000 0000访问: 0到2个等待周期,字,半字和字节访问只有当访问发生在时钟切换时,才会插入1或2个等待周期。

时钟中断寄存器(RCC_CIR)偏移地址: 0x08 复位值: 0x0000 0000访问:无等待周期, 字, 半字和字节访问APB2外设复位寄存器(RCC_APB2RSTR)偏移地址: 0x0C 复位值: 0x0000 0000访问:无等待周期, 字, 半字和字节访问APB1外设复位寄存器(RCC_APB1RSTR)偏移地址:0x10 复位值:0x0000 0000访问:无等待周期,字,半字和字节访问AHB外设时钟使能寄存器(RCC_AHBENR)偏移地址:0x14 复位值:0x0000 0014访问:无等待周期, 字, 半字和字节访问APB2外设时钟使能寄存器(RCC_APB2ENR)偏移地址:0x18 复位值:0x0000 0000访问:字,半字和字节访问通常无访问等待周期。

但在APB2总线上的外设被访问时,将插入等待状态直到APB2的外设访问结束。

APB1外设时钟使能寄存器(RCC_APB1ENR)偏移地址:0x1C 复位值:0x0000 0000访问:字、半字和字节访问通常无访问等待周期。

但在APB1总线上的外设被访问时,将插入等待状态直到APB1外设访问结束。

备份域控制寄存器(RCC_BDCR)偏移地址:0x20 复位值:0x0000 0000,只能由备份域复位有效复位访问:0到3等待周期,字、半字和字节访问当连续对该寄存器进行访问时,将插入等待状态。

控制/状态寄存器(RCC_CSR)偏移地址:0x24 复位值:0x0C00 0000,除复位标志外由系统复位清除,复位标志只能由电源复位清除。

STM32RCC分析与使用

STM32RCC分析与使用

STM32RCC分析与使用STM32系列微控制器是意法半导体公司(STMicroelectronics)推出的一款32位嵌入式微控制器,广泛应用于各种各样的嵌入式应用中。

在STM32中,RCC(Reset and Clock Control)模块是用来控制系统复位和时钟的重要模块。

下面将对RCC模块进行分析与使用。

首先,RCC模块的主要功能是对系统时钟进行控制和配置。

在STM32中,系统时钟用于驱动处理器和外设,因此RCC模块的配置对整个系统的性能和功能都有着重要的影响。

RCC模块提供了多个时钟源和分频器来满足不同需求。

RCC模块主要包括以下功能:1.时钟源选择:RCC可以选择多个时钟源,包括内部和外部时钟源。

常见的时钟源包括内部高速时钟(HSI)、内部低速时钟(LSI)、外部高速时钟(HSE)和外部低速时钟(LSE)等。

通过选择不同的时钟源,可以满足不同的功耗和精度要求。

2.时钟分频:RCC模块提供了多个分频器,可以对系统时钟进行分频,以得到所需的时钟频率。

可以通过调整分频系数来满足不同的应用需求,例如减小系统时钟频率以降低功耗。

3.时钟输出:RCC模块还可以将系统时钟输出到特定的管脚,以供其他外设使用。

这对于一些需要同步时钟的应用非常有用。

在使用RCC模块时,一般需要进行以下几个步骤:1.使能对应的时钟源:根据实际需求选择合适的时钟源,并使能该时钟源。

对于外部时钟源,还需要设置相关的参数,如频率和稳定性。

2.配置时钟分频器:根据应用需求配置时钟分频器,以得到所需的时钟频率。

通常可以通过寄存器设置来完成。

3.选择系统时钟源:根据实际需求选择合适的系统时钟源。

一般可以选择内部高速时钟(HSI)、内部低速时钟(LSI)、外部高速时钟(HSE)或外部低速时钟(LSE)作为系统时钟源。

4.配置系统时钟分频器:根据应用需求配置系统时钟分频器,以得到所需的系统时钟频率。

通常可以通过寄存器设置来完成。

5.配置时钟输出:如果需要将系统时钟输出到特定的管脚,可以通过设置相应的寄存器来完成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时钟配置RCC_Configuration()
在比较靠前的版本中,我们需要向下面那样设置时钟:
ErrorStatus HSEStartUpStatus;
/*********************************************************************** ***************
* FunctionName : RCC_Configuration()
* Description : 时钟配置
* EntryParameter : None
* ReturnValue : None
************************************************************************ **************/
void RCC_Configuration(void)
{
/* 复位所有的RCC外围设备寄存器,不改变内部高速振荡器调整位(HSITRIM[4..0])以及
备份域控制寄存器(RCC_BDCR),控制状态寄存器RCC_CSR */
RCC_DeInit(); // RCC system reset(for debug purpose)
/* 开启HSE振荡器*/
/* 三个参数: RCC_HSE_ON-开启RCC_HSE_OFF-关闭RCC_HSE_BYPASS-使用外部时钟振荡器*/
RCC_HSEConfig(RCC_HSE_ON); // Enable HSE
/* HSEStartUpStatus为枚举类型变量,2种取值,0为ERROR,非0为SUCCESS 等待HSE准备好,若超时时间到则退出*/
HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready
if (HSEStartUpStatus == SUCCESS) // 当HSE准备完毕切振荡稳定后
{
/* 配置AHB时钟,这个时钟从SYSCLK分频而来分频系数有1,2,4,8,16,64,128,256,512 */
RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK
/* 设置低速APB2时钟,这个时钟从AHB时钟分频而来分频系数为1,2,4,8,16 */ RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
/* 设置低速APB1时钟,这个时钟从AHB时钟分频而来分频系数为1,2,4,8,16 */ RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2
FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch Buffer
/* 设置PLL的时钟源和乘法因子
第一个入口参数为时钟源,共有3个
RCC_PLLSource_HSI_Div2
RCC_PLLSource_HSE_Div1
RCC_PLLSource_HSE_Div2
乘法因子RCC_PLLMul_2~RCC_PLLMul_16,之间参数连续*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLLCLK = 8MHz * 9 = 72 MHz
/* 输入参数为ENABLE及DISABLE */
RCC_PLLCmd(ENABLE); // Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
; // Wait till PLL is ready
}
/* 选择系统时钟源,三个参数
RCC_SYSCLKSource_HSI 内部高速振荡器
RCC_SYSCLKSource_HSE 外部高速振荡器
RCC_SYSCLKSource_PLLCLK PLL时钟*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source
/* 返回系统当前的时钟源,返回值有3种
0x00 HSI是当前时钟源
0x04 HSE是当前时钟源
0x08 PLL是当前时钟源
*/
while (RCC_GetSYSCLKSource() != 0x08) // Wait till PLL is used as system clock source
{
;
}
}
}
随之函数库的不断升级,到3.0以上时,我们就不用再这样编写时钟设置了,我们只要做如下两部即可:
第一个: system_stm32f10x.c 中#define SYSCLK_FREQ_72MHz 72000000
第二个:调用SystemInit()
说明:在stm32固件库3.0中对时钟频率的选择进行了大大的简化,原先的一大堆操作都在后台进行。

系统给出的函数为SystemInit()。

但在调用前还需要进行一些宏定义的设置,具体的设置在system_stm32f10x.c文件中。

文件开头就有一个这样的定义:
//#define SYSCLK_FREQ_HSE HSE_Value
//#define SYSCLK_FREQ_20MHz 20000000
//#define SYSCLK_FREQ_36MHz 36000000
//#define SYSCLK_FREQ_48MHz 48000000
//#define SYSCLK_FREQ_56MHz 56000000
#define SYSCLK_FREQ_72MHz 72000000
ST 官方推荐的外接晶振是8M,所以库函数的设置都是假定你的硬件已经接了8M 晶振来运算的.以上东西就是默认晶振8M 的时候,推荐的CPU 频率选择.在这里选择了:#define SYSCLK_FREQ_72MHz 72000000
也就是103系列能跑到的最大值72M
然后这个C文件继续往下看
#elif defined SYSCLK_FREQ_72MHz
const uint32_t SystemFrequency = SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_SysClk = SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_AHBClk = SYSCLK_FREQ_72MHz;
const uint32_t SystemFrequency_APB1Clk = (SYSCLK_FREQ_72MHz/2);
const uint32_t SystemFrequency_APB2Clk = SYSCLK_FREQ_72MHz;
这就是在定义了CPU跑72M的时候,各个系统的速度了.他们分别是:硬件频率,系统时钟,AHB总线频率,APB1总线频率,APB2总线频率.再往下看,看到这个了:
#elif defined SYSCLK_FREQ_72MHz
static void SetSysClockTo72(void);
这就是定义72M 的时候,设置时钟的函数.这个函数被SetSysClock ()函数调用,而SetSysClock ()函数则是被SystemInit()函数调用.最后SystemInit()函数,就是被你调用的了。

所以设置系统时钟的流程就是: 首先用户程序调用SystemInit()函数,这是一个库函数,然后SystemInit()函数里面,进行了一些寄存器必要的初始化后,就调用SetSysClock()函数. SetSysClock()函数根据那个#define SYSCLK_FREQ_72MHz 72000000 的宏定义,知道了要调用SetSysClockTo72()这个函数,于是,就一堆麻烦而复杂的设置~!@#$%^然后,CPU跑起来了,而且速度是72M.。

相关文档
最新文档