RCC_CFGRverilog寄存器初始化化后值为0x00000000,RCC->CFGR & RCC_CFGR_SWS那这个有什么意义

主时钟_百度百科
清除历史记录关闭
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
主时钟是产生准确定时信号用以控制其他时钟及可能还有设备的时钟;在国内数字网中,在由单一参考时钟控制所有时钟以取得完全同步网的情形,这个控制时钟一般称为主时钟,
master clock
定  义
用于控制其他时钟频率的时钟。
通信科技(一级学科),支撑网络(二级学科)
以上内容由审定公布
主时钟定义
主时钟是用于控制其他时钟频率的时钟,是产生准确定时信号用以控制其他时钟及可能还有设备的时钟。这种时钟的长期频率偏差应该小于
,在国内数字网中,在由单一参考时钟控制所有时钟以取得完全同步网的情形,这个控制时钟一般称为主时钟,在具有两个以上参考时钟的完全同步网,其间通过国内链路互相同步的情形,其中应有一参考时钟的精度和稳定度最高,作为主控时钟,安装在某一数字交换中心作为网的频率控制中心。
主时钟可由以下来源得到:(1)一个外部产生的;(2)带有外部连接晶体的片内振荡器;(3)一个内片PLL或频率合成器,它由外部时钟信号产生一个主时钟。DSP处理器的主时钟通常以100MHz或更高速率产生时钟信号。
主时钟最佳主时钟算法
最佳主时钟算法(Best Master Clock,BMC)指明了一种方法,该方法使得本地时钟能够决定它所能看到的所有时钟,包括自身,哪一个时钟是最好的。该算法独立于每个PTP端口,在端口选择出比较好的时钟之后,又将这些较好的时钟进行比较,最后确定出一个最好的时钟,指定它作为系统中的最佳主时钟。
最佳主时钟算法由两个部分组成,数据集比较算法和状态决定算法。其中,数据集比较算法计算一个二元关系,该数据集分别和两个时钟端口相关联。其中的某个数据集可能代表本地时钟的缺省特性,而另一个则是建立在接收到的同步报文中所包含的信息的基础上。状态决定算法的作用时根据被选择出来的主时钟的数据集来更新本地的数据集以及更新每个时钟的PTP状态。
主时钟系统主时钟
主时钟组成单元
系统主时钟比较复杂,主要有以下三部分组成单元
(1)有两个:内部8MHz的高速RC振荡器HSI和外部高速振荡器HSE;
(2)有三个:HIS、HSE和锁相环PLL;
(3)有一个PLLMUL和一个AHB。
这些单元为系统提供了很宽范围内的选择的可能性。
主时钟时钟源的选择
内部8MHz的高速RC振荡器HSI在上电复位后自动打开,但精度不高,在要求不高的场合可以直接使用。如果精度不能满足要求,则可以使用外部4~16MHz的外部振荡器()。
外部高速振荡器HSE打开的方法如下:
(1)打开/关断高速外部振荡器使用RCC_CR寄存器中的HSEON位;
(2)判断外部高速振荡器是否一进就绪,使用RCC_CR寄存器中的HSERDY位;
(3)使能高速外部振荡器中断,使用RCC_CIR寄存器中的HSERDYIE位;
(4)高速外部振荡器中断标志位HSERDYF在RCC_CIR寄存器中;
(5)高速外部振荡器中断清除位HSERDYC在RCC_CIR寄存器中。
内部高速RC振荡器HIS在上电复位后自动打开,但如果系统使用HSE作为时钟源,HIS也可以关闭(只是为了低功耗,也可以不关闭)。事实上,HIS的设置方法也和HSE一样:
(1)打开/关断高速内部振荡器使用RCC_CR寄存器中的HSION位;
(2)判断内部高速振荡器是否一进就绪,使用RCC_CR寄存器中的HSIRDY位;
(3)使能高速内部振荡器中断,使用RCC_CIR寄存器中的HSIERDYIE位;
(4)高速内部振荡器中断标志位HSIRDYF在RCC_CIR寄存器中;
(5)高速内部振荡器中断清除位HSIRDYC在RCC_CIR寄存器中。
内部高速振荡器因为精度较低,所以系统设计了一套校准方法:高速内部时钟校准,使用时钟控制寄存器RCC_CR中的HSITRIM位域。
主时钟锁相环
PLL在上电复位后是关闭的,如果使用的话需要打开。第一步是选择一个关于HSE的PLL入口信号,在这个入口PLLXTPRE处有两个HSE的时钟源:一个是HSE,另一个是二频分的HSE。设置PLLTPRE的方法如下:二分频HSE将RCC_CFGR寄存器中的PLLXTPRE位置1,不分频则清零(默认状态)。
通过这个入口之后时钟振荡源进入PLL时钟源选择器PLLSRC,该选择器主要选择使用哪一个振荡器作为时钟源。从HIS进来的信号是一个二分频的信号。该选择器设置方法如下:设置PLLSRC使用RCC_CFGR寄存器中的PLLSRC位域。
上电复位后,这个PLLSRC=0,选择二分频的内部RC振荡器HIS作为时钟源。经过该选择器之后,时钟信号进入PLLPLLMUL,倍频器可以把输入时钟进行2~6倍倍频,选择范围比较宽。该倍频器没有
(不倍频)的选择,因为如果不希望倍频,可以使时钟源不通过PLLSRC选择器。PLLMUL的使用方法如下:设置PLLMUL使用RCC_CFGR寄存器中的PLLMUL位域。该PLLMUL共有15种选择。
如果以上都设置完毕,PLL还不能运行,还需要打开PLL和进行以下设置:
(1)打开/关断PLL,用RCC_CR寄存器中的PLLON位;
(2)判断PLL是否已经就绪,使用RCC_CR寄存器中的PLLRDY位;
(3)使能PLL中断,使用RCC_CIR寄存器中的PLLRDYIE位;
(4)PLL中断标志位PLLRDYF在RCC_CIR寄存器中;
(5)PLL中断清除位PLLRDYC在RCC_CIR寄存器中。
通过以上设置过程可以打开时钟锁相环PLL,也可以使PLL中断。
主时钟USB时钟
从倍频器出来的时钟信号经过一个USB分频器直接输出到USB接口。要求其输出时钟是48MHz。分频使用方法如下:设置USB分频器使用RCC-CFGR寄存器中的USBPRE位。
USB只有不分频或1/1.5分频两种选择。
主时钟时钟选择开关SW和AHB分频器
共有三个时钟源进入时钟切换开关,SW。分别是来自HSI和HSE的不分频时钟以及来自PLL的时钟。切换开关SW选择其中的一个,方法如下:
(1)设置SW时钟切换开关,使用时钟配置寄存器RCC-CFGR中的SW域;
(2)观察时钟切换开关SW的状态,使用RCC-CFGR中的SWS域;
从SW出去的时钟称为系统时钟,最大可以达到72MHz。该系统时钟供给系统,作为整个系统的时钟源。系统时钟首先驱动总线AHB时还可以再分频,即经过AHB分频器。AHB分频器使用方法如下:
(1)设置AHB分频器使用时钟配置寄存器RCC-CFGR中的HPRE域;
(2)AHB分频有9种选择,从1分频到512分频,可选范围非常大。经过这个选择器后,时钟进入AHB总线系统。
主时钟三个时钟开关
三个时钟开关与有关。进入AHB的时钟信号,在进入存储器和DMA之前还有三个开关,它们是Flash存储器时钟开关、SRAM时钟开关和DMA时钟开关。前两个开关只和睡眠模式有关。
(1)睡眠模式时,打开/关断Flash存储器时钟,使用RCC-AHBENR寄存器中的FLITF位;
(2)睡眠模式时,打开/关断SRAM存储器时钟,使用RCC-AHBENR寄存器中的SRAMEN位;
(3)打开/关断DMA时钟,使用RCC-AHBENR寄存器中的DMAEN位。
主时钟时钟控制寄存器和时钟中断寄存器
时钟控制寄存器(RCC-CR)可以打开/关断振荡器和时钟。寄存器的地址是0x,复位值是。
时钟中断寄存器(RCC-CIR)可以设置时钟中断,寄存器的地址是0x,复位值是。
张煦主编.光纤通信技术词典.上海:上海交通大学出版社,1990:192-192
郭森楙,颜允圣著,贾洪峰译.数字信号处理器:体系结构、实现与应用.北京:清华大学出版社,2005:99-99
- 黄曙主编.IEEE1588同步技术在电力系统中的应用 继电保护分册.北京:中国电力出版社,2013:37-39
赵星寒编著.从0开始教你学STM32 .北京:北京航空航天大学出版社,2014:53-59
本词条认证专家为
副教授审核
西南大学电子信息工程学院
清除历史记录关闭函数原型如下: void RCC_RTCCLKConfig(u32 RCC_RTCCLKSource) {
/* Check the parameters */
assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
/* Select the RTC clock source */
RCC->BDCR |= RCC_RTCCLKS } 15.2.19 函数RCC_RTCCLKCmd
Table 368. 函数RCC_RTCCLKCmd
函数名 RCC_RTCCLKCmd 函数原形 void RCC_RTCCLKCmd(FunctionalState NewState)
功能描述 使能或失能RTC时钟 NewState:RTC时钟的新状态 输入参数 参数取值:ENABLE 或 DISABLE 输出参数 无 返回值 无 先决条件 该函数只有在通过函数RCC_RTCCLKConfig选择RTC时钟后,才能调用 被调用函数 无 例:
/* Enable the RTC clock */
RCC_RTCCLKCmd(ENABLE);
函数原型如下: void RCC_RTCCLKCmd(FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(vu32 *) BDCR_RTCEN_BB = (u32)NewS//BDCR_RTCEN_BB的地址:0xC }
15.2.20 函数RCC_GetClocksFreq
Table 369. 函数 RCC_GetClocksFreq 函数名 RCC_GetClocksFreq 函数原形 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
功能描述 返回不同片上时钟的频率 RCC_Clocks:指向结构RCC_ClocksTypeDef的指针,包含了各个时钟的频率 输入参数 参阅Section:RCC_Clocks查阅更多该参数允许取值范围 输出参数 无 返回值 无 先决条件 无 被调用函数 无
RCC_ClocksTypeDef structure
RCC_ClocksTypeDef定义于文件“sm32f10x_rcc.h:
typedef struct
u32 SYSCLK_F
u32 HCLK_F
u32 PCLK1_F
u32 PCLK2_F
u32 ADCCLK_F }RCC_ClocksTypeD
1.SYSCLK_Frequency:该成员返回SYSCLK的频率/Hz,HSI、HSE、PLLCLK 2.HCLK_Frequency:该成员返回HCLK的频率/Hz,AHB 3.PCLK1_Frequency:该成员返回PCLK1 的频率/Hz,APB1 4.PCLK2_Frequency:该成员返回PCLK2 的频率/Hz,APB2 5.ADCCLK_Frequency:该成员返回ADCCLK的频率/Hz,ADCCLK 结构体实现如下: /* Get the frequencies of different on chip clocks */
void RCC_GetClocksFreq(RCC_ClocksTypeDef*
RCC_Clocks) {
u32 tmp = 0, pllmull = 0, pllsource = 0, presc = 0;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & CFGR_SWS_M//#define CFGR_SWS_Mask
((u32) 0xC)
switch (tmp)// RCC_CFGR.SWS[1:0]状态定义:00(HSI做系统时钟),01(HSE),10(PLL),11(不可用)
case 0x00:
/* HSI used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSI_V //#define HSI_Value
((u32)8000000)
case 0x04:
/* HSE used as system clock */
RCC_Clocks->SYSCLK_Frequency = HSE_V// #define HSE_Value
((u32)8000000)
case 0x08:
/* PLL used as system clock */
/* Get PLL clock source and multiplication factor ----------------------*/
pllmull = RCC->CFGR & CFGR_PLLMull_M// #define CFGR_PLLMull_Mask ((u32)0x003C 0000)//读倍频系数
pllmull = ( pllmull >> 18) + 2;
//CFGR. PLLMUL[3:0]在bit21-18,倍频系数pllmull+2=实际倍频数。(定义-实际 的关系)
pllsource = RCC->CFGR & CFGR_PLLSRC_M// #define CFGR_PLLSRC_Mask
//bit16:0--HSI/2;
1--(HSE(bit17=0) 或 HSE/2(bit17=1))
if (pllsource == 0x00)
{/* HSI oscillator clock divided by 2 selected as PLL clock entry */
RCC_Clocks->SYSCLK_Frequency = (HSI_Value >> 1) *//HSI/2
else//pllsource==0x
{/* HSE selected as PLL clock entry */
if ((RCC->CFGR & CFGR_PLLXTPRE_Mask) != (u32)RESET)//判断Bit17是否为1??HSE/2
{/* HSE oscillator clock divided by 2 */
RCC_Clocks->SYSCLK_Frequency = (HSE_Value >> 1) *
RCC_Clocks->SYSCLK_Frequency = HSE_Value * //判断Bit17是否为0?-> HSE
RCC_Clocks->SYSCLK_Frequency = HSI_V
/* Compute HCLK, PCLK1, PCLK2 and ADCCLK clocks frequencies ----------------*/
/* Get HCLK prescaler */
tmp = RCC->CFGR & CFGR_HPRE_Set_M//Bit7-4
tmp = tmp >> 4;
presc = APBAHBPrescTable[tmp]; //static uc8 APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; //前8个数字对应APB2、APB1(三位分频值,首位为0不分频),后8个数字对应AHB(四位分频值,首位位0不分频)。 //AHB无32分频
/* HCLK clock frequency */
RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >>//AHB由SYSCLK分频获得
/* Get PCLK1 prescaler */
tmp = RCC->CFGR & CFGR_PPRE1_Set_M //Bit10-8―APB1
tmp = tmp >> 8;
presc = APBAHBPrescTable[tmp];
/* PCLK1 clock frequency */
RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> //APB1由AHB分频获得
/* Get PCLK2 prescaler */
tmp = RCC->CFGR & CFGR_PPRE2_Set_M //Bit13-11―APB2
tmp = tmp >> 11;
presc = APBAHBPrescTable[tmp];
/* PCLK2 clock frequency */
RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> //APB2由AHB分频获得
/* Get ADCCLK prescaler */
tmp = RCC->CFGR & CFGR_ADCPRE_Set_M//bit15-14
tmp = tmp >> 14;
presc = ADCPrescTable[tmp]; //static uc8 ADCPrescTable[4] = {2, 4, 6, 8};
/* ADCCLK clock frequency */
RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / } 备注:查取所有的频率,然后供后续函数调用其中任何一个.
15.2.21 函数RCC_AHBPeriphClockCmd
Table 370. 函数RCC_AHBPeriphClockCmd
函数名 RCC_AHBPeriphClockCmd
void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, 函数原形 FunctionalState NewState) 功能描述 使能或失能 AHB外设时钟 RCC_AHBPeriph:门控AHB外设时钟 输入参数 1 参阅Section:RCC_AHBPeriph查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE 或 DISABLE
输出参数 无 返回值 无 先决条件 无 被调用函数 无 RCC_AHBPeriph:该参数被门控的AHB外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。
Table 371. RCC_AHBPeriph值(1) RCC_AHBPeriph 描述 #define值 备注 RCC_AHBPeriph_DMA DMA时钟
RCC_AHBPeriph_SRAM SRAM时钟
RCC_AHBPeriph_FLITF FLITF时钟
Flashinterface 1.SRAM和FLITF时钟只能在睡眠(SLEEP)模式下被失能。 参数RCC_AHBPeriph的值 描述/RCC_AHBENR #define值 备注 RCC_AHBPeriph_DMA1 DMA1时钟 ((u32)0x) bit0 RCC_AHBPeriph_DMA2 DMA2时钟 ((u32)0x) bit1 RCC_AHBPeriph_SRAM SRAM时钟 ((u32)0x) bit3 RCC_AHBPeriph_FLITF FLITF时钟 ((u32)0x) bit5/FlashInterface RCC_AHBPeriph_CRC CRC时钟 ((u32)0x) bit6 RCC_AHBPeriph_FSMC FSMC时钟 ((u32)0x) bit8 RCC_AHBPeriph_SDIO SDIO时钟 ((u32)0x) bit10
例: /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA,ENABLE);
函数原型如下: void RCC_AHBPeriphClockCmd(u32 RCC_AHBPeriph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
// #define IS_RCC_AHB_PERIPH(PERIPH) ((((PERIPH) & 0xFFFFFAA8) == 0x00) && ((PERIPH) != 0x00))
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
RCC->AHBENR |= RCC_AHBP
RCC->AHBENR &= ~RCC_AHBP
15.2.22 函数RCC_APB2PeriphClockCmd
Table 372. 函数RCC_APB2PeriphClockCmd 函数名 RCC_APB2PeriphClockCmd void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) 功能描述 使能或失能 APB2外设时钟 RCC_APB2Periph:门控APB2外设时钟 输入参数 1 参阅Section:RCC_APB2Periph 查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE或 DISABLE 输出参数 无 返回值 无 先决条件 无 被调用函数 无 RCC_APB2Periph:该参数被门控的APB2外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。
Table 373. RCC_AHB2Periph 值
参数RCC_AHB2Periph的值 描述 #define值 备注 RCC_APB2Periph_AFIO 功能复用IO时钟 0x
RCC_APB2Periph_GPIOA GPIOA时钟 0x
RCC_APB2Periph_GPIOB GPIOB时钟 0x
RCC_APB2Periph_GPIOC GPIOC时钟 0x
RCC_APB2Periph_GPIOD GPIOD时钟 0x
RCC_APB2Periph_GPIOE GPIOE时钟 0x
RCC_APB2Periph_GPIOF GPIOE时钟 0x
RCC_APB2Periph_GPIOG GPIOE时钟 0x
RCC_APB2Periph_ADC1 ADC1时钟 0x
RCC_APB2Periph_ADC2 ADC2时钟 0x
RCC_APB2Periph_TIM1 TIM1时钟 0x
RCC_APB2Periph_SPI1 SPI1时钟 0x
RCC_APB2Periph_TIM8 TIM8 0x
RCC_APB2Periph_USART1 USART1时钟 0x
RCC_APB2Periph_ADC3 ADC3时钟 0x
RCC_APB2Periph_ALL 全部APB2外设时钟 0x0000FFFD
例: 函数原形 /* Enable GPIOA, GPIOB and SPI1 clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_SPI1, ENABLE);
函数原型如下: void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
// #define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFFF0002) == 0x00) && ((PERIPH) != 0x00))
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
RCC->APB2ENR |= RCC_APB2P
RCC->APB2ENR &= ~RCC_APB2P
15.2.23 函数RCC_APB1PeriphClockCmd
Table 374. 函数RCC_APB1PeriphClockCmd 函数名 RCC_APB1PeriphClockCmd void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, 函数原形 FunctionalState
NewState) 功能描述 使能或失能 APB1外设时钟 RCC_APB1Periph:门控APB1外设时钟 输入参数 1 参阅Section:RCC_APB1Periph查阅更多该参数允许取值范围 NewState:指定外设时钟的新状态 输入参数 2 参数取值:ENABLE 或 DISABLE 输出参数 无 无 无 无 RCC_APB1Periph:该参数被门控的APB1外设时钟,可以取下表的一个或者多个取值的组合作为该参数的值。
Table 375. RCC_AHB1Periph值 RCC_AHB1Periph 描述 #define值/对应位号 RCC_APB1Periph_TIM2 TIM2时钟 0x RCC_APB1Periph_TIM3 TIM3时钟 0x RCC_APB1Periph_TIM4 TIM4时钟 0x RCC_APB1Periph_TIM5 TIM4时钟 0x RCC_APB1Periph_TIM6 TIM4时钟 0x RCC_APB1Periph_TIM7 TIM4时钟 0x RCC_APB1Periph_WWDG WWDG时钟 0x RCC_APB1Periph_SPI2 SPI2时钟 0x RCC_APB1Periph_SPI3 SPI3时钟 0x RCC_APB1Periph_USART2 USART2时钟 0x RCC_APB1Periph_USART3 USART3时钟 0x RCC_APB1Periph_UART4 UART4时钟 0x RCC_APB1Periph_UART5 UART5时钟 0x RCC_APB1Periph_I2C1 I2C1时钟 0x RCC_APB1Periph_I2C2 I2C2时钟 0x RCC_APB1Periph_USB USB时钟 0x RCC_APB1Periph_CAN CAN时钟 0x RCC_APB1Periph_BKP BKP时钟 0x RCC_APB1Periph_PWR PWR时钟 0x RCC_APB1Periph_DAC DAC时钟 0x RCC_APB1Periph_ALL 全部APB1外设时钟 0x3AFEC83F 例:
/* Enable BKP and PWR clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE);
函数原型如下: void RCC_APB1PeriphClockCmd(u32 RCC_APB1Periph, FunctionalState NewState) {
/* Check the parameters */
assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
//#define IS_RCC_APB1_PERIPH(PERIPH) ((((PERIPH) & 0xC50137C0) == 0x00) && ((PERIPH) != 0x00))
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
RCC->APB1ENR |= RCC_APB1P
RCC->APB1ENR &= ~RCC_APB1P
} } 返回值 先决条件 被调用函数 15.2.24 函数RCC_APB2PeriphResetCmd
Table 376. 函数RCC_APB2PeriphResetCmd 函数名 RCC_APB2PeriphResetCmd
void RCC_APB2PeriphResetCmd(u32 RCC_APB2Periph, 函数原形 FunctionalState NewState) 功能描述 强制或释放高速APB(APB2)外设复位 RCC_APB2Periph: APB2外设复位 输入参数 1 参阅Section:RCC_APB2Periph查阅更多该参数允许取值范围 NewState:指定APB2 外设复位的新状态 输入参数 2 参数取值:ENABLE或 DISABLE
输出参数 无 返回值 无 先决条件 无 被调用函数 无 例:

我要回帖

更多关于 verilog寄存器初始化 的文章

 

随机推荐