HSI基本知識
HSI是8MRC震盪電路,精度1%。
PLL的設置必須在其被激活前完成,輸出必須被設置溫48M或者72M
LSE:通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉。
如果相應的APB預分頻系數是1,定時器的時鍾頻率與所在APB總線頻率一致。
否則,定時器的時鍾頻率被設為與其相連的APB總線頻率的2倍
HSI + PLL 最高為64M(HSI / 2 * 16)。
寄存器的作用
時鍾控制寄存器RCC_CR:HSI/HSE/PLL使能和就緒,HSI時鍾校准。
時鍾配置寄存器(RCC_CFGR):時鍾切換和切換狀態標志,各種分頻器
時鍾中斷寄存器 (RCC_CIR):各種時鍾中斷和時鍾中斷標志。
APB2 外設復位寄存器 (RCC_APB2RSTR);APB1 外設復位寄存器 (RCC_APB1RSTR):各個外設接口的復位
AHB外設時鍾使能寄存器 (RCC_AHBENR);APB2 外設時鍾使能寄存器(RCC_APB2ENR);APB1 外設時鍾使能寄存器(RCC_APB1ENR):各個外設的使能。
HSI的配置,我這里用的是原庫,直接將 system_stm32f10x.c 中的 void SystemInit (void) 函數改成下邊的就可以了
void SystemInit (void){
RCC_DeInit();//將外設 RCC寄存器重設為缺省值
RCC_HSICmd(ENABLE);//使能HSI
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能或者失能預取指緩存(參數里是使能) -----加上這兩句才能到64M
FLASH_SetLatency(FLASH_Latency_2); //設置代碼延時值(參數里的是指2延時周期)
RCC_HCLKConfig(RCC_SYSCLK_Div1); //設置AHB時鍾 HCLK = SYSCLK/1
RCC_PCLK1Config(RCC_HCLK_Div4); //設置低速速AHB時鍾 -----這里頻率是48/4 = 12M 定時器2~7頻率是24M
RCC_PCLK2Config(RCC_HCLK_Div1); //設置高速AHB時鍾 -----這里頻率是48/1 = 48M
//設置 PLL 時鍾源及倍頻系數
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//使能或者失能 PLL,這個參數可以取:ENABLE或者DISABLE
RCC_PLLCmd(ENABLE);//如果PLL被用於系統時鍾,那么它不能被失能
//等待指定的 RCC 標志位設置成功 等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//設置系統時鍾(SYSCLK) 設置PLL為系統時鍾源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//選擇想要的系統時鍾
//等待PLL成功用作於系統時鍾的時鍾源
// 0x00:HSI 作為系統時鍾
// 0x04:HSE作為系統時鍾
// 0x08:PLL作為系統時鍾
while(RCC_GetSYSCLKSource() != 0x08);//需與被選擇的系統時鍾對應起來,RCC_SYSCLKSource_PLL
}
配置之后,不確定是否配置成功,可以只用庫函數中的時鍾頻率結構體,來查看系統各個時鍾頻率,在主函數中使用
int main( void ){
RCC_ClocksTypeDef RCC_Clocks; //時鍾頻率結構體
RCC_GetClocksFreq(&RCC_Clocks); //獲取各個時鍾頻率
printf("SYSCLK_Frequency is %d \r\n",RCC_Clocks.SYSCLK_Frequency); //SYSCLK_Frequency is 48000000
printf("HCLK_Frequency is %d \r\n",RCC_Clocks.HCLK_Frequency); //HCLK_Frequency is 48000000
printf("PCLK1_Frequency is %d \r\n",RCC_Clocks.PCLK1_Frequency); //PCLK1_Frequency is 12000000
printf("PCLK2_Frequency is %d \r\n",RCC_Clocks.PCLK2_Frequency); //PCLK2_Frequency is 48000000
printf("ADCCLK_Frequency is %d \r\n",RCC_Clocks.ADCCLK_Frequency); //ADCCLK_Frequency is 24000000
}
