天天看點

STM32F103内部晶振HSI倍頻設定系統時鐘

STM32F103内部晶振HSI倍頻設定系統時鐘

    首先說明,因為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就是系統時鐘的頻率了!我們序列槽輸出就可以了!

STM32F103内部晶振HSI倍頻設定系統時鐘
STM32F103内部晶振HSI倍頻設定系統時鐘

主函數代碼:

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)

STM32F103内部晶振HSI倍頻設定系統時鐘

 · E N D ·