新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 時鐘設置函數分析

        stm32 時鐘設置函數分析

        作者: 時間:2016-11-17 來源:網絡 收藏
        __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
        /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
        這個函數的主要目的是 設置以上4個時鐘的,那這四個時鐘主要是用來干什么的?
        這個后面再分析。
        先看怎么獲取72M的頻率
        /* Enable HSE */ 打開外部高速時鐘
        RCC->CR |= ((uint32_t)RCC_CR_HSEON);
        等待時鐘穩定
        /* Wait till HSE is ready and if Time out is reached exit */
        do
        {
        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
        } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
        if ((RCC->CR & RCC_CR_HSERDY) != RESET)
        {
        HSEStatus = (uint32_t)0x01;
        }
        else
        {
        HSEStatus = (uint32_t)0x00;
        }
        如果時鐘穩定了
        if (HSEStatus == (uint32_t)0x01)
        {
        /* Enable Prefetch Buffer */
        FLASH->ACR |= FLASH_ACR_PRFTBE;
        /* Flash 2 wait state */
        FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
        FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
        /* HCLK = SYSCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;///*!< SYSCLK not divided */
        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;///*!< HCLK not divided */
        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;///*!< HCLK not divided */
        #ifdef STM32F10X_CL
        這一段互聯型的產品的描述 刪掉
        #else
        開始設置倍頻 9倍頻
        /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
        RCC_CFGR_PLLMULL));
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
        #endif /* STM32F10X_CL */
        /* Enable PLL */ 打開PLL
        RCC->CR |= RCC_CR_PLLON;
        /* Wait till PLL is ready */ 等待PLL穩定
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }
        /* Select PLL as system clock source */ 選中PLL 作為時鐘源
        也就是切換系統時鐘
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
        /* Wait till PLL is used as system clock source */ 等待系統時鐘源的切換
        因為系統剛開始(從復位到這一步)不是以PLL作為時鐘源的。
        while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
        {
        }
        到這里,在來看剛剛開始問題/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
        這幾個時鐘 都是用來做什么的。
        配置情況
        /* HCLK = SYSCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;///*!< SYSCLK not divided */
        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;///*!< HCLK not divided */
        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;///*!< HCLK not divided */
        還是要看時鐘樹:
        時鐘樹:
        可以看出HCLK就是 AHB的時鐘
        PCLK2 就是APB2時鐘
        PCLK1 就是APB1時鐘 ,系統里面的注釋還有點錯誤,APB1應該=1/2 HCLk
        SYSCLK就是PLL時鐘輸入


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 济阳县| 乌拉特后旗| 开平市| 家居| 华安县| 石门县| 忻州市| 革吉县| 加查县| 五原县| 中山市| 西和县| 尚志市| 那曲县| 吐鲁番市| 开封县| 麻城市| 雅安市| 南江县| 尤溪县| 邮箱| 长沙县| 遂溪县| 呼伦贝尔市| 财经| 新津县| 高阳县| 九龙县| 安图县| 东莞市| 基隆市| 南漳县| 普兰县| 巨鹿县| 郁南县| 嘉鱼县| 通江县| 万州区| 西安市| 金寨县| 光山县|