STM32时钟RCC详解(二)

发布者:brian808090最新更新时间:2018-10-17 来源: eefocus关键字:STM32  时钟  RCC 手机看文章 扫描二维码
随时随地手机看文章

一、RCC寄存器介绍:

typedef struct

{

  __IO uint32_t CR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t BDCR;

  __IO uint32_t CSR;

#ifdef STM32F10X_CL 

  __IO uint32_t AHBRSTR;

  __IO uint32_t CFGR2;

#endif

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)  

  uint32_t RESERVED0;

  __IO uint32_t CFGR2;

#endif

} RCC_TypeDef;

1、时钟控制寄存器(RCC_CR):(复位值为0x0000 xx83,内部低速时钟使能和就绪,内部时钟校准)

主要功能:内外部高速时钟的使能和就绪标志(含内部高速时钟校准调整),外部高速时钟旁路,时钟安全系统CSS使能,PLL使能和PLL就绪标志。

2、时钟配置寄存器(RCC_CFGR):(复位值为0x0000 0000)

主要功能:系统时钟源切换及状态,AHB、APB1、APB2、ADC、USB预分频,PLL输入时钟源选择及HSE输入PLL分频选择,PLL倍频系数,MCO(PA8)引脚微控制器时钟输出。

3、时钟中断寄存器 (RCC_CIR):(复位值: 0x0000 0000)

主要功能:LSI、LSE、HIS、HSE、PLL就绪中断标志,HSE时钟失效导致时钟安全系统中断标志,LSI、LSE、HIS、HSE、PLL就绪中断使能,清除LSI、LSE、HIS、HSE、PLL就绪中断,清除时钟安全系统中断。

4、APB2外设复位寄存器 (RCC_APB2RSTR):(复位值: 0x0000 0000)

主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3复位。

5、APB1外设复位寄存器 (RCC_APB1RSTR) :(复位值: 0x0000 0000)

主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC复位。

6、AHB外设时钟使能寄存器 (RCC_AHBENR) :(复位值: 0x0000 0014睡眠模式时SRAM、闪存接口电路时钟开启)

主要功能:DMA1、DMA2、SRAM、FLITF、CRC、FSMC、SDIO时钟使能。

7、APB2外设时钟使能寄存器(RCC_APB2ENR) :(复位值: 0x0000 0000)

主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3时钟使能。

8、APB1外设时钟使能寄存器(RCC_APB1ENR) :(复位值: 0x0000 0000)

主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC时钟使能。

9、备份域控制寄存器 (RCC_BDCR) :(复位值: 0x0000 0000)

主要功能:外部低速振荡器使能和就绪标志及旁路、RTC时钟源选择和时钟使能、备份域软件复位。

10、控制/状态寄存器 (RCC_CSR) :(复位值: 0x0C00 0000 NRST引脚复位标志、上电/掉电复位标志)

主要功能:内部低速振荡器就绪、清除复位标志、NRST引脚复位标志、上电/掉电复位标志、软件复位标志、独立看门狗复位标志、窗口看门狗复位标志、低功耗复位标志。

二、RCC初始化设置

采用8MHz 外部HSE 时钟,在 MDK 编译平台中,程序的时钟设置参数流程如下:

将 RCC 寄存器重新设置为默认值:RCC_DeInit();

打开外部高速时钟晶振 HSE :    RCC_HSEConfig(RCC_HSE_ON);

等待外部高速时钟晶振工作:       HSEStartUpStatus = RCC_WaitForHSEStartUp();

设置 AHB 时钟 (HCLK) :          RCC_HCLKConfig(RCC_SYSCLK_Div1);

       设置APB 2时钟 (APB2) :    RCC_PCLK2Config(RCC_HCLK_Div1);

       设置APB1 时钟 (APB1) :    RCC_PCLK1Config(RCC_HCLK_Div2);

       设置 PLL :       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

打开 PLL :                                  RCC_PLLCmd(ENABLE);

等待 PLL 工作:    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

设置系统时钟:    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

判断 PLL 是否是系统时钟:        while(RCC_GetSYSCLKSource() != 0x08);

1、使用库函数进行时钟系统初始化配置

void RCC_config() //如果外部晶振为8M,PLLCLK=SYSCLK=72M,HCLK=72M,//P2CLK=72M,P1CLK=36M,ADCCLK=36M,USBCLK=48M,TIMCLK=72M

