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

个时钟配置寄存器RCCCFGR

个时钟配置寄存器RCCCFGR

电源方案
齐纳二极管微型集成模块,用于帮助 保护敏感电器因感应式尖峰电压、瞬 间电压、错误供电和反向偏压导致的 危害
电源选择 跳线
EMI滤波器,抑制工 频干扰
电压模块, 3.3V,1.5A
电源方案
数字电 源
数字电源与模拟电源分离,采 用电感或磁珠构成无源滤波, 抑制数字电路中的高频
ADC用模拟 电源
每个电源引脚应该并联去耦 合的滤波陶瓷电容C(100nF) 和钽电容C(10μF)。这些电 容应该尽可能的靠近电源/地 引脚
一般来说:VCC=模拟电源, VDD=数字电源, VSS=数字地 VEE=负电源
电源方案
复位
• 复位目的:将系统强制定位在一个可知状 态
• 要求:准确,可靠 • STM32集成了一个上电复位(POR)和掉电
启动配置
通过设置选择管脚,对应到各 种启动模式的不同物理地址将被 映像到第0块,在经过启动延迟后, CPU从位于0000_0000h开始的启 动存储区执行代码
时钟
AMBA总线
片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广 大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结 构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总 线和APB(Advanced Peripheral Bus)外围总线。二者分别适用于高速与相 对低速设备的连接。
HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
时钟
三种不同的时钟源可被用来驱动系统时钟 (SYSCLK): ������ HSI 振荡器时钟 ������ HSE 振荡器时钟 ������ PLL 时钟

【原创】stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM

【原创】stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM

