在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > stm32 啟動順序以及系統(tǒng)時鐘設置

            stm32 啟動順序以及系統(tǒng)時鐘設置

            作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏

            1.stm32的啟動文件startup_stm32f10x_hd.s

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

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

            我們會發(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
            下面就來剖析下這段匯編代碼,待處理器復位從外部導入__main,SystemInit函數(shù),首先是調用的是SystemInit函數(shù)。然后會跟蹤到System_stm32f10x.c文件。首先我們分析c文最開始的代碼:
            #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 //對應外部晶振不超頻(外部晶振是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
            是一段預編譯。而這里正是我們需要配置時鐘的大小。而定義宏定義變量實在我們keil里面配置的。如下圖


            而keil定義的stm32F10X_HD高速的芯片。而此時#define SYSCLK_FREQ_24MHz 24000000會被編譯。(如果說在#id或#else沒有定義的變量。默認的會啟動芯片內部的HIS高速時鐘)在SystemInit函數(shù)中又會調用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 */
            本設計中外部時鐘是采用8M晶振,首先對應RCC_CFGR_PLLXTPRE_HSE_Div2(外部時鐘除以8/2=4M)然后RCC_CFGR_PLLMULL6(4*6=24M)這樣系統(tǒng)時鐘就是24MhZ。這樣超頻就已經(jīng)成功。補充:
            RCC->CR |= ((uint32_t)RCC_CR_HSEON); /*開啟外部高速時鐘*/

            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)進行超頻到24MHZ.
            此時SystemInit函數(shù)調用結束。下面進入到main()函數(shù)。


            評論


            技術專區(qū)

            關閉