新闻中心

EEPW首页>嵌入式系统>设计应用> STM32固件库V3.5.0的CMSIS文件详细说明

STM32固件库V3.5.0的CMSIS文件详细说明

作者: 时间:2016-11-28 来源:网络 收藏
1.首先选择启动文件:根据自己所用芯片的型号,选择正确的启动文件。例如选择STM32F107系列的处理器,我们就选择startup_stm32f10x_hd.s。在这个文件里首先要定义自己堆栈的大小,根据自己的需要确定。文件中已经定义好了中断向量的位置及堆栈的初始化操作。

Reset_HandlerPROC

本文引用地址://m.amcfsurvey.com/article/201611/322716.htm

EXPORTReset_Handler[WEAK]

IMPORT__main

IMPORTSystemInit

LDRR0, =SystemInit

BLXR0

LDRR0, =__main

BXR0

ENDP

通过上面的代码可以看到先执行SystemInit()函数在进入main()函数。SystemInit()函数在文件system_stm32f10x.c中有定义。

2.:这个头文件包含了STM32的大部份定义:

① 定义了芯片的类型,例如:#define STM32F10X_CL

② 定义是否包含标准外设库,#definedUSE_STDPERIPH_DRIVER

③ 定义外部振荡器频率,#definedHSE_VALUE

上面的三个定义,最好在编译器选项中定义好,这样就不用修改stm32f10x.h文件,最好不要修改这个文件。

④ 采用枚举的方式定义中断号。

⑤ 包含core_cm3.h,system_stm32f10x.h。

#include "core_cm3.h"

#include "system_stm32f10x.h"

#include

⑥ 定义数据类型,例如:typedef uint32_tu32此外还定义了FlagStatus,ITStatus及ErrorStatus等。

⑦ 定义外设结构体,地址及用到的常量。

⑧ 包含stm32f10x_conf.h来配置外设。

#ifdef USE_STDPERIPH_DRIVER

#include "stm32f10x_conf.h"

#endif

⑨ 定义位操作的宏。

3.system_stm32f10x.h和system_stm32f10x.c,这两个文件中:

① 定义一个全局变量:extern uint32_t SystemCoreClock:系统时钟频率与此变量的选择有关。

#ifdef SYSCLK_FREQ_HSE

uint32_t SystemCoreClock= SYSCLK_FREQ_HSE;

#elif defined SYSCLK_FREQ_24MHz

uint32_t SystemCoreClock= SYSCLK_FREQ_24MHz;

#elif defined SYSCLK_FREQ_36MHz

uint32_t SystemCoreClock= SYSCLK_FREQ_36MHz;

#elif defined SYSCLK_FREQ_48MHz

uint32_t SystemCoreClock= SYSCLK_FREQ_48MHz;

#elif defined SYSCLK_FREQ_56MHz

uint32_t SystemCoreClock= SYSCLK_FREQ_56MHz;

#elif defined SYSCLK_FREQ_72MHz

uint32_t SystemCoreClock= SYSCLK_FREQ_72MHz;

#else

uint32_t SystemCoreClock= HSI_VALUE;

#endif

② SystemInit():这个函数就是启动文件中调用的函数。

③ SystemCoreClockUpdate():更新SystemCoreClock的值,与系统频率一致。

注:利用此文件设置系统的时钟具有一定的局限性,所以在编写程序时建议不要用他,而利用标准外设库中的stm32f10x_rcc中的函数进行设置。

4.stm32f10x_conf.h

配置需要的标准外设库,将不需要用到的外设库屏蔽掉。

定义assert_Param的模式,选择#define USE_FULL_ASSERT时,断言输出问题所在的位置,在调试时很有用。

5.core_cm3:与CM3内核相关的操作

6. stm32f10x_it中断实现,在这里编写相应的中断服务函数。

7.还需要注意的一点是:进入main函数后,除了设置嘀嗒时钟和中断外,在操作各外设之前,调用:RCC_AHBPeriphClockCmd(),RCC_APB1PeriphClockCmd(),RCC_APB2PeriphClockCmd(),启动相应的时钟,否则外设就不能正常工作。



评论


技术专区

关闭