//學(xué)習(xí)RCC的配置方法,以后可以直接用
本文引用地址:http://m.butianyuan.cn/article/201611/322895.htm#include"stm32f10x_lib.h"
//#defineSYSCLK_HSE
//#defineSYSCLK_FREQ_20MHz
//#defineSYSCLK_FREQ_36MHz//36MH工作
//#defineSYSCLK_FREQ_48MHz//48MH工作通過宏定義改變系統(tǒng)時鐘頻率
#defineSYSCLK_FREQ_72MHz//工作72MH
#defineDELAY_COUNT0xFFFFF
GPIO_InitTypeDefGPIO_InitStructure;//定義GPIO配置的結(jié)構(gòu)體變量,用于初始化設(shè)置GPIO
RCC_ClocksTypeDefRCC_ClockFreq;//定義RCC時鐘頻率配置的結(jié)構(gòu)體變量,用于配置RCC。包括SYSCLK,HCLK,PCLK1,PCLK2,ADCCLK頻率的設(shè)置
ErrorStatusHSEStartUpStatus;//定義枚舉類型的錯誤變量
//設(shè)置系統(tǒng)時鐘SYSCLK的函數(shù)
voidSetSysClock(void);
voidSetSysClockToHSE(void);
voidSetSysClockTo20(void);
voidSetSysClockTo36(void);
voidSetSysClockTo48(void);
voidSetSysClockTo72(void);
voidNVIC_Configuration(void);//配置嵌套向量中斷控制器函數(shù)
voidDelay(vu32nCount);//延遲
intmain(void)
{
#ifdefDEBUG
debug();
#endif
SetSysClock();//設(shè)置系統(tǒng)時鐘HCLKPCLK2PCLK1
RCC_GetClocksFreq(&RCC_ClockFreq);//獲得不同片上時鐘的頻率,RCC_ClockFreq為前面定義的時鐘頻率結(jié)構(gòu)體變量,該函數(shù)把當(dāng)前
//不同片上時鐘的頻率存放在結(jié)構(gòu)體RCC_ClockFreq中
RCC_ClockSecuritySystemCmd(ENABLE);//該函數(shù)使能或失能時鐘安全系統(tǒng)在這里是使能
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;//設(shè)置為推挽輸出模式
GPIO_Init(GPIOB,&GPIO_InitStructure);//用剛剛配置好的結(jié)構(gòu)體變量初始化PB口
GPIO_Write(GPIOB,GPIO_Pin_7|GPIO_Pin_9);//向GPIOB口寫入數(shù)據(jù)
//MCO:微控制器時鐘輸出時鐘能夠輸出到外部的MCO管腳,相關(guān)的GPIO管腳必須被配置成備用功能模式即AF模式
//在STM32F103C8中PA8為MCO管腳
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//選擇第8腳
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出模式
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA口
//在STM32F103C8中PA8為MCO管腳
RCC_MCOConfig(RCC_MCO_HSE);//選擇在MCO管腳上輸出的時鐘源參數(shù)設(shè)置指定輸出的時鐘源,可取值如下:
//RCC_MCO_NoClock:無時鐘被選中,RCC_MCO_SYSCLK:選中系統(tǒng)時鐘,RCC_MCO_HSI:選中HSI,RCC_MCO_HSE:選中HSE,RCC_MCO_PLLCLK_Div2:
//選中PLL時鐘除以2
//警告:當(dāng)選中系統(tǒng)時鐘作為MCO管腳的輸出時,注意它的時鐘頻率不超過50MHz(最大I/O速率)。
while(1)
{
GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//PB口的狀態(tài)取反
Delay(DELAY_COUNT);
}
}
voidSetSysClock(void)//設(shè)定系統(tǒng)時鐘頻率函數(shù)
{
#ifdefinedSYSCLK_HSE
SetSysClockToHSE();//系統(tǒng)時鐘頻率設(shè)為HSE
#elifdefinedSYSCLK_FREQ_20MHz
SetSysClockTo20();//系統(tǒng)時鐘頻率設(shè)為20MHz
#elifdefinedSYSCLK_FREQ_36MHz
SetSysClockTo36();//系統(tǒng)時鐘頻率設(shè)為36MHz
#elifdefinedSYSCLK_FREQ_48MHz
SetSysClockTo48();//系統(tǒng)時鐘頻率設(shè)為48MHz
#elifdefinedSYSCLK_FREQ_72MHz
SetSysClockTo72();//系統(tǒng)時鐘頻率設(shè)為72MHz
#endif
}
voidSetSysClockToHSE(void)//設(shè)置系統(tǒng)時鐘頻率為HSE的函數(shù)
{
//復(fù)位RCC外部設(shè)備寄存器到默認(rèn)值
RCC_DeInit();//將外設(shè)RCC寄存器重設(shè)為缺省值
RCC_HSEConfig(RCC_HSE_ON);//打開外部高速晶振HSE
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速時鐘準(zhǔn)備好
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能flash的預(yù)取功能
FLASH_SetLatency(FLASH_Latency_0);//設(shè)置flash代碼延時時鐘周期數(shù)為0
RCC_HCLKConfig(RCC_SYSCLK_Div1);//設(shè)置AHB時鐘等于系統(tǒng)時鐘
RCC_PCLK2Config(RCC_HCLK_Div1);//設(shè)置APB2時鐘頻率等于AHB時鐘
RCC_PCLK1Config(RCC_HCLK_Div1);//設(shè)置APB1時鐘頻率等于AHB時鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//設(shè)置系統(tǒng)時鐘為HSE
while(RCC_GetSYSCLKSource()!=0x04)//檢查系統(tǒng)時鐘是否為HSE0x04:HSE作為系統(tǒng)時鐘
{
}
}
else
{
while(1)
{
}
}
}
voidSetSysClockTo20(void)//設(shè)置系統(tǒng)時鐘頻率為20MHz
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_0);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);//HSE為8MHz設(shè)置PLL輸出頻率為20MHz
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL就緒
{
}
評論