//学习RCC的配置方法,以后可以直接用
#include"stm32f10x_lib.h"
//#defineSYSCLK_HSE
//#defineSYSCLK_FREQ_20MHz
//#defineSYSCLK_FREQ_36MHz//36MH工作
//#defineSYSCLK_FREQ_48MHz//48MH工作通过宏定义改变系统时钟频率
#defineSYSCLK_FREQ_72MHz//工作72MH
#defineDELAY_COUNT0xFFFFF
GPIO_InitTypeDefGPIO_InitStructure;//定义GPIO配置的结构体变量,用于初始化设置GPIO
RCC_ClocksTypeDefRCC_ClockFreq;//定义RCC时钟频率配置的结构体变量,用于配置RCC。包括SYSCLK,HCLK,PCLK1,PCLK2,ADCCLK频率的设置
ErrorStatusHSEStartUpStatus;//定义枚举类型的错误变量
//设置系统时钟SYSCLK的函数
voidSetSysClock(void);
voidSetSysClockToHSE(void);
voidSetSysClockTo20(void);
voidSetSysClockTo36(void);
voidSetSysClockTo48(void);
voidSetSysClockTo72(void);
voidNVIC_Configuration(void);//配置嵌套向量中断控制器函数
voidDelay(vu32nCount);//延迟
intmain(void)
{
#ifdefDEBUG
debug();
#endif
SetSysClock();//设置系统时钟HCLKPCLK2PCLK1
RCC_GetClocksFreq(&RCC_ClockFreq);//获得不同片上时钟的频率,RCC_ClockFreq为前面定义的时钟频率结构体变量,该函数把当前
//不同片上时钟的频率存放在结构体RCC_ClockFreq中
RCC_ClockSecuritySystemCmd(ENABLE);//该函数使能或失能时钟安全系统在这里是使能
NVIC_Configuration();
//开启GPIOA和GPIOB模块时钟使能APB2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//选择6,7,8,9引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO速度为50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置为推挽输出模式
GPIO_Init(GPIOB,&GPIO_InitStructure);//用刚刚配置好的结构体变量初始化PB口
GPIO_Write(GPIOB,GPIO_Pin_7|GPIO_Pin_9);//向GPIOB口写入数据
//MCO:微控制器时钟输出时钟能够输出到外部的MCO管脚,相关的GPIO管脚必须被配置成备用功能模式即AF模式
//在STM32F103C8中PA8为MCO管脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//选择第8脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA口
//在STM32F103C8中PA8为MCO管脚
RCC_MCOConfig(RCC_MCO_HSE);//选择在MCO管脚上输出的时钟源参数设置指定输出的时钟源,可取值如下:
//RCC_MCO_NoClock:无时钟被选中,RCC_MCO_SYSCLK:选中系统时钟,RCC_MCO_HSI:选中HSI,RCC_MCO_HSE:选中HSE,RCC_MCO_PLLCLK_Div2:
//选中PLL时钟除以2
//警告:当选中系统时钟作为MCO管脚的输出时,注意它的时钟频率不超过50MHz(最大I/O速率)。
while(1)
{
GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//PB口的状态取反
Delay(DELAY_COUNT);
}
}
voidSetSysClock(void)//设定系统时钟频率函数
{
#ifdefinedSYSCLK_HSE
SetSysClockToHSE();//系统时钟频率设为HSE
#elifdefinedSYSCLK_FREQ_20MHz
SetSysClockTo20();//系统时钟频率设为20MHz
#elifdefinedSYSCLK_FREQ_36MHz
SetSysClockTo36();//系统时钟频率设为36MHz
#elifdefinedSYSCLK_FREQ_48MHz
SetSysClockTo48();//系统时钟频率设为48MHz
#elifdefinedSYSCLK_FREQ_72MHz
SetSysClockTo72();//系统时钟频率设为72MHz
#endif
}
voidSetSysClockToHSE(void)//设置系统时钟频率为HSE的函数
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//打开外部高速晶振HSE
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能flash的预取功能
FLASH_SetLatency(FLASH_Latency_0);//设置flash代码延时时钟周期数为0
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟等于系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置APB2时钟频率等于AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div1);//设置APB1时钟频率等于AHB时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//设置系统时钟为HSE
while(RCC_GetSYSCLKSource()!=0x04)//检查系统时钟是否为HSE0x04:HSE作为系统时钟
{
}
}
else
{
while(1)
{
}
}
}
voidSetSysClockTo20(void)//设置系统时钟频率为20MHz
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();