历史上的今天
返回首页

历史上的今天

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

正在发生

2018年12月17日 | STM32F103学习之RCC配置

2018-12-17 来源:eefocus

STM32F103时钟配置


STM32的独立时钟源共有四个:


1.HSE(外部高速时钟,4~16MHz);


2.HSI(内部高速时钟,8MHz,精度不高);


3.LSE(外部低速时钟,32.768kHz,一般用于产生精确秒信号);


4.LSI(内部低速时钟,40kHz);


还有几个衍生的时钟


5.PLLCLK(锁相环时钟,来源可以是 HSE,HSE/2,HSI/2 这三种再进行倍频得到);


6.SYSCLK(系统时钟,来源可以是 HSE,HSI,PLL 这三种);


7.HCLK(AHB总线时钟,由SYSCLK分频得到);


8.PCLK1(APB1低速时钟,最高36MHz,由HCLK分频得到);


9.PCLK2(APB2高速时钟,最高72MHz,由HCLK分频得到);


10.RTCCLK(实时时钟,来源可以是LSI,LSE,HSE/128 这三种);


11.IWDGCLK(独立看门狗时钟,来自LSI);


在使用外设之前,应先使能其各自的时钟!


若使用3.5版本的库函数进行开发,在启动代码(startup_stm32f10x_xx.s)中会默认调用SystemInit()函数(位于文件“system_stm32f10x.c”),如果定义了这个宏(#define SYSCLK_FREQ_72MHz  72000000),则会将时钟系统初始化为如下状态:SYSCLK:72MHz  /  AHB:72MHz  /  PCLK1:36MHz  /  PCLK2:72MHz  /  PLL:72MHz,如此一来便大大简化了编程,只需在设置中预先DEFINE这个宏(SYSCLK_FREQ_72MHz)即可。初始化以后可以通过SystemCoreClock变量来获取系统时钟(SYSCLK)的状态,例如,SYSCLK为72MHz,那么SystemCoreClock的值为72000000。



与时钟配置相关的库函数整理如下:


函数原型:

void RCC_DeInit(void)

函数功能:

将外设RCC寄存器重设为缺省值

输入参数:无

输出参数:无


函数原型:

void RCC_HSEConfig(u32 RCC_HSE)

函数功能:

设置外部高速晶振(HSE)

输入参数:

RCC_HSE: HSE的新状态

RCC_HSE_OFF  HSE晶振OFF

RCC_HSE_ON  HSE晶振ON

RCC_HSE_Bypass  HSE晶振被外部时钟旁路

输出参数:无


函数原型:

ErrorStatus RCC_WaitForHSEStartUp(void)

函数功能:

等待HSE起振,该函数将等待直到HSE就绪,或者在超时的情况下退出

输入参数:无

输出参数:

一个ErrorStatus枚举值:

SUCCESS:HSE晶振稳定且就绪

ERROR:HSE晶振未就绪


函数原型:

void RCC_AdjustHSICalibrationValue(u8 HSICalibrationValue)

函数功能:

调整内部高速晶振(HSI)校准值

输入参数:

HSICalibrationValue: 校准补偿值

该参数取值必须在0到0x1F之间

输出参数:无


函数原型:

void RCC_HSICmd(FunctionalState NewState)

函数功能:

使能或者失能内部高速晶振(HSI)

输入参数:

NewState:HSI新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_PLLConfig(u32 RCC_PLLSource, u32 RCC_PLLMul)

函数功能:

设置PLL时钟源及倍频系数

输入参数:

RCC_PLLSource:PLL的输入时钟源

RCC_PLLSource_HSI_Div2  PLL的输入时钟 = HSI时钟频率除以2

RCC_PLLSource_HSE_Div1  PLL的输入时钟 = HSE时钟频率

RCC_PLLSource_HSE_Div2  PLL的输入时钟 = HSE 时钟频率除以2

RCC_PLLMul:PLL倍频系数

RCC_PLLMul_2  PLL输入时钟 x 2

RCC_PLLMul_3  PLL输入时钟 x 3

RCC_PLLMul_4  PLL输入时钟 x 4

RCC_PLLMul_5  PLL输入时钟 x 5

RCC_PLLMul_6  PLL输入时钟 x 6

RCC_PLLMul_7  PLL输入时钟 x 7

RCC_PLLMul_8  PLL输入时钟 x 8

RCC_PLLMul_9  PLL输入时钟 x 9

RCC_PLLMul_10  PLL输入时钟 x 10

RCC_PLLMul_11  PLL输入时钟 x 11

RCC_PLLMul_12  PLL输入时钟 x 12

RCC_PLLMul_13  PLL输入时钟 x 13

RCC_PLLMul_14  PLL输入时钟 x 14

RCC_PLLMul_15  PLL输入时钟 x 15

RCC_PLLMul_16  PLL输入时钟 x 16

输出参数:无


函数原型:

void RCC_PLLCmd(FunctionalState NewState)

函数功能:

使能或者失能PLL

输入参数:

NewState:PLL新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_SYSCLKConfig(u32 RCC_SYSCLKSource)

函数功能:

设置系统时钟(SYSCLK)

输入参数:

RCC_SYSCLKSource: 用作系统时钟的时钟源

RCC_SYSCLKSource_HSI  选择HSI作为系统时钟

RCC_SYSCLKSource_HSE  选择HSE作为系统时钟

RCC_SYSCLKSource_PLLCLK  选择PLL作为系统时钟

输出参数:无


函数原型:

u8 RCC_GetSYSCLKSource(void)

函数功能:

返回用作系统时钟的时钟源

输入参数:无

输出参数:

0x00:HSI作为系统时钟

0x04:HSE作为系统时钟

0x08:PLL作为系统时钟


函数原型:

void RCC_HCLKConfig(u32 RCC_HCLK)

函数功能:

设置AHB时钟(HCLK)

输入参数:

RCC_HCLK: 定义HCLK,该时钟源自系统时钟(SYSCLK)

RCC_SYSCLK_Div1  AHB时钟 = 系统时钟

RCC_SYSCLK_Div2  AHB时钟 = 系统时钟 / 2

RCC_SYSCLK_Div4  AHB时钟 = 系统时钟 / 4

RCC_SYSCLK_Div8  AHB时钟 = 系统时钟 / 8

RCC_SYSCLK_Div16  AHB时钟 = 系统时钟 / 16

RCC_SYSCLK_Div64  AHB时钟 = 系统时钟 / 64

RCC_SYSCLK_Div128  AHB时钟 = 系统时钟 / 128

RCC_SYSCLK_Div256  AHB时钟 = 系统时钟 / 256

RCC_SYSCLK_Div512  AHB时钟 = 系统时钟 / 512

输出参数:无


函数原型:

void RCC_PCLK1Config(u32 RCC_PCLK1)

函数功能:

设置低速AHB时钟(PCLK1)

输入参数:

RCC_PCLK1: 定义PCLK1,该时钟源自AHB时钟(HCLK)

RCC_HCLK_Div1  APB1时钟 = HCLK

RCC_HCLK_Div2  APB1时钟 = HCLK / 2

RCC_HCLK_Div4  APB1时钟 = HCLK / 4

RCC_HCLK_Div8  APB1时钟 = HCLK / 8

RCC_HCLK_Div16  APB1时钟 = HCLK / 16

输出参数:无


函数原型:

void RCC_PCLK2Config(u32 RCC_PCLK2)

函数功能:

设置高速AHB时钟(PCLK2)

输入参数:

RCC_PCLK2: 定义PCLK2,该时钟源自AHB时钟(HCLK)

RCC_HCLK_Div1  APB2时钟 = HCLK

RCC_HCLK_Div2  APB2时钟 = HCLK / 2

RCC_HCLK_Div4  APB2时钟 = HCLK / 4

RCC_HCLK_Div8  APB2时钟 = HCLK / 8

RCC_HCLK_Div16  APB2时钟 = HCLK / 16

输出参数:无


函数原型:

void RCC_ITConfig(u8 RCC_IT, FunctionalState NewState)

函数功能:

使能或者失能指定的RCC中断

输入参数:

RCC_IT:待使能或者失能的RCC中断源

RCC_IT_LSIRDY  LSI就绪中断

RCC_IT_LSERDY  LSE就绪中断

RCC_IT_HSIRDY  HSI就绪中断

RCC_IT_HSERDY  HSE就绪中断

RCC_IT_PLLRDY  PLL就绪中断

NewState:RCC中断的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_USBCLKConfig(u32 RCC_USBCLKSource)

函数功能:

设置USB时钟(USBCLK)

输入参数:

RCC_USBCLKSource: 定义USBCLK,该时钟源自PLL输出

RCC_USBCLKSource_PLLCLK_1Div5  USB时钟 = PLL时钟除以1.5

RCC_USBCLKSource_PLLCLK_Div1  USB时钟 = PLL时钟

输出参数:无


函数原型:

void ADC_ADCCLKConfig(u32 RCC_ADCCLKSource)

函数功能:

设置ADC时钟(ADCCLK)

输入参数:

RCC_ADCCLKSource: 定义ADCCLK,该时钟源自APB2时钟

RCC_PCLK2_Div2  ADC时钟 = PCLK / 2

RCC_PCLK2_Div4  ADC时钟 = PCLK / 4

RCC_PCLK2_Div6  ADC时钟 = PCLK / 6

RCC_PCLK2_Div8  ADC时钟 = PCLK / 8

输出参数:无


函数原型:

void RCC_LSEConfig(u32 RCC_HSE)

函数功能:

设置外部低速晶振(LSE)

输入参数:

RCC_LSE: LSE的新状态

RCC_LSE_OFF  LSE晶振OFF

RCC_LSE_ON  LSE晶振ON

RCC_LSE_Bypass  LSE晶振被外部时钟旁路

输出参数:无


函数原型:

void RCC_LSICmd(FunctionalState NewState)

函数功能:

使能或者失能内部低速晶振(LSI)

输入参数:

NewState:LSI新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)

