新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 啟動(dòng)順序以及系統(tǒng)時(shí)鐘設(shè)置

        stm32 啟動(dòng)順序以及系統(tǒng)時(shí)鐘設(shè)置

        作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏

        1.stm32的啟動(dòng)文件startup_stm32f10x_hd.s

        啟動(dòng)文件是在處理器復(fù)位之后最先運(yùn)行的一段匯編程序。在運(yùn)行C語(yǔ)言代碼之前,需要匯編為C語(yǔ)言建立一合適的環(huán)境啟動(dòng)文件的作用主要分為:
        1. 初始化堆棧指針。
        2. 初始化計(jì)數(shù)器指針。
        3. 設(shè)置堆棧的大小。
        4. 設(shè)置異常向量表的入口地址。
        5. 配置外部的SRAM作為數(shù)據(jù)存儲(chǔ)器。
        6. 設(shè)置C的入口的導(dǎo)入__main、__SystemInit。首先調(diào)用SystemInit()配置系統(tǒng)時(shí)鐘,然后進(jìn)入我們?cè)谑煜げ贿^(guò)的main函數(shù)。

        2啟動(dòng)文件中的系統(tǒng)時(shí)鐘配置

        我們會(huì)發(fā)現(xiàn)startup_stm32f10x_hd.s發(fā)現(xiàn)這一段匯編代碼:
        Reset_Handler PROC
        EXPORT Reset_Handler [WEAK]
        IMPORT __main
        IMPORT SystemInit
        LDR R0, =SystemInit
        BLX R0
        LDR R0, =__main
        BX R0
        ENDP
        下面就來(lái)剖析下這段匯編代碼,待處理器復(fù)位從外部導(dǎo)入__main,SystemInit函數(shù),首先是調(diào)用的是SystemInit函數(shù)。然后會(huì)跟蹤到System_stm32f10x.c文件。首先我們分析c文最開(kāi)始的代碼:
        #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
        //#define SYSCLK_FREQ_HSE HSE_VALUE
        //#define SYSCLK_FREQ_72MHz 72000000
        #else
        // #define SYSCLK_FREQ_HSE HSE_VALUE //對(duì)應(yīng)外部晶振不超頻(外部晶振是8MHZ)
        #define SYSCLK_FREQ_24MHz 24000000 //超頻到24MHZ
        /* #define SYSCLK_FREQ_36MHz 36000000 */ //超頻到36MHZ
        /* #define SYSCLK_FREQ_48MHz 48000000 */ //超頻到48MHZ
        /* #define SYSCLK_FREQ_56MHz 56000000 */ //超頻到56MHZ

        //#define SYSCLK_FREQ_72MHz 72000000 //超頻到72MHZ

        #endif
        是一段預(yù)編譯。而這里正是我們需要配置時(shí)鐘的大小。而定義宏定義變量實(shí)在我們keil里面配置的。如下圖


        而keil定義的stm32F10X_HD高速的芯片。而此時(shí)#define SYSCLK_FREQ_24MHz 24000000會(huì)被編譯。(如果說(shuō)在#id或#else沒(méi)有定義的變量。默認(rèn)的會(huì)啟動(dòng)芯片內(nèi)部的HIS高速時(shí)鐘)在SystemInit函數(shù)中又會(huì)調(diào)用SetSysClock();
        static void SetSysClock(void)
        {
        #ifdef SYSCLK_FREQ_HSE
        SetSysClockToHSE();
        #elif defined SYSCLK_FREQ_24MHz
        SetSysClockTo24();
        #elif defined SYSCLK_FREQ_36MHz
        SetSysClockTo36();
        #elif defined SYSCLK_FREQ_48MHz
        SetSysClockTo48();
        #elif defined SYSCLK_FREQ_56MHz
        SetSysClockTo56();
        #elif defined SYSCLK_FREQ_72MHz
        SetSysClockTo72();
        #endif
        }
        然后SetSysClockTo24();
        #else
        /* PLL configuration: = (HSE / 2) * 6 = 24 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_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6);
        #endif /* STM32F10X_CL */
        本設(shè)計(jì)中外部時(shí)鐘是采用8M晶振,首先對(duì)應(yīng)RCC_CFGR_PLLXTPRE_HSE_Div2(外部時(shí)鐘除以8/2=4M)然后RCC_CFGR_PLLMULL6(4*6=24M)這樣系統(tǒng)時(shí)鐘就是24MhZ。這樣超頻就已經(jīng)成功。補(bǔ)充:
        RCC->CR |= ((uint32_t)RCC_CR_HSEON); /*開(kāi)啟外部高速時(shí)鐘*/

        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /*AHB 分頻*/
        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /*APB2 分頻*/
        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1; /*APB1 分頻*/
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /*選擇PLL作為systick*/
        如果我們外部晶振采用12MHZ我們可以根據(jù)自己的需要修改(RCC_CFGR_PLLXTPRE_HSE_Div | RCC_CFGR_PLLMULL)進(jìn)行超頻到24MHZ.
        此時(shí)SystemInit函數(shù)調(diào)用結(jié)束。下面進(jìn)入到main()函數(shù)。


        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 贺兰县| 德化县| 奉新县| 阜新| 东丰县| 涿州市| 泸水县| 公主岭市| 普格县| 阿鲁科尔沁旗| 长丰县| 平舆县| 贡嘎县| 拜城县| 启东市| 密山市| 凤台县| 辽源市| 双辽市| 娱乐| 西青区| 综艺| 扎囊县| 南江县| 罗源县| 常德市| 岱山县| 沈阳市| 岳普湖县| 灵台县| 那曲县| 霍林郭勒市| 左权县| 渝中区| 平阴县| 运城市| 会昌县| 营山县| 延安市| 娄烦县| 铅山县|