<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

我們會(huì )發(fā)現startup_stm32f10x_hd.s發(fā)現這一段匯編代碼:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
下面就來(lái)剖析下這段匯編代碼,待處理器復位從外部導入__main,SystemInit函數,首先是調用的是SystemInit函數。然后會(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 //對應外部晶振不超頻(外部晶振是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
是一段預編譯。而這里正是我們需要配置時(shí)鐘的大小。而定義宏定義變量實(shí)在我們keil里面配置的。如下圖


而keil定義的stm32F10X_HD高速的芯片。而此時(shí)#define SYSCLK_FREQ_24MHz 24000000會(huì )被編譯。(如果說(shuō)在#id或#else沒(méi)有定義的變量。默認的會(huì )啟動(dòng)芯片內部的HIS高速時(shí)鐘)在SystemInit函數中又會(huì )調用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晶振,首先對應RCC_CFGR_PLLXTPRE_HSE_Div2(外部時(shí)鐘除以8/2=4M)然后RCC_CFGR_PLLMULL6(4*6=24M)這樣系統時(shí)鐘就是24MhZ。這樣超頻就已經(jīng)成功。補充:
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我們可以根據自己的需要修改(RCC_CFGR_PLLXTPRE_HSE_Div | RCC_CFGR_PLLMULL)進(jìn)行超頻到24MHZ.
此時(shí)SystemInit函數調用結束。下面進(jìn)入到main()函數。


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>