Delay(1000);
*/
if (LED_Flag != 1)
{
GPIO_SetBits(GPIOG, GPIO_Pin_6);
//setbits 使能 IO,当前下指输出(此时为灭)
}
else
{
GPIO_ResetBits(GPIOG, GPIO_Pin_6); //Resetbits 屏蔽 IO,当前下指不输出(此时为亮)
/*SystemCoreClock / 1000时基为1ms*/
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
while (1)
{
/*产生一个软件中断
EXTI_GenerateSWInterrupt(EXTI_Line0);
//配置 PLL 前应先关闭主 PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择 PLL 时钟为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK(AHB)时钟为系统时钟1分频
RCC_PCLK1Config(RCC_HCLK_Div4); //PCLK1(APB1)时钟为 HCLK 时钟8分频,则 TIM2时钟为 HCLK 时钟4分频
2012-04-29 17:31:38| 分类: stm32 |字号大中小 订阅
小枣年糕
之前我已经发过了关于 TIM2的 PWM,但是没有自己配置 RCC 时钟,用到的系统时钟、HCLK、PCLK1与 PCLK2都是系统启动代码里默认设置 的,但是由于应用场合不同,默认的设置可能不满足用户需要,这时便需要手动配置。还是同样的问题,M4的资料太少,我只能参考函数的英文 说明(我已经习惯看英文了,呵呵)来自己配置,不敢独享,现分享如下:

STM32复位和时钟控制(RCC)

STM32复位和时钟控制(RCC)

STM32复位和时钟控制(RCC)复位STM32F10xxx支持三种复位形式,分别为系统复位、电源复位和备份区域复位。

1、系统复位系统复位将所有寄存器设置成复位值,除了RCC_CSR(控制状态寄存器)中的相关复位标志位,通过查看RCC_CSR寄存器,可以识别复位源。

系统复位可由以下5种方式产生:1)外部引脚NRST复位(低电平触发);2)窗口看门狗(WWDG)计数终止3)独立看门狗(IDOG)计数终止4)软件复位(SW RESET),通过将中断应用和复位控制寄存器(Application Interrupt and Reset Control Register )中SYSRESETREQ位置1。

具体参考Cortex-M3 programming manual。

5)低功耗管理复位:①通过进入等待模式(StandBy)产生复位:通过User Option Bytes中设置nRST_STDBY位使能这种复位模式。

这时,即使执行了进入待机模式的过程,系统将被复位而不是进入待机模式。

②通过进入停止模式(STOP)产生复位:通过User Option Bytes中设置nRST_STOP位使能这种复位模式。

这时,即使执行了进入停止模式的过程,系统将被复位而不是进入停止模式。

2、电源复位电源复位设置所有寄存器置初始值,除了备份区域。

电源复位可由以下2种方式产生:1)上电复位和掉电复位(POR/PDR reset)2)退出等待(StandBy)模式这些复位源都作用在NRST引脚上,并且在复位延迟期间保持低电平。

提供给设备的系统复位信号都由NRST引脚输出,对每一个内部/外部复位源,脉冲发生器都将保证一个20us最小复位周期。

对于外部复位,当NRST位置低时,将产生复位信号。

3、备份区复位备份区复位仅仅影响被分区域,有以下两种产生方式:1)软件复位,设置备份区域控制寄存器RCC_BDCR BDRST= 1;2)在V DD和V BAT两者掉电的前提下,V DD或V BAT上电。

STM32F407-RCC配置

STM32F407-RCC配置

RCC (Reset and Clock Control)配置这里介绍RCC 的时钟控制功能在STM32F103上,由于小组所有的板子都使用用同样的芯片,同样的晶振,以及同样的库函数,即使我们不去理解RCC,仍然可以将大多数功能调试出来。

但如果使用不同型号的芯片,例如用STM32F407 与STM32103 进行通信,如果不去弄清楚RCC,在调试中可能会遇到麻烦。

下面就我调试STM32F407的这段时间,介绍一下RCC的部分功能。

文档的前半部分是关于RCC的部分功能描述,后半部分是关于库函数的使用。

时钟结构(原图请参考STM32F407 参考手册RCC部分)STM32F407最高层是SYSCLK系统时钟,由其生成了AHB时钟,再由AHB时钟生成APB时钟。

SYSCLK系统时钟可以由3个基本的时钟源获得:HSE(外部高速晶振)或HSI(内部高速晶振)或PLL锁相环倍频。

例如:板子上焊了8MHz的晶振,则HSE = 8MHz。

如果焊了25MHz的,则HSE = 25MHz。

HSI是芯片内部自带的晶振,其大小由芯片型号决定,如STM32F407的HSI是16MHz。

PLL倍频的功能是:将HSE或HSI的频率放大,最大可以放大到168MHz.SYSCLK系统时钟可以由HSE/HSI/PLL提供。

例如使用库函数:RCC_SYSCLKConfig( RCC_SYSCLKSource_HSE);代表用HSE外部高速晶振作为系统时钟源。

如果HSE =8MHz,则SYSCLK = 8M,即STM32F407就会运行在8M的速度;如果HSE=25M,则SYSCLK = 25M,即STM32F407就会运行在25M。

RCC_SYSCLKConfig( RCC_SYSCLKSource_HSI );代表用HSI内部高速晶振作为系统时钟源,如果HSI=16M,则SYSCLK=16M,即STM32F407 就会运行在16M的速度。

rcc_configuration详细讲解

rcc_configuration详细讲解

rcc_configuration详细讲解### RCC配置(RCC Configuration)详细讲解本文旨在深入解析RCC(Reset and Clock Control)配置的相关概念,为嵌入式系统开发者提供详尽的指南。

RCC模块在基于ARM Cortex-M的微控制器中扮演着至关重要的角色,它负责管理系统的时钟和复位功能。

#### 一、RCC的基本概念RCC,即复位与时钟控制,是微控制器中用来配置系统时钟树和执行复位操作的硬件单元。

通过合理配置RCC,可以优化系统的功耗和性能。

#### 二、RCC的主要功能1.**时钟源选择**:RCC可以配置不同的时钟源,如内部振荡器(HSI, HSE, MSI等),外部振荡器,以及PLL(Phase Locked Loop)。

2.**时钟分频和倍频**:通过配置RCC,可以对时钟信号进行分频或倍频,以适配不同的外设和系统需求。

3.**时钟树管理**:RCC负责向各个外设提供时钟信号,开发者可以独立地开启或关闭这些时钟。

4.**复位功能**:RCC可以触发软件或硬件复位,对系统或外设进行重置。

#### 三、RCC配置步骤1.**配置时钟源**:- 选择主时钟源(通常是HSE或HSI)。

- 如果需要,配置PLL,设定倍频因子和分频因子。

2.**配置时钟分频**:- AHB(Advanced High-performance Bus)时钟分频。

- APB(Advanced Peripheral Bus)时钟分频。

3.**配置外设时钟**:- 根据需求开启或关闭特定外设的时钟。

4.**配置时钟安全监测**:- 如果系统支持,配置时钟监测功能,以确保时钟源的稳定性。

5.**软件复位**:- 通过RCC触发软件复位,对特定的外设或系统进行重置。

#### 四、RCC配置示例以下是一个简单的RCC配置示例,假设使用STM32微控制器:```c// 开启外部高速时钟(HSE)RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;HAL_RCC_OscConfig(&RCC_OscInitStruct);// 配置时钟分频HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);// 开启外设时钟__HAL_RCC_GPIOA_CLK_ENABLE();// ...其他外设时钟```#### 五、注意事项- 在配置RCC时,要确保时钟配置符合硬件设计要求。

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤

STM32单片机RTC时钟的使用方法及步骤一、配置RTC模块时钟源RTC模块的时钟源可以选择外部低速晶振(LSE)或者低速内部时钟(LSI)。

通过以下步骤配置RTC时钟源:1.使能外部低速晶振(LSE)或者低速内部时钟(LSI)。

例如,如果使用外部低速晶振,则需要使能相应的GPIO端口,并配置为晶振模式。

2.配置RCC时钟控制寄存器(RCC_CR)和时钟配置寄存器(RCC_CSR)。

二、使能RTC模块时钟1.使能PWR模块时钟和备份寄存器访问。

RCC_APB1ENR,=(1<<28);RCC_APB1ENR,=(1<<27);2.校验并关闭RTC模块。

RCC->BDCR,=RCC_BDCR_RTCEN;PWR->CR,=PWR_CR_DBP;if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0)RCC->BDCR,=RCC_BDCR_RTCEN;3.配置RTC时钟预分频器和提供给RTC的时钟源。

RTC->PRER ,= rtc_prescaler_value << RTC_PRER_PREDIV_S_Pos;RTC->PRER ,= 127 << RTC_PRER_PREDIV_A_Pos;RTC->CR&=~RTC_CR_FMT;三、配置RTC模块时间和日期1.关闭RTC时钟写保护功能。

RTC->WPR=0xCA;RTC->WPR=0x53;RTC->ISR,=RTC_ISR_INIT;while((RTC->ISR & RTC_ISR_INITF) == 0);2.配置RTC的时间和日期寄存器。

RTC->TR ,= (uint32_t)((hours / 10) << RTC_TR_Hours10_Pos);RTC->TR ,= (uint32_t)((hours % 10) << RTC_TR_Hours1_Pos);RTC->TR ,= (uint32_t)((minutes / 10) <<RTC_TR_Minutes10_Pos);RTC->TR ,= (uint32_t)((minutes % 10) <<RTC_TR_Minutes1_Pos);RTC->TR ,= (uint32_t)((seconds / 10) <<RTC_TR_Seconds10_Pos);RTC->TR ,= (uint32_t)((seconds % 10) <<RTC_TR_Seconds1_Pos);RTC->DR ,= (uint32_t)((year / 10) << RTC_DR_YT_Pos);RTC->DR ,= (uint32_t)((year % 10) << RTC_DR_YU_Pos);RTC->DR ,= (uint32_t)((month / 10) << RTC_DR_MT_Pos);RTC->DR ,= (uint32_t)((month % 10) << RTC_DR_MU_Pos);RTC->DR ,= (uint32_t)((day / 10) << RTC_DR_DT_Pos);RTC->DR ,= (uint32_t)((day % 10) << RTC_DR_DU_Pos);3.开启RTC时钟写保护功能。

STM32学习之RCC时钟配置

STM32学习之RCC时钟配置

STM32学习之RCC时钟配置STM32学习之RCC时钟配置STM32有多个时钟源,分别是HSI:高速内部时钟,RC振荡器,频率为8MHz。

上电默认启动,因精度不高所以先不采用,以后如果需要再使用。

HSE:外部高速时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

系统时钟一般采用它,经过PLL倍频作为系统同时钟。

LSE:外部低速时钟,接频率为32.768kHz的石英晶体。

一般专门用于RTC,等到RTC模块时再使用LSI:内部低速时钟,RC振荡器,频率为40kHz。

精度不高,一般用于IWDGCLK。

PLL:锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

时钟系统框图如下:用户可通过多个预分频器配置AHB总线、高速APB2总线和低速APB1总线的频率。

AHB 和APB2域的最大频率是72MHZ。

APB1域的最大允许频率是36MHZ。

SDIO接口的时钟频率固定为HCLK/2。

40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。

另外,STM32还可以选择一个PLL输出的2分频、HSI、HSE、或者系统时钟SYSCLK 输出到MCO脚(PA8)上。

系统时钟SYSCLK,是供STM32中绝大部分部件工作的时钟。

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

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

STM32F0系列寄存器操作02RCC时钟配置RCC(Reset and Clock Control)模块是STM32F0系列微控制器中的一个重要模块,用于配置系统时钟。

在这里,我们将详细介绍如何通过寄存器操作来配置RCC模块。

RCC模块的寄存器位于设备的的地址空间中,通过写入特定的值来配置和控制系统时钟。

以下是与RCC模块相关的一些重要寄存器:1. RCC_CR(RCC Control Register):用于配置内部和外部时钟、使能外部时钟和使能内部时钟等。

2. RCC_CFGR(RCC Configuration Register):用于配置系统时钟源、时钟分频等。

3. RCC_AHBENR(RCC AHB Peripheral Clock Enable Register):用于使能或禁用AHB总线上的外设时钟。

4. RCC_APBENR(RCC APB Peripheral Clock Enable Register):用于使能或禁用APB总线上的外设时钟。

根据需求,我们可以按照以下步骤配置RCC模块:1.确定系统时钟源:使用RCC_CFGR寄存器来选择主时钟源,可以从内部时钟(HSI或HSI48)、外部时钟(HSE或HSE32)或PLL时钟中选择。

2.配置时钟分频:使用RCC_CFGR寄存器来设置HCLK、PCLK1和PCLK2的分频系数,以确定这些时钟频率。

3.使能外设时钟:使用RCC_AHBENR和RCC_APBENR寄存器来使能或禁用需要使用的外设时钟。

下面是一个示例代码,用于配置STM32F0系列微控制器的RCC模块:```c#include "stm32f0xx.h"void RCC_Config(void)//使能外部时钟RCC->CR,=RCC_CR_HSEON;//等待外部时钟稳定while(!(RCC->CR & RCC_CR_HSERDY));//配置PLL时钟RCC->CFGR,=RCC_CFGR_PLLSRC_HSE_PREDIV;RCC->CFGR,=RCC_CFGR_PLLMUL6;//使能PLL时钟RCC->CR,=RCC_CR_PLLON;//等待PLL时钟稳定while(!(RCC->CR & RCC_CR_PLLRDY));//配置系统时钟源为PLL时钟RCC->CFGR,=RCC_CFGR_SW_PLL;//等待系统时钟源切换完成while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);//配置时钟分频RCC->CFGR,=RCC_CFGR_HPRE_DIV1;//AHB时钟不分频RCC->CFGR,=RCC_CFGR_PPRE_DIV2;//APB1时钟分频为2//使能外设时钟RCC->AHBENR,=RCC_AHBENR_GPIOAEN;RCC->APBENR,=RCC_APBENR_TIM2EN;```在这个示例中,首先使能外部时钟(HSE)并等待其稳定,然后配置PLL时钟和分频系数。

2-GPIO口和RCC时钟

2-GPIO口和RCC时钟

《WHUT stm32学习笔记》Two: GPIO&RCC时钟By- Whut SomeOne 一. GPIO口首先在stm32f10x_conf.h中取消对stm32f10x_gpio.h 和 stm32f10x_rcc.h的注释.然后在我们新建的.c文件中,写一个驱动GPIO的函数,以驱动流水灯为例:初看这个函数,信息量有点大,所以各个击破之~1.先不急看第一句话,我们看看第二句,也就是通过调用库函数,来开启GPIO外设时钟的过程。

显然,RCC_APB2PeriphClockCmd()是一个库函数,详情可以看库函数定义,此处我们只用知道第一个参数代表外设的选择,第二个参数代表是否开启即可。

2.再来看看第一句话,此处定义了一个GPIO_InitTypeDef类型的结构体,名为GPIO_InitStructure。

我们马上跟踪去看看什么是GPIO_InitTypeDef结构体。

在stm32f10x_gpio.h文件中,有这样的定义这个结构体中包含了3个成员,分别代表GPIO引脚选择,引脚模式,引脚模式和频率。

其中GPIO_Pin可以赋值为这样的宏:GPIO_Pin成员变量被赋予哪个值,就代表选中了对应端口的哪个引脚。

此时一下子又多出2个宏定义,继续追踪GPIOSpeed_TypeDef和GPIOSpeed_TypeDef.找到定义如下:也就是说,成员GPIO_Speed和GPIO_Mode 是一个枚举类变量,当被赋予对应的值时,就代表选定了对应的模式和速率。

说了这么多,这个GPIO_InitTypeDef类型的结构体变量GPIO_InitStructure 现在还不能发挥其作用,为什么呢?因为我们只是定义了这样一个结构体,并且设置了它的成员的值,但是并不代表我们stm32上的GPIO口就真的设置成了对应的模式和速率,我们还需要把GPIO_InitStructure这个结构体带入ST的库函数去驱动端口才行!看看驱动函数中,配置完GPIO_InitTypeDef成员参数后,有个GPIO_Init()函数的调用;那么这个GPIO_Init()就是一个库函数了,同样,我们刚刚接触时也只用了解这个库函数的接口,也称作API。

RCC时钟配置(编程)

RCC时钟配置(编程)

RCC时钟配置(编程)SYSCLK 系统时钟,最大72MHzHCLK :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟经过总线桥AHB--APB,通过设置分频,可由HCLK得到PCLK1与PCLK2时钟不过PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。

PCLK2对应APB2外设。

PCLK1对应APB1外设。

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。

2)对于少于100脚的产品,有2种接法:2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。

此方法可提高EMC性能。

2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD 1为推挽输出并输出'0'。

此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。

使用HSE时钟,程序设置时钟参数流程:1、将RCC寄存器重新设置为默认值RCC_DeInit;2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON);3、等待外部高速时钟晶振工作HSEStartUpStatus =RCC_WaitForHSEStartUp();4、设置AHB时钟RCC_HCLKConfig;5、设置高速AHB时钟RCC_PCLK2Config;6、设置低速速AHB时钟RCC_PCLK1Config;7、设置PLL RCC_PLLConfig;8、打开PLL RCC_PLLCmd(ENABLE);9、等待PLL工作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)10、设置系统时钟RCC_SYSCLKConfig;11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08)12、打开要使用的外设时钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd() 下面是TM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振)/************************************************************** ****************** Function Name : RCC_Configuration* Description : RCC配置(使用外部8MHz晶振)* Input : 无* Output : 无* Return : 无*************************************************************** ****************/void RCC_Configuration(void){/*将外设RCC寄存器重设为缺省值 */RCC_DeInit();/*设置外部高速晶振(HSE)*/RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON)/*等待HSE起振*/HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 {/*设置AHB时钟(HCLK)*/RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB 时钟 = 系统时钟/* 设置高速AHB时钟(PCLK2)*/RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟 = HCLK/*设置低速AHB时钟(PCLK1)*/RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟 = HCLK / 2/*设置FLASH存储器延时时钟周期数*/FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2 2延时周期/*选择FLASH预取指缓存的模式*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);// PLL的输入时钟 = HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9/*使能PLL */RCC_PLLCmd(ENABLE);/*检查指定的RCC标志位(PLL准备好标志)设置与否*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/*设置系统时钟(SYSCLK) */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK——选择PLL作为系统时钟/* PLL返回用作系统时钟的时钟源*/while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟{}}/*使能或者失能APB2外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC , ENABLE);//RCC_APB2Periph_GPIOA GPIOA时钟//RCC_APB2Periph_GPIOB GPIOB时钟//RCC_APB2Periph_GPIOC GPIOC时钟//RCC_APB2Periph_GPIOD GPIOD时钟}。

寄存器配置RCC

寄存器配置RCC

寄存器配置RCC这⾥我翻车过,⼀度认为是晶振坏了,可是仔细想想不太对,最终才改过来,现在我就来说说⾃⼰是如何犯错并且发现问题的。

配置流程1.看图图⽚模糊⼀点没事,反正你都得去看中⽂参考⼿册⾼清⽆码⼤图。

具体看图⽅法⽂字倒是不好描述,建议到去搜索视频讲解⼀看,然后脑⼦晕晕的再来看⽂字描述就会懂了。

2.看看参考⼿册上对外设的描述你可能在看各种教程时就已经或多或少的知道了外设的描述(多少取决于视频⽼师讲的和理解的),但是,还是建议看⼀下参考⼿册⾥的描述。

3.认识寄存器见中⽂参考⼿册就这些了,看看理解能⼒不太差的都能懂,啥位置1代表啥的,都写得超级详细的了4.写写代码测试不试⼀下永远不知道代码是错的。

见下⾯我亲⼿撸的代码:void System_clock(void){volatile uint32_t StartUpCount = 0,HSEStatus = 0;//时间向上计数 HSE状态标志RCC->CR |=(0x01<<16);//使能HSE//等待HSE稳定do{HSEStatus=RCC->CR & (0x01<<17);StartUpCount++;}while((HSEStatus==0) && (StartUpCount!=HSE_STARTUP_TIMEOUT));//HSE_STARTUP_TIMEOUT=0x0500if(StartUpCount!=HSE_STARTUP_TIMEOUT){HSEStatus=0x01;}else{HSEStatus=0x00;}//如果启动成功if(HSEStatus==0x01){//使能FLASH预存取缓存区(处理代码等待时间的设置)FLASH->ACR |= (0x01<<4);//配置时延位配置⾼位低位可运⾏,配置低位⾼位会进⼊硬件错误,程序卡死FLASH->ACR &=0x00;FLASH->ACR |=(0x02<<0);RCC->CFGR &=0;//位清零RCC->CFGR |=(0x01<<16);//选择PLL时钟源RCC->CFGR &=~(1<<17);//HSE不分频RCC->CFGR |=(0x07<<18);//PLL锁相环倍频9RCC->CR |=(0x01<<24);//使能PLLwhile((RCC->CR & (0x01<<25))==0);//等待PLL稳定(锁定)RCC->CFGR &=~(0x08<<4);//AHB不分频RCC->CFGR |=(0x04<<8);//APB1分频2RCC->CFGR &=(0x07<<11);//APB2不分频RCC->CFGR |=(0x02<<14);//ADC分频6,只有12MHZ,达不到最⼤14MHZRCC->CFGR |=(0x07<<24);//MCO时钟源PLL分频2,36MHZRCC->CFGR |=(0x02<<0);//选择SYSCLK时钟源while(((RCC->CFGR & (0x08))==0)&&((RCC->CFGR & (0x0c)))==0x0c);//确保PLL作为系统时钟源}else{//启动失败,添加补救代码}}好了,到了这⾥,如何检测代码对错呢?通常有以下⽅法:1.使⽤MCO时钟输出,复⽤PA8引脚。

NUCLEO-L053R8RCC时钟树MCO输出

NUCLEO-L053R8RCC时钟树MCO输出

NUCLEO-L053R8RCC时钟树MCO输出RCC时钟配置实验 最近玩了⼀下Nucleo-L053R8板⼦,即STM32L053R8T6。

浏览了RCC章节后,顺便做了个⼩实验,现在给⼤伙分享⼀下。

实验⾮常简单,配置⼀下系统时钟,可以通过⾁眼观察LED的闪烁快慢,精确的话,可以通过数字⽰波器监控RCC的MCO引脚的输出。

为了保证实验的严谨性,本次通过数字⽰波器监控RCC的MCO引脚的输出。

开始实验之前,先给⼤伙稍微讲⼀下MCO 时钟输出的知识:图1 RCC时钟树MCO 时钟输出: MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在STM32L053R8T6中由 PA8、PA9复⽤所得,主要作⽤是可以对外提供时钟,相当于⼀个有源晶振。

MCO的时钟来源可以是:LSE、LSI、HSE、HSI 16、PLLCLK、SYSCLK、MSI、HSI 48,具体选哪个由时钟配置寄存器的相应位决定。

除了对外提供时钟这个作⽤之外,我们还可以通过⽰波器监控 MCO 引脚的时钟输出来验证我们的系统时钟配置是否正确。

图2 MCO时钟来源STM32CubeMx: 了解了MCO时钟输出的知识后,我们就可以真正开始实验了。

⾸先,我们通过STM32CubeMx⽣成我们需要的项⽬⼯程。

STM32CubeMX 是意法半导体STMCube™的主动原创,可以减轻开发⼯作、时间和费⽤。

STM32Cube 覆盖了 STM32 系列。

STM32Cube 包括 STM32CubeMX,STM32CubeMX是⼀款图形化软件设置⼯具,允许使⽤图形化向导来⽣成 C 初始化代码。

它也集成了⼀个全⾯的软件平台,⽀持每⼀个系列(例如STM32F4系列的STM32CubeF4)。

通俗地说,⼀⽅⾯⼤⼤减少了⼯作量,另⼀⽅⾯也有利于菜鸟的⼊门学习。

通过STM32CubeMx⽣成项⽬⼯程的主要步骤如下:Nucleo-L053R8板⼦有两个RCC_MCO引脚,分别为: RCC_MCO1 -----> PA8 RCC_MCO2 -----> PA9 本次实验监控PA8引脚输出,测试的系统时钟来源于HSI,配置成32MHz。

  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.。

相关文档
最新文档