{

       ErrorStatus HSEStartUpStatus; // 定义错误状态变量

       RCC_DeInit();    //将RCC寄存器重新设置为默认值

       RCC_HSEConfig(RCC_HSE_ON); //打开外部高速时钟晶振

       HSEStartUpStatus = RCC_WaitForHSEStartUp();    // 等待外部高速时钟晶振工作

       if(HSEStartUpStatus == SUCCESS)

       {

       RCC_HCLKConfig(RCC_SYSCLK_Div1);  //设置AHB不分频,HCLK=SYSCLK

       RCC_PCLK2Config(RCC_HCLK_Div1);    //设置APB2不分频,P2CLK=HCLK

       RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1 为2分频,P1CLK=HCLK/2

       FLASH_SetLatency(FLASH_Latency_2);   //设置FLASH代码延时

       FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存

       RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);    //设置PLL时钟源,外部时钟不分频,

                                         为HSE的9倍频8MHz * 9 = 72MHz

 

       RCC_PLLCmd(ENABLE);  //使能PLL

       while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  //等待PLL准备就绪

       RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //设置PLL为系统时钟源

       while(RCC_GetSYSCLKSource() != 0x08);  //判断PLL是否是系统时钟

       }

            

}

2、使用寄存器进行RCC时钟初始化配置

void RCC_init(u8 PLL)//输入PLL的倍频值2—16倍频

//HCLK=PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=USBCLK*2/3

{

       unsigned char temp=0;  

       //RCC_DeInit();              //将RCC寄存器重新设置为默认值

       RCC->CR|=0x00010000;  //外部高速时钟使能HSEON

       while(!(RCC->CR>>17)); //等待外部时钟就绪

       RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;

       PLL-=2;//抵消2个单位

       RCC->CFGR|=PLL<<18;   //设置PLL倍频值 2~16

       RCC->CFGR|=1<<16;     //PLL时钟源选择

       FLASH->ACR|=0x32;     //FLASH 2个延时周期

       RCC->CR|=0x01000000;  //PLLON

       while(!(RCC->CR>>25));  //等待PLL锁定

       RCC->CFGR|=0x00000002;  //PLL作为系统时钟      

       while(temp!=0x02)     //等待PLL作为系统时钟设置成功

       {  

              temp=RCC->CFGR>>2;

              temp&=0x03;

       }   

}


关键字:STM32  时钟  RCC 引用地址:STM32时钟RCC详解(二)

上一篇:STM32时钟RCC详解(四)
下一篇:STM32时钟RCC详解(一)

推荐阅读最新更新时间:2024-03-16 16:16

