//RCC的配置函數,這個函數配置STM32的時鐘,裡面的函數都為STM32的庫函數
void RCC_Configuration(void) {
/* RCC system reset(for debug purpose) */
/* 復位所有的RCC週邊設備寄存器,不改變內部高速振盪器調整位(HSITRIM[4..0])以及 備份域控制寄存器(RCC_BDCR),控制狀態寄存器RCC_CSR */
RCC_DeInit();
/* Enable HSE */
/* 開啟HSE振盪器 */
/*
三個參數
RCC_HSE_ON 開啟
RCC_HSE_OFF 關閉
RCC_HSE_BYPASS 使用外部時鐘振盪器
*/
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
/* HSEStartUpStatus為枚舉類型變數,2種取值,
0為ERROR,
非0為SUCCESS
等待HSE準備好,若超時時間到則退出*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 當HSE準備完畢切振盪穩定後 */
if(HSEStartUpStatus == SUCCESS) {
/* HCLK = SYSCLK */
/* 配置AHB時鐘,這個時鐘從SYSCLK分頻而來 分頻係數有1,2,4,8,16,64,128,256,512 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
/* 設置低速APB2時鐘,這個時鐘從AHB時鐘分頻而來 分頻係數為1,2,4,8,16 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
/* 設置低速APB1時鐘,這個時鐘從AHB時鐘分頻而來 分頻係數為1,2,4,8,16 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* PLLCLK = 8MHz * 9 = 72 MHz */
/* 設置PLL的時鐘源和乘法因數
第一個入口參數為時鐘源,共3個
RCC_PLLSource_HSI_Div2
RCC_PLLSource_HSE_Div1
RCC_PLLSource_HSE_Div2
乘法因數RCC_PLLMul_2~RCC_PLLMul_16,之間參數連續 */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
/* 輸入參數為ENABLE及DISABLE */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
}
/* Select PLL as system clock source */
/*選擇系統時鐘源,三個參數
RCC_SYSCLKSource_HSI 內部高速振盪器
RCC_SYSCLKSource_HSE 外部高速振盪器
RCC_SYSCLKSource_PLLCLK PLL時鐘 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
/* 返回系統當前的時鐘源 返回值有3種
0x00 HSI是當前時鐘源
0x04 HSE是當前時鐘源
0x08 PLL是當前時鐘源 */
while(RCC_GetSYSCLKSource() != 0x08){
}
}
/* Enable GPIOB, GPIOC and AFIO clocks */
/* 使能低速匯流排APB2上的週邊設備 這裡打開了IO埠B的時鐘
AFIO是重映射功能的時鐘,一般未使用REMAP功能時,此時鐘不必開啟
輸入參數見UM0472 PAGE 426 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
沒有留言:
張貼留言