RCC主要作用:时钟
设置SYSCLK 设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。
时钟树如图:
系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以
选择外部的、具失效监控的4~16MHz时钟;当检测到外部时钟失效时,它将被隔离,系统自动地切
换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对
PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。
多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频
率是36MHz。
编程要领:
1)开启HSE/HSI 等待HSE/HSI 稳定
2)设置AHB,APB2,APB1的预分频因子
3)设置PLL的时钟来源和PLL的倍频因子,各个频率主要在这里设置
4)开启PLL 等待PLL稳定
5)把PLLCK切换为系统时钟SYSCLK
6)读取时钟切换状态位,确保PLLCLK被选中为系统时钟
HSE配置系统时钟
#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"
void HSE_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
//把RCC外设初始化成复位状态
ErrorStatus HSEStatus;
//把RCC寄存器复位
RCC_DeInit();
//使能HSE,开启外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待HSE启动
HSEStatus=RCC_WaitForHSEStartUp();
//当HSE稳定之后继续往下执行
if(HSEStatus== SUCCESS )
{
//使能预取指
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//LATENCY:时延
//这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例
//000:零等待状态,当 0 < SYSCLK ≤ 24MHz
//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz
//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_x
RCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL时钟稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
{
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
}
else
{
}
}
void MCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启LED相关GPIO的外设时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//选择输出方式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚速率为50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
使用HSI作为系统时钟
#include "stm32f10x.h"
#include "bsp_rccclkconfig.h"
void HSI_SetSysClk(uint32_t RCC_PLLMul_x) //设置HSE为系统时钟
{
//把RCC外设初始化成复位状态
__IO uint32_t HSIStatus=0;
//把RCC寄存器复位
RCC_DeInit();
//使能HSI,开启外部晶振
RCC_HSICmd(ENABLE);
//等待HSE启动
HSIStatus =RCC->CR & RCC_CR_HSIRDY;
//当HSE稳定之后继续往下执行
if(HSIStatus== SUCCESS )
{
//使能预取指
FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//设置SYSCLK周期与flash的访问时间比例,这里为2
//设置成2的时候,SYSCLK低于48MHz也可以工作,设置成0或者1
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div2);
//配置PLLCLK = HSE *RCC_PLLMul_x
RCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL时钟稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET )
{
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
}
else
{
}
}
void MCO_GPIO_Config()
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启LED相关GPIO的外设时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
//选择控制的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//选择输出方式为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//设置引脚速率为50MHZ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数,初始化GPIO
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
上一篇:STM32-EXTI中断的分析及应用
下一篇:【菜鸟入门】stm32 之 pwm
推荐阅读最新更新时间:2024-11-11 09:21