函数功能:

返回不同片上时钟的频率

输入参数:

RCC_Clocks:指向结构RCC_ClocksTypeDef的指针,包含了各个时钟的频率

RCC_ClocksTypeDef structure

RCC_ClocksTypeDef定义于文件“stm32f10x_rcc.h”:

typedef struct

{

u32 SYSCLK_Frequency;

u32 HCLK_Frequency;

u32 PCLK1_Frequency;

u32 PCLK2_Frequency;

u32 ADCCLK_Frequency;

}RCC_ClocksTypeDef;

SYSCLK_Frequency  该成员返回SYSCLK的频率,单位 Hz

HCLK_Frequency  该成员返回HCLK的频率,单位 Hz

PCLK1_Frequency  该成员返回PCLK1的频率,单位 Hz

PCLK2_Frequency  该成员返回PCLK2的频率,单位 Hz

ADCCLK_Frequency  该成员返回ADCCLK的频率,单位 Hz

输出参数:无


函数原型:

void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph,FunctionalState NewState)

函数功能:

使能或者失能AHB外设时钟

输入参数:

RCC_AHBPeriph: 门控AHB外设时钟

RCC_AHBPeriph_DMA  DMA时钟

RCC_AHBPeriph_SRAM  SRAM时钟

RCC_AHBPeriph_FLITF  FLITF时钟

