新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習筆記——RCC系統時鐘配置

        STM32學習筆記——RCC系統時鐘配置

        作者: 時間:2016-11-28 來源:網絡 收藏
        //學習RCC的配置方法,以后可以直接用

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

        #include"stm32f10x_lib.h"

        //#defineSYSCLK_HSE

        //#defineSYSCLK_FREQ_20MHz

        //#defineSYSCLK_FREQ_36MHz//36MH工作

        //#defineSYSCLK_FREQ_48MHz//48MH工作通過宏定義改變系統時鐘頻率

        #defineSYSCLK_FREQ_72MHz//工作72MH

        #defineDELAY_COUNT0xFFFFF

        GPIO_InitTypeDefGPIO_InitStructure;//定義GPIO配置的結構體變量,用于初始化設置GPIO

        RCC_ClocksTypeDefRCC_ClockFreq;//定義RCC時鐘頻率配置的結構體變量,用于配置RCC。包括SYSCLK,HCLK,PCLK1,PCLK2,ADCCLK頻率的設置

        ErrorStatusHSEStartUpStatus;//定義枚舉類型的錯誤變量

        //設置系統時鐘SYSCLK的函數

        voidSetSysClock(void);

        voidSetSysClockToHSE(void);

        voidSetSysClockTo20(void);

        voidSetSysClockTo36(void);

        voidSetSysClockTo48(void);

        voidSetSysClockTo72(void);

        voidNVIC_Configuration(void);//配置嵌套向量中斷控制器函數

        voidDelay(vu32nCount);//延遲

        intmain(void)

        {

        #ifdefDEBUG

        debug();

        #endif

        SetSysClock();//設置系統時鐘HCLKPCLK2PCLK1

        RCC_GetClocksFreq(&RCC_ClockFreq);//獲得不同片上時鐘的頻率,RCC_ClockFreq為前面定義的時鐘頻率結構體變量,該函數把當前

        //不同片上時鐘的頻率存放在結構體RCC_ClockFreq中

        RCC_ClockSecuritySystemCmd(ENABLE);//該函數使能或失能時鐘安全系統在這里是使能

        NVIC_Configuration();

        //開啟GPIOAGPIOB模塊時鐘使能APB2時鐘

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//選擇6,7,8,9引腳

        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO速度為50MHz

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//設置為推挽輸出模式

        GPIO_Init(GPIOB,&GPIO_InitStructure);//用剛剛配置好的結構體變量初始化PB口

        GPIO_Write(GPIOB,GPIO_Pin_7|GPIO_Pin_9);//向GPIOB口寫入數據

        //MCO:微控制器時鐘輸出時鐘能夠輸出到外部的MCO管腳,相關的GPIO管腳必須被配置成備用功能模式即AF模式

        //在STM32F103C8中PA8為MCO管腳

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//選擇第8腳

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出模式

        GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA口

        //在STM32F103C8中PA8為MCO管腳

        RCC_MCOConfig(RCC_MCO_HSE);//選擇在MCO管腳上輸出的時鐘源參數設置指定輸出的時鐘源,可取值如下:

        //RCC_MCO_NoClock:無時鐘被選中,RCC_MCO_SYSCLK:選中系統時鐘,RCC_MCO_HSI:選中HSI,RCC_MCO_HSE:選中HSE,RCC_MCO_PLLCLK_Div2:

        //選中PLL時鐘除以2

        //警告:當選中系統時鐘作為MCO管腳的輸出時,注意它的時鐘頻率不超過50MHz(最大I/O速率)。

        while(1)

        {

        GPIO_Write(GPIOB,(u16)~GPIO_ReadOutputData(GPIOB));//PB口的狀態取反

        Delay(DELAY_COUNT);

        }

        }

        voidSetSysClock(void)//設定系統時鐘頻率函數

        {

        #ifdefinedSYSCLK_HSE

        SetSysClockToHSE();//系統時鐘頻率設為HSE

        #elifdefinedSYSCLK_FREQ_20MHz

        SetSysClockTo20();//系統時鐘頻率設為20MHz

        #elifdefinedSYSCLK_FREQ_36MHz

        SetSysClockTo36();//系統時鐘頻率設為36MHz

        #elifdefinedSYSCLK_FREQ_48MHz

        SetSysClockTo48();//系統時鐘頻率設為48MHz

        #elifdefinedSYSCLK_FREQ_72MHz

        SetSysClockTo72();//系統時鐘頻率設為72MHz

        #endif

        }

        voidSetSysClockToHSE(void)//設置系統時鐘頻率為HSE的函數

        {

        //復位RCC外部設備寄存器到默認值

        RCC_DeInit();//將外設RCC寄存器重設為缺省值

        RCC_HSEConfig(RCC_HSE_ON);//打開外部高速晶振HSE

        HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速時鐘準備好

        if(HSEStartUpStatus==SUCCESS)

        {

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能flash的預取功能

        FLASH_SetLatency(FLASH_Latency_0);//設置flash代碼延時時鐘周期數為0

        RCC_HCLKConfig(RCC_SYSCLK_Div1);//設置AHB時鐘等于系統時鐘

        RCC_PCLK2Config(RCC_HCLK_Div1);//設置APB2時鐘頻率等于AHB時鐘

        RCC_PCLK1Config(RCC_HCLK_Div1);//設置APB1時鐘頻率等于AHB時鐘

        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);//設置系統時鐘為HSE

        while(RCC_GetSYSCLKSource()!=0x04)//檢查系統時鐘是否為HSE0x04:HSE作為系統時鐘

        {

        }

        }

        else

        {

        while(1)

        {

        }

        }

        }

        voidSetSysClockTo20(void)//設置系統時鐘頻率為20MHz

        {

        RCC_DeInit();

        RCC_HSEConfig(RCC_HSE_ON);

        HSEStartUpStatus=RCC_WaitForHSEStartUp();

        if(HSEStartUpStatus==SUCCESS)

        {

        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        FLASH_SetLatency(FLASH_Latency_0);

        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        RCC_PCLK2Config(RCC_HCLK_Div1);

        RCC_PCLK1Config(RCC_HCLK_Div1);

        RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);//HSE為8MHz設置PLL輸出頻率為20MHz

        RCC_PLLCmd(ENABLE);//使能PLL

        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL就緒

        {

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: SHOW| 富顺县| 望江县| 柘城县| 民权县| 论坛| 通山县| 马尔康县| 临汾市| 磐安县| 新龙县| 勐海县| 铜梁县| 黄骅市| 密云县| 芦溪县| 平度市| 嘉定区| 中西区| 师宗县| 永丰县| 邳州市| 台东县| 成武县| 洞口县| 阿鲁科尔沁旗| 巫溪县| 石楼县| 精河县| 苍山县| 巴里| 长乐市| 玛沁县| 新余市| 贵州省| 玉树县| 平山县| 临漳县| 锡林浩特市| 大悟县| 株洲县|