STM32固件库V3.5.0的CMSIS文件解析
1.首先选择启动文件:根据自己所用芯片的型号,选择正确的启动文件。例如选择STM32F107系列的处理器,我们就选择startup_stm32f10x_hd.s。在这个文件里首先要定义自己堆栈的大小,根据自己的需要确定。文件中已经定义好了中断向量的位置及堆栈的初始化操作。
/* Reset handler*/
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInitsystem的头文件
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
通过上面的代码可以看到先执行SystemInit()函数在进入main()函数。SystemInit()函数在文件system_stm32f10x.c中有定义。
2.stm32f10x.h:这个头文件包含了STM32的大部份定义:
① 定义了芯片的类型,例如:#define STM32F10X_CL
② 定义是否包含标准外设库,#defined USE_STDPERIPH_DRIVER
③ 定义外部振荡器频率,#defined HSE_VALUE
上面的三个定义,最好在编译器选项中定义好,这样就不用修改stm32f10x.h文件,最好不要修改这个文件。
④ 采用枚举的方式定义中断号。
⑤ 包含core_cm3.h,system_stm32f10x.h。
#include "core_cm3.h"
#include "system_stm32f10x.h"
#include <stdint.h>
⑥ 定义数据类型,例如:typedef uint32_t u32此外还定义了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:系统时钟频率与此变量的选择有关。
/**********************************************************
* Clock Definitions
*********************************************************/
#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
1 配置需要的标准外设库,将不需要用到的外设库屏蔽掉。
2 定义assert_Param的模式,选择#define USE_FULL_ASSERT时,断言输出问题所在的位置,在调试时很有用。
5.core_cm3:与CM3内核相关的操作
6. stm32f10x_it中断实现,在这里编写相应的中断服务函数。
7.还需要注意的一点是:进入main函数后,除了设置嘀嗒时钟和中断外,在操作各外设之前,调用:RCC_AHBPeriphClockCmd(),RCC_APB1PeriphClockCmd(),RCC_APB2PeriphClockCmd(),启动相应的时钟,否则外设就不能正常工作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论