SPI协议内容及STM32 SPI的操作
SPI总线协议简介及内容 简介 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全/半双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 SPI特征 3根/4根线全双工同步传输 8或16位传输帧格式选择 主从操作模式 支持多主操作模式 从模式频率(最大为fpclk/2) 可编程的时钟极性和相位 可编程的数据顺序,MSB在前或LSB在前 可触发中断的专用发送和标志 SPI总线忙状态标志 支持可靠通信的C
[单片机]
SPI协议内容及<font color='red'>STM32</font> SPI的操作
STM8与汇编语言(13)--修改CPU的时钟
在有些单片机的应用系统中,并不需要CPU运行在多高的频率。在低频率下运行,芯片的功耗会大大下降。因此希望单片机能提供这个功能,STM8单片机确实有这个功能,并且修改也非常方便。 下面的实验程序首先将CPU的运行时钟设置在8MHZ,然后快速闪烁LED指示灯。接着,通过修改主时钟的分频系数和CPU时钟的分频系数,将CPU时钟频率设置在500KHZ,然后再慢速闪烁LED指示灯。通过观察LED指示灯的闪烁频率,可以看到,同样的循环代码,由于CPU时钟频率的改变,闪烁频率和时间长短都发生了变化。 同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。 stm8/ #inc
[单片机]
STM32 HAL库 硬件I2C 从机主机防BUG程序
前言 最近死磕了5天的STM32F1硬件I2C从机的程序,天天早上8点到凌晨,几乎全程心流状态。终于在结合各方资料及自己的思考后,做出了稳定的硬件I2C代码(这个文章中应该是目前为止能查到的最详述可用的硬件I2C代码),经过I2C主机发出的各种奇怪的信号蹂躏后,通讯都可以恢复正常,不会被卡死。证明该方案拥有极高稳定性。 需要注意我这次使用的是 STM32F103C8T6 的兼容型号 GD32F103C8T6 。要问他的兼容性有多强,连I2C bug都能做到一样,哈哈。我当初用GD想着硬件I2C应该能舒服用了,万万没想到,兆易连i2c 硬件BUG都复制了。 大家不要纠结于单片机的型号,我推测应该STM32FXXX 家族硬件I
[单片机]
<font color='red'>STM32</font> HAL库 硬件I2C 从机主机防BUG程序
担心STM32时钟PLL各参数配错吗?
有些朋友不理解为什么STM32时钟要先倍频N倍,再分频?你会担心这个值太大吗? 1写在前面 STM32时钟的功能,可以说是越来越强大了。 从各个系列的时钟树可以看得出来,最早F1系列的时钟功能相对比较简单,到这后面H7、G0的时钟越来越丰富。 今天讲述一下其中的PLL环节。 2关于PLL 什么是PLL? PLL:Phase Locked Loop锁相环。 PLL用于振荡器中的反馈技术,通常需要外部的输入信号与内部的振荡信号同步。 一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,由相应的器件VCO,实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时钟信号。 ---来自百度百科 每一块STM3
[单片机]
担心<font color='red'>STM32</font><font color='red'>时钟</font>PLL各参数配错吗?
STM32——时钟
高速–外部时钟外接晶振 高速–内部时钟 低速–外部时钟LSE:外接晶振 低速–内部时钟LSI:RC震荡 锁相环倍频输出 PLLclk和PLL48ck的来源 主 PLL 时钟第一个高速时钟输出 PLLP 的计算方法 我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=336, 分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为: 如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为 168MHz。 这对于我们后面的实验都是采用这样的配置。
[单片机]
<font color='red'>STM32</font>——<font color='red'>时钟</font>
STM32串口使用详解
一、关于串口需要了解的几个知识点: 1.波特率:在串行通讯中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称为波特率。 波特率决定了串口传输的速度,1波特=1bps(位/秒)。波特率为9600的话就是1s传输9600位的数据。 串口的传输与网络等其他的传输有着相似之处,比如常用的wifi,区别在与这些网络的单位是k,只有串口是按位来计数的。 2.单工,半双工,全双工: 单工:只能一个方向传输 半双工:可以两个方向传输,但需要分时复用 全双工:两个方向传输 二、初始化函数 串口的初始化包括以下几部分: 1.时钟初始化: RCC_APB2PeriphClockCmd(RCC_APB2Per
[单片机]
STM32单片机的通用定时器
STM32中的定时器有多种,按功能分成2个高级控制器定时器,4个普通定时器,2个基本定时器,2个看门狗定时器,1个系统滴答定时器SysTick。 定时器的关键是定时时间的计算。比如用定时器控制继电器的开关的时候,需要延时一段时间才关闭或者开启,这时候离不开定时器定时。 通用定时器定时时间计算。1秒中断的基本实现: 通用定时器模块的入口时钟经过分频得到计数器的时钟,用CK_CNT表示,预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时,表示不分频,=1时,2分频。以此类推。 公式为:CK_CNT=fclk_PSC/(PSC +1),其中PSC最大为65535. 其次是TIM5计数器的计数值的设置,TIM5计数器以
[单片机]
CDC706 – 可定制编程的 3-PLL 时钟合成器/乘法器/除法器
CDC706 是目前市场上体积最小且功能强大的 PLL 合成器/乘法器/除法器之一。尽管其物理外形非常小巧,但却极为灵活。该器件能够在特定输入频率下生成几乎独立的输出频率。 输入频率可通过 LVCMOS、差动输入时钟或单个晶振产生。通过 SMBus 数据接口控制器可以选择相应的输入波形。 为了获得独立的输出频率,每个 PLL 的参考除法器 M 都能设置于 1 至 511 的范围内,反馈除法器 N 则可设置于 1 到 4095 的范围内。然后将 PLL-压控振荡器 (VCO) 频率路由至可自由编程的输出开关矩阵,再路由至 6 个输出中的任意一个。开关矩阵包括一个附加的 7 位后除法器(范围为 1 到 127)以及一个针对每个输出的
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved