開發平台
野火F429開發闆
标準庫
配置系統時鐘首先要學會看時鐘樹,f429主頻為180MHZ
時鐘樹
檢視手冊 時鐘樹如下圖
現在我需要用到的時鐘總線主要是:AHB、APB1、APB2 其他的以後用到的時候再看吧
1.HSE外部高速時鐘信号
HSE由晶振提供,晶振又分有源晶振和無源晶振,無源晶振需要提供時鐘電路才可産生振蕩。
由圖中可以看到 OSC_OUT和OSC_IN,采用無源晶振時,時鐘從OSC_OUT和OSC_IN進入;
采用有源晶振從OSC_IN進入,OSC_OUT懸空。這裡使用無源晶振25MHZ
2.PLL鎖相環
HSE經過PLL 輸入分頻因子M(查手冊得 2~63),成為時鐘輸入VCO時鐘(1-2M),然後再經過倍頻因子N。成為VCO時鐘輸出 ,VCO時鐘必須在(192-423)之間(要想系統時鐘超頻,改變倍頻因子N),VCO時鐘輸出後由三個倍頻因子P(PLLCLOCK分頻因子)、Q(USB等時鐘分頻因子)、R(F429沒有不做解釋)
3.系統時鐘
PLLCLOCK作為系統時鐘,若HSE出現故障,PLL也會關閉,系統時鐘會切換成HSI知道HSE恢複
4.AHB時鐘總線HCLK
HCLK=SYSCLK,是以AHBPRESC不分頻
5.APB1時鐘總線PCLK1
APB1為低速時鐘總線一般 HCLK/4.四分頻
6.APB2時鐘總線PCLK2
APB2為高速時鐘總線一般 HCLK/2.二分頻
需要用到的分析完了,接下來就要寫程式
使用HSE/HSI配置系統時鐘
1.開啟HSE,等待HSE穩定(HSI首先要把RCC外設初始化成複位狀态)
RCC_HSEConfig(uint8_t RCC_HSE); RCC_WaitForHSEStartUp(void);
2.使能電源接口時鐘、設定調壓器輸出電壓級别,通常為1,以便器件在最大頻率實作性能和功耗平衡(這裡沒有函數可用要直接操作寄存器,檢視手冊APB1ENR寄存器、CR寄存器)
3.配置AHB APB1 APB2的分頻因子
RCC_HCLKConfig(uint32_t RCC_SYSCLK);
RCC_PCLK1Config(uint32_t RCC_HCLK);
RCC_PCLK2Config(uint32_t RCC_HCLK);
4.設定PLL時鐘來源(HSE/HSI)、分頻因子M(2-63)、倍頻因子N、PLLCKL分頻因子P、USB等分頻因子Q
RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ);
5.使能PLL,并等待穩定
RCC_PLLCmd(FunctionalState NewState);
6.開啟 OVER-RIDE模式,以能達到更高頻率(這裡也要直接操作寄存器CR 寄存器ODEN位)等待設定成功(CSR寄存器ODRDY)
7.切換到切換驅動模式(直接操作寄存器CR寄存器ODSWEN位)等待設定成功(CSR寄存器ODSWRDY)
8.配置FLASH預取指、指令緩存、資料緩存、和等待狀态(5個等待周期)(寄存器ACR)
9.把PLLCLK設定為SYSCK
RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
10.讀取時鐘狀态位,確定PLLCLK作為系統時鐘(作為系統時鐘數值為0X80)
RCC_GetSYSCLKSource(void);
代碼如下:
void SYSCLOCK_HSE_Config(uint32_t PLLM,uint32_t PLLN,uint32_t PLLP,uint32_t PLLQ)
{
uint32_t HSE_starupstatus=0;
/*啟動HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/*等待HSE啟動*/
HSE_starupstatus=RCC_WaitForHSEStartUp();
if(HSE_starupstatus==SUCCESS)
{
/*使能電源接口時鐘*/
RCC->APB1ENR=RCC_APB1ENR_PWREN;
/*設定調壓器輸出級别,設定為級别1*/
PWR->CR=PWR_CR_VOS;
/*設定AHB APB1 APB2的預分頻因子*/
/*AHB 180M*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/*APB1 45M*/
RCC_PCLK1Config(RCC_HCLK_Div4);
/*APB2 90M*/
RCC_PCLK2Config(RCC_HCLK_Div2);
/*設定PLL鎖相環的 M 分頻 P Q 倍頻因子*/
RCC_PLLConfig(RCC_PLLSource_HSE,PLLM,PLLN,PLLP,PLLQ);
/*使能PLL*/
RCC_PLLCmd( ENABLE);
/*等待PLL穩定*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
;
}
/*開啟 OVER-RIDE模式,以能達到更高頻率*/
PWR->CR=PWR_CR_ODEN;
while(PWR->CSR & PWR_CSR_ODRDY==0)
{
;
}
/*用于切換驅動模式*/
PWR->CR=PWR_CR_ODSWEN;
while(PWR->CSR & PWR_CSR_ODSWRDY==0)
{
;
}
/*設定FLASH 預取指 指令緩存 資料緩存 等待狀态為5個周期*/
FLASH->ACR=FLASH_ACR_PRFTEN|
FLASH_ACR_DCEN|
FLASH_ACR_ICEN|
FLASH_ACR_LATENCY_5WS;
/*把PLLCLOCK設定為SYSCLOCK*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/*讀取時鐘狀态位*/
while(RCC_GetSYSCLKSource()!=0x08)
{
;
}
}
/*HSE 啟動失敗*/
else
{
while(1);
}
}