新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32F103x RCC寄存器配置

        STM32F103x RCC寄存器配置

        作者: 時間:2016-11-11 來源:網絡 收藏
        rccresetandclockcontrol 復位及時鐘控制

        本文引用地址:http://www.104case.com/article/201611/317023.htm

        主要是設置時鐘樹中的內容,如下圖所示:

        具體在RCC_Configuration函數中的體現。

        第一步:系統時鐘選擇哪個,HSE、HSI還是PLLCLK。

        RCC_HSEConfig(RCC_HSE_ON); //使用HSE

        如果HSE時鐘已經穩定,硬件會將RCC_CR的HSERDY位置1。

        第二步:判斷HSE時鐘是否穩定

        if(RCC_WaitForHSEStartUp()==SUCCESS)

        第三步:使能FLASH的預取址緩沖區,并設置FLASH的等待狀態。(具體功能見FLASH部分)

        /*EnablePrefetchBuffer*/

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /*Flash2waitstate*/

        FLASH_SetLatency(FLASH_Latency_2);

        第四步:設置AHB預分頻系數。預分頻系數可以是1、2、4、8、16、32、64、128、256

        /*HCLK=SYSCLK*/

        RCC_HCLKConfig(RCC_SYSCLK_Div1);//沒分頻

        第五步:設置APB2的預分頻系數,來確定PCLK2頻率。預分頻系數可以是1、2、4、8、16

        /*PCLK2=HCLK*/

        RCC_PCLK2Config(RCC_HCLK_Div1);//沒分頻

        第六步:設置APB1的預分頻系數,來確定PCLK1頻率。預分頻系數可以是1、2、4、8、16

        /*PCLK1=HCLK/2*/

        RCC_PCLK1Config(RCC_HCLK_Div2);//2分頻

        第七步:設置PLL的時鐘源,以及PLL的倍頻系數,來確定PLLCLK頻率。

        /*PLLCLK=8MHz*9=72MHz*/

        RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

        第八步:使能PLL。將RCC_CR的PLLON位置1。

        /*EnablePLL*/

        RCC_PLLCmd(ENABLE);

        如果PLL鎖定后,硬件會將RCC_CR的PLLRDY位置1。

        第九步:等待PLL鎖定。

        /*WaittillPLLisready*/

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}

        第十步:選擇PLL作為SYSCLK(系統時鐘源)

        /*SelectPLLassystemclocksource*/

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        第十一步:將程序中用到的外設時鐘打開,統一都放在此處。

        例如:將GPIO外設時鐘打開。

        /* Enable GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        RCC_Configuration函數具體代碼如下:

        /*******************************************************************************
        * Function Name : RCC_Configuration
        * Description : Configures the different system clocks.
        * Input : None

        * Return : None
        *******************************************************************************/
        void RCC_Configuration(void)
        {
        ErrorStatus HSEStartUpStatus;

        /* RCC system reset(for debug purpose) */
        RCC_DeInit();

        /* Enable HSE */
        RCC_HSEConfig(RCC_HSE_ON);

        /* Wait till HSE is ready */
        HSEStartUpStatus = RCC_WaitForHSEStartUp();

        if(HSEStartUpStatus == SUCCESS)
        {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        /* Enable PLL */
        RCC_PLLCmd(ENABLE);

        /* Wait till PLL is ready */
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while(RCC_GetSYSCLKSource() != 0x08) {}

        /* Enable GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 赞皇县| 五指山市| 突泉县| 武宁县| 凯里市| 南昌市| 临猗县| 连云港市| 邻水| 成都市| 芦山县| 札达县| 日土县| 类乌齐县| 拜城县| 达孜县| 余庆县| 县级市| 衡山县| 枞阳县| 余姚市| 嘉峪关市| 三原县| 宜都市| 花莲县| 泌阳县| 朝阳县| 茂名市| 南京市| 甘泉县| 普陀区| 福贡县| 太谷县| 汕尾市| 石屏县| 商洛市| 城步| 辽源市| 灌云县| 托克托县| 陈巴尔虎旗|