首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的时钟系统RCC详细整理(3)

STM32的时钟系统RCC详细整理(3)

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引脚复位标志、上电/掉电复位标志、软件复位标志、独立看门狗复位标志、窗口看门狗复位标志、低功耗复位标志。

三、初始化设置

采用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()//如果外部晶振为8MPLLCLK=SYSCLK=72MHCLK=72M//P2CLK=72MP1CLK=36MADCCLK=36MUSBCLK=48MTIMCLK=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时钟源,

//外部时钟不分频,为HSE9倍频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是否是系统时钟


}

/*RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE); //
打开
PB

PD
用于点亮
LED
*/

}
继承事业,薪火相传
返回列表