NewState:指定外设时钟的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,

FunctionalState NewState)

函数功能:

使能或者失能APB2外设时钟

输入参数:

RCC_APB2Periph: 门控APB2外设时钟

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外设时钟

NewState:指定外设时钟的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState)

函数功能:

使能或者失能APB1外设时钟

输入参数:

RCC_APB1Periph: 门控APB1外设时钟

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时钟

RCC_APB1Periph_BKP  BKP时钟

RCC_APB1Periph_PWR  PWR时钟

RCC_APB1Periph_ALL  全部APB1外设时钟

NewState:指定外设时钟的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, FunctionalState NewState)

函数功能:

强制或者释放高速APB(APB2)外设复位

输入参数:

RCC_APB2Periph: APB2外设复位

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外设时钟

NewState:指定APB2外设复位的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:


函数原型:

void RCC_APB1PeriphResetCmd(u32 RCC_APB1Periph, FunctionalState NewState)

函数功能:

强制或者释放低速APB(APB1)外设复位

输入参数:

RCC_APB1Periph: APB1外设复位

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时钟

RCC_APB1Periph_BKP  BKP时钟

RCC_APB1Periph_PWR  PWR时钟

RCC_APB1Periph_ALL  全部APB1外设时钟

NewState:指定APB1外设复位的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:


函数原型:

void RCC_BackupResetCmd(FunctionalState NewState)

函数功能:

强制或者释放后备域复位

输入参数:

NewState:后备域复位的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_ClockSecuritySystemCmd(FunctionalState NewState)

函数功能:

使能或者失能时钟安全系统

输入参数:

NewState:时钟安全系统的新状态

这个参数可以取:ENABLE或者DISABLE

输出参数:无


函数原型:

void RCC_MCOConfig(u8 RCC_MCO)

函数功能:

选择在MCO管脚上输出的时钟源

输入参数:

RCC_MCO: 指定输出的时钟源

RCC_MCO_NoClock  无时钟被选中

RCC_MCO_SYSCLK  选中系统时钟

RCC_MCO_HSI  选中HSI

RCC_MCO_HSE  选中HSE

RCC_MCO_PLLCLK_Div2  选中PLL时钟除以2

输出参数:无


函数原型:

FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG)

函数功能:

检查指定的RCC标志位设置与否

输入参数:

RCC_FLAG:待检查的RCC标志位

RCC_FLAG_HSIRDY  HSI晶振就绪

RCC_FLAG_HSERDY  HSE晶振就绪

RCC_FLAG_PLLRDY  PLL就绪

RCC_FLAG_LSERDY  LSI晶振就绪

RCC_FLAG_LSIRDY  LSE晶振就绪

RCC_FLAG_PINRST  管脚复位

RCC_FLAG_PORRST  POR/PDR复位

RCC_FLAG_SFTRST  软件复位

RCC_FLAG_IWDGRST  IWDG复位

RCC_FLAG_WWDGRST  WWDG复位

RCC_FLAG_LPWRRST  低功耗复位

输出参数:

RCC_FLAG的新状态(SET或者RESET)


函数原型:

void RCC_ClearFlag(void)

函数功能:

清除RCC的复位标志位

输入参数:无

输出参数:无


函数原型:

ITStatus RCC_GetITStatus(u8 RCC_IT)

函数功能:

检查指定的RCC中断发生与否

输入参数:

RCC_IT:待检查的RCC中断源

RCC_IT_LSIRDY  LSI晶振就绪中断

RCC_IT_LSERDY  LSE晶振就绪中断

RCC_IT_HSIRDY  HSI晶振就绪中断

RCC_IT_HSERDY  HSE晶振就绪中断

RCC_IT_PLLRDY  PLL就绪中断

RCC_IT_CSS  时钟安全系统中断

输出参数:

RCC_IT的新状态(SET或者RESET)


函数原型:

void RCC_ClearITPendingBit(u8 RCC_IT)

函数功能:

清除RCC的中断待处理位

输入参数:

RCC_IT:待检查的RCC中断源

RCC_IT_LSIRDY  LSI晶振就绪中断

RCC_IT_LSERDY  LSE晶振就绪中断

RCC_IT_HSIRDY  HSI晶振就绪中断

RCC_IT_HSERDY  HSE晶振就绪中断

RCC_IT_PLLRDY  PLL就绪中断

RCC_IT_CSS  时钟安全系统中断

输出参数:无


推荐阅读

史海拾趣

Excel Cell Electronic Co Ltd公司的发展小趣事

自1981年成立以来,ECE公司始终将技术创新作为发展的核心驱动力。早期,公司专注于电子元器件的研发和生产,通过引进国际先进技术,并结合本地市场需求进行创新,成功推出了一系列具有竞争力的产品。随着技术的不断进步,ECE公司不断加大研发投入,积极探索新的应用领域,逐渐成为电子行业的领军企业。

Brite-Led Optoelectronics Inc公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Brite-Led深知这一点,始终将品质放在首位。公司建立了严格的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格把控。同时,公司还投入大量资源用于产品质量检测和改进,确保每一件产品都能达到客户的高标准要求。正是这种对品质的执着追求,使得Brite-Led在市场上赢得了良好的口碑和信誉。

