新闻中心

EEPW首页>嵌入式系统>设计应用> stm32 启动顺序以及系统时钟设置

stm32 启动顺序以及系统时钟设置

作者: 时间:2016-11-18 来源:网络 收藏

1.stm32的启动文件startup_stm32f10x_hd.s

启动文件是在处理器复位之后最先运行的一段汇编程序。在运行C语言代码之前,需要汇编为C语言建立一合适的环境启动文件的作用主要分为:
  1. 初始化堆栈指针
  2. 初始化计数器指针。
  3. 设置堆栈的大小。
  4. 设置异常向量表的入口地址。
  5. 配置外部的SRAM作为数据存储器。
  6. 设置C的入口的导入__main、__SystemInit。首先调用SystemInit()配置系统时钟,然后进入我们在熟悉不过的main函数。

2启动文件中的系统时钟配置

我们会发现startup_stm32f10x_hd.s发现这一段汇编代码:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
下面就来剖析下这段汇编代码,待处理器复位从外部导入__main,SystemInit函数,首先是调用的是SystemInit函数。然后会跟踪到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函数中又会调用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)这样系统时钟就是24MhZ。这样超频就已经成功。补充:
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我们可以根据自己的需要修改(RCC_CFGR_PLLXTPRE_HSE_Div | RCC_CFGR_PLLMULL)进行超频到24MHZ.
此时SystemInit函数调用结束。下面进入到main()函数。


评论


技术专区

关闭