STM32之系統(tǒng)時(shí)鐘的建立
這里必須闡明系統(tǒng)時(shí)鐘的簡歷對于系統(tǒng)運(yùn)行的重要性。系統(tǒng)所有的運(yùn)行都是建立在時(shí)鐘的正常運(yùn)行上的,沒有穩(wěn)健的系統(tǒng)時(shí)鐘,就不可能有穩(wěn)定的系統(tǒng)。
在系統(tǒng)中,復(fù)位后首要的任務(wù)是建立系統(tǒng)時(shí)鐘,以下是建立系統(tǒng)時(shí)鐘的基本步驟:
1. 將所有的RCC外設(shè)寄存器重設(shè)為默認(rèn)值;
2.啟用外部高速晶振;
3.等待,知道外部高速晶振穩(wěn)定;
4.設(shè)置欲取指緩存使能和代碼延時(shí)值;
5.設(shè)置AHB(HCLK)等于系統(tǒng)時(shí)鐘;
6.設(shè)置高速APB2(PCLK2)為系統(tǒng)時(shí)鐘;
7.設(shè)置低速APB1(PCLK1)為系統(tǒng)時(shí)鐘的1/2,APB2最高是38MHz;
8.設(shè)置PLL時(shí)鐘源及倍頻系數(shù),使能PLL,經(jīng)過PLL被頻后最高時(shí)鐘只能72MHz;
9.等待PLL初始化;
10.設(shè)置PLL為系統(tǒng)時(shí)鐘;
11.等待PLL成功作為系統(tǒng)時(shí)鐘源。
以下通過實(shí)例代碼表征上述的使用方法。主要就是根據(jù)以上的系統(tǒng)時(shí)鐘配置的順序來做代碼處理:
ErrorStatus HSEStatusUpStatus;
//將外設(shè)RCC寄存器重設(shè)為默認(rèn)值
RCC_DeInit();
//設(shè)置外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待HSE起振
HSEStatusUpStatus = RCC_WaitForHSEStatusUp();
if(HSEStatusUpStatus == SUCESS)
{
//預(yù)取指緩存使能
FLASH_PrefetchBufferCmd(FLASH_PertchBuffer_Enable);
//設(shè)置代碼延時(shí)值,F(xiàn)LASH_Latency_2,2 延時(shí)周期
FLASH_SetLatency(FLASH_Latency_2);
//設(shè)置AHB時(shí)鐘(HCLK)
//RCC_SYSCLK_Div1 AHB 時(shí)鐘 = 系統(tǒng)時(shí)鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//設(shè)置高速AHB2為系統(tǒng)時(shí)鐘
RCC_PCLK2Config(RCC_HCLK_Div1);
//設(shè)置低速AHB時(shí)鐘
RCC_PCLK2Config(RCC_HCLK_Div2);
//設(shè)置PLL時(shí)鐘
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(enable);
// 等待指定RCC標(biāo)志位設(shè)置成功,等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//設(shè)置PLL為系統(tǒng)時(shí)鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK)
//0x00 HSI,0X04 HSE,0X08 PLL
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}