Gould Fiber Optics公司的发展小趣事
可能是散热不良、负载过大或内部元件短路。
Eska公司的发展小趣事

随着全球对环保意识的提高,Eska公司积极响应并融入环保理念。公司采用再生纸作为原材料,制造灰板纸,有效减少了资源浪费和环境污染。同时,Eska的造纸过程也注重节能减排,每生产一顿纸板所需的水量非常少。此外,公司还拥有自己的加热和发电站,所产出的电力和蒸汽供应自给自足,进一步减少了对环境的破坏。

CYANLITE公司的发展小趣事

CYANLITE公司成立于XXXX年,由一群富有创新精神的电子工程师创立。他们发现当时市场上对于高效能LED照明产品的需求日益增长,于是决定利用自己的技术背景,专注于研发和生产高品质的LED照明产品。起初,公司规模较小,资金有限,但他们凭借对技术的热情和坚持不懈的努力,成功研发出了第一款具有竞争力的LED灯具,并逐渐在市场上获得了认可。随着产品的热销,CYANLITE公司逐渐扩大了生产规模,并增加了研发投入,以保持其在行业中的领先地位。

ABECO公司的发展小趣事

随着业务的发展,ABECO在1970年做出了一个大胆的决定——进军马耳他市场。这一决策既带来了挑战,也带来了机遇。公司需要适应新的市场环境,了解当地的需求和文化。经过一段时间的摸索和努力,ABECO凭借其高品质的产品和专业的服务,成功在马耳他市场打开了局面,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

嵌入式或LINUX相关研发面试题目

一、ANSI C/C++方面的知识 一.1、简答题。下面的题目必须全部答对才给分(20分): 1、 如何在C中初始化一个字符数组。 2、 如何在C中为一个数组分配空间。 3、 如何初始化一个指针数组。 4、 如何定义一个有10个元素的整数型指针数组。 5、 s[10]的 ...…

查看全部问答>

谁会弄木马箱子

现在的木马箱子狠难弄吗? …

查看全部问答>

CYPRESS

初识单片机,需要做CYPRESS和pc通信,如果用EPO实现,需要在FIRMWARE里做哪些工作啊,谢谢! 还请教一个问题,EPxBUFFER,port和FIFO 有什么区别啊?…

查看全部问答>

WinCE下的数据库

大家好:     我有几个问题先问,如下     1,WinCE下都能运行什么数据库?哪个小一些,简单,容易操作。     2. 之前了解了一下SQLCE,但是安装时提示要PlatformSDK,可是我之前安装了WinCe5.0,又装了Studio200 ...…

查看全部问答>

请问两个16位的SDRAM组成32位,现只是单个SDRAM的地址线、数据线等长,不是两个SDRAM彼此等长,会有影响吗?内附线长

想让SDRAM运行在最高频率133MHz。 第一片. Addr Bus:     prop delay: from U1001.E9 to U4001.G1  min=18 MM  max=23 MM Data Bus (Data0~Data15):     (RDly) U1001.D12 to U4001.A8  mi ...…

查看全部问答>

请问现在有什么新的可编程计数器芯片

8253和68040等老的计数器大家还在用吗,请问有什么封装小点的,多路计数器吗?能串行控制的更好。…

查看全部问答>

高分求MC1000 开机自动运行程序的解决方案(冷启动设置须不丢失)!

小弟最近做一个手持设备的小项目,设备为MC1000(条形码数据采集器),平台为Wince 4.2,开发工具为vs2003.现在通过设置注册表已经实现了开机自动运行自己写的程序的功能,但是现在冷启动后就注册表就复原了。在网上查了一下说是RegFlushKey可以解决 ...…

查看全部问答>

收到液晶和MP3的PCB,拍照秀图。

哈哈,终于收到TFT转接板和MP3的PCB,晚上回去多拍几张照片,秀秀图。。。   [ 本帖最后由 zhaojun_xf 于 2010-9-3 18:37 编辑 ]…

查看全部问答>

包集合体中函数调用

在文件名 为uart_serial.vhd中定义了如下包集合:library ieee;use ieee.std_logic_1164.all;package uart_serial is        function get_parity(get_parity_type :std_logic;        &nb ...…

查看全部问答>