<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          1.stm32的啟動文件startup_stm32f10x_hd.s

          啟動文件是在處理器復(fù)位之后最先運(yùn)行的一段匯編程序。在運(yùn)行C語言代碼之前,需要匯編為C語言建立一合適的環(huán)境啟動文件的作用主要分為:
          1. 初始化堆棧指針。
          2. 初始化計數(shù)器指針。
          3. 設(shè)置堆棧的大小。
          4. 設(shè)置異常向量表的入口地址。
          5. 配置外部的SRAM作為數(shù)據(jù)存儲器。
          6. 設(shè)置C的入口的導(dǎo)入__main、__SystemInit。首先調(diào)用SystemInit()配置系統(tǒng)時鐘,然后進(jìn)入我們在熟悉不過的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
          下面就來剖析下這段匯編代碼,待處理器復(fù)位從外部導(dǎo)入__main,SystemInit函數(shù),首先是調(diào)用的是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 //對應(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ù)編譯。而這里正是我們需要配置時鐘的大小。而定義宏定義變量實在我們keil里面配置的。如下圖


          而keil定義的stm32F10X_HD高速的芯片。而此時#define SYSCLK_FREQ_24MHz 24000000會被編譯。(如果說在#id或#else沒有定義的變量。默認(rèn)的會啟動芯片內(nèi)部的HIS高速時鐘)在SystemInit函數(shù)中又會調(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è)計中外部時鐘是采用8M晶振,首先對應(yīng)RCC_CFGR_PLLXTPRE_HSE_Div2(外部時鐘除以8/2=4M)然后RCC_CFGR_PLLMULL6(4*6=24M)這樣系統(tǒng)時鐘就是24MhZ。這樣超頻就已經(jīng)成功。補(bǔ)充:
          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)進(jìn)行超頻到24MHZ.
          此時SystemInit函數(shù)調(diào)用結(jié)束。下面進(jìn)入到main()函數(shù)。


          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();