天天看點

RCC 使用HSE/HSI配置系統時鐘時鐘樹

開發平台

野火F429開發闆

标準庫

配置系統時鐘首先要學會看時鐘樹,f429主頻為180MHZ

時鐘樹

檢視手冊 時鐘樹如下圖

RCC 使用HSE/HSI配置系統時鐘時鐘樹

現在我需要用到的時鐘總線主要是:AHB、APB1、APB2 其他的以後用到的時候再看吧

1.HSE外部高速時鐘信号

HSE由晶振提供,晶振又分有源晶振和無源晶振,無源晶振需要提供時鐘電路才可産生振蕩。

由圖中可以看到 OSC_OUT和OSC_IN,采用無源晶振時,時鐘從OSC_OUT和OSC_IN進入;

采用有源晶振從OSC_IN進入,OSC_OUT懸空。這裡使用無源晶振25MHZ

RCC 使用HSE/HSI配置系統時鐘時鐘樹

2.PLL鎖相環

HSE經過PLL 輸入分頻因子M(查手冊得 2~63),成為時鐘輸入VCO時鐘(1-2M),然後再經過倍頻因子N。成為VCO時鐘輸出 ,VCO時鐘必須在(192-423)之間(要想系統時鐘超頻,改變倍頻因子N),VCO時鐘輸出後由三個倍頻因子P(PLLCLOCK分頻因子)、Q(USB等時鐘分頻因子)、R(F429沒有不做解釋)

RCC 使用HSE/HSI配置系統時鐘時鐘樹

3.系統時鐘

PLLCLOCK作為系統時鐘,若HSE出現故障,PLL也會關閉,系統時鐘會切換成HSI知道HSE恢複

RCC 使用HSE/HSI配置系統時鐘時鐘樹

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);
    }
    
}
           

繼續閱讀