
首先說明,因為STM32晶片的型号不同,是以對于不同晶片有不同頻率的限制,比如某些時鐘頻率不能大于多少,這是根據手冊來設定的!但改變頻率的寄存器都一樣,隻是我們設定頻率大小要受晶片的限制!下面我用的晶片型号是STM32F103VBT6!它就限制了内部晶振的倍頻不能大于64MHz(但其實我實驗出來是52MHz)
本文是利用内部晶振(HSI)來倍頻,與外部晶振倍頻區分開!
第一步:打開system_STM32f10x.c,找到函數void SystemInit (void){},把原有的都注釋掉,将下面的代碼複制進去:
/* 開啟HSI 即内部晶振時鐘 */RCC->CR |= (uint32_t)0x00000001; /*選擇HSI為PLL的時鐘源HSI必須2分頻給PLL*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2; /*PLLCLK=8/2*13=52MHz 設定倍頻得到時鐘源PLL的頻率*/RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL13;/* PLL不分頻輸出 */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;/* 使能 PLL時鐘 */RCC->CR |= RCC_CR_PLLON;/* 等待PLL時鐘就緒*/while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* 選擇PLL為系統時鐘的時鐘源 */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* 等到PLL成為系統時鐘的時鐘源*/while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}
這段代碼其實就是是HSI倍頻成為PLL的時鐘源,又使PLL成為系統時鐘的時鐘源,這樣就相當于HSI倍頻後給系統時鐘了!
最後我用一個庫函數RCC_GetClocksFreq() 它是用來擷取各個時鐘的頻率的!他要先初始化,就在開始前利用RCC_ClocksTypeDef 來使他初始化,我們代碼是RCC_ClocksTypeDef RCC_Clocks,這樣RCC_Clocks.SYSCLK_Frequency就是系統時鐘的頻率了!我們序列槽輸出就可以了!
主函數代碼:
int main (void){ RCC_ClocksTypeDef RCC_Clocks; //初始化 SystemInit(); //調用剛才改過的函數 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Usart_Init(115200); //序列槽為了看資料而已 RCC_GetClocksFreq(&RCC_Clocks); //擷取各個時鐘頻率
while(1) { printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency); //printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency); }}
序列槽顯示:(我的實驗利用内部晶振最高隻能倍頻到52MHz)
· E N D ·