菜鸟初识STM32固件库文件夹

来源:互联网 发布:燕雀焉知鸿鹄之志 编辑:程序博客网 时间:2024/06/08 00:24

欢迎访问我的博客新地址:点击这里


ARM、TI、ST等公司在嵌入式学习者眼中的区别

ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI,ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。所以,任何一个做 芯片 (例如Cortex-M3),他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。所以你会发现,不同公司设计的 芯片(例如Cortex-M3)他们的端口数量,串口数量,控制方法这些都是有区别的,这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种内核芯片(例如Cortex-M3)的片上外设也会有很大的区别.通过ARM公司的《Cortex-M3 权威指南》中的一个图来了解一下:


CMSIS 标准

ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex  Microcontroller  Software  Interface  Standard )  ,翻译过来是“ARM Cortex™  微控制器软件接口标准”。 ST 官方库就是根据这套标准设计的。基于 CMSIS 应用程序基本结构:


CMSIS 分为 3 个基本功能层:

1)  核内外设访问层:ARM 公司提供的访问,定义处理器内部寄存器地址以及功能函数。
2)  中间件访问层:定义访问中间件的通用 API,也是 ARM 公司提供。
3)  外设访问层:定义硬件寄存器的地址以及外设的访问函数。
从图中可以看出, CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时操作系统用户程序调用的函数接口。如果没有 CMSIS 标准,那么各个芯片公司就会设计自己喜欢的风格的库函数,而 CMSIS 标准就是要强制规定,芯片生产公司设计的库函数必须按照 CMSIS 这套规范来设计。

一个简单通俗的例子

我们在使用 STM32 芯片的时候首先要进行系统初始化, CMSIS 规范就规定,系统初始化函数名字必须为 SystemInit,所以各个芯片公
司写自己的库函数的时候就必须用 SystemInit 对系统进行初始化。CMSIS 还对各个外设驱动文件的文件名字规范化,以及函数名字规范化等等一系列规定。上一节讲的函数GPIO_ResetBits 这个函数名字也是不能随便定义的,是要遵循 CMSIS 规范的。至于 CMSIS 的具体内容就不必多讲了,需要了解详细的朋友可以到网上搜索资料

STM32官方固件库包的结构

官方 V3.5 版本的固件库包的目录结构:



Libraries 文件夹

有 CMSIS 和 STM32F10x_StdPeriph_Driver 两个目录,这两个目录包含 固 件 库 核 心 的 所 有 子 文 件 夹 和 文 件 。 其 中 CMSIS 目 录 下 面 是 启 动 文 件 ,STM32F10x_StdPeriph_Driver 放的是 STM32 固件库源码文件。源文件目录下面的 inc 目录存放的是 stm32f10x_xxx.h 头文件,无需改动。src 目录下面放的是 stm32f10x_xxx.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应。这里的文件也是固件库的核心文件,每个外设对应的一组文件。

Project 文件夹

有两个文件夹,顾名思义, STM32F10x_StdPeriph_Examples 文件夹下面存放的的 ST 官方提供的固件实例源码,在以后的开发过程中,可以参考修改这个官方提供的实例来快速驱动自己的外设,很多开发板的实例都参考了官方提供的例程源码,这些源码对以后的学习非常重STM32F10x_StdPeriph_Template 文件夹下面存放的是工程模板。Utilities 文件下就是官方评估板的一些对应源码。

固件库的帮助文档

根目录中还有一个 stm32f10x_stdperiph_lib_um.chm 文件,直接打开可以知道,这个文档学习过程中非常有用

关键文件介绍

提供进入 M3 内核接口文件

位于\Libraries\CMSIS\CM3\CoreSupport 目录下面的core_cm3.c 和 core_cm3.h 文件。这是 ARM 公司提供,对所有 CM3 内核的芯片都一样,你永远都不需要修改这个文件!

启动文件以及比较基础的寄存器定义以及中断向量定义的文件

位于\Libraries\CMSIS\CM3\DeviceSupport目录下有三个文件:system_stm32f10x.c,  system_stm32f10x.h 以及 stm32f10x.h 文件。

system_stm32f10x.c,  system_stm32f10x.h文件

在这对文件里面有一个非常重要的 SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。

stm32f10x.h 文件

这个文件相当重要,只要你做 STM32 开发,你几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义申明以及包装内存操作········

启动文件

位于DeviceSupport\ST\STM32F10x \startup文件夹下,在\startup\arm 目录下,我们可以看到 8 个 startup 开头的.s 文件。这里之所以有 8 个启动文件,是因为对于不同容量的芯片启动文件不一样。对于 103 系列,主要是用其中 3 个启动文件:
startup_stm32f10x_ld.s     :  适用于小容量  产品
startup_stm32f10x_md.s  :  适用于中等容量产品
startup_stm32f10x_hd.s   :  适用于大容量产品
这里的容量是指 FLASH 的大小.判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH

对于本人使用的STM32-F103-ZET06属于大容量产品,所以做工程的时候选择startup_stm32f10x_hd.s文件

启动文件作用:打开启动文件看看:启动文件主要是进行堆栈之类的初始化, 中断向量表以及中断函数定义。启动文件要引导进入 main 函数。 Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。   跟踪工程,会发现Reset_handler 在我
们系统启动的时候会调用,下面让我们看看 Reset_handler 这段代码:
; Reset handler
Reset_Handler    PROC
EXPORT   Reset_Handler              [WEAK]
IMPORT   __main
IMPORT   SystemInit
LDR      R0, =SystemInit
BLX      R0            
LDR      R0, =__main
BX       R0
ENDP

据IMPORT   __main知道,这里导入 main 函数,同时在进入 main 函数之前,且调用 SystemInit 系统初始化函数。注释:引导程序进入__main(此__main是C_Library中的函数,非main()),这里启动文件只讲到这:详细可去搜索相应型号的芯片启动文件的解析

其他几个文件 stm32f10x_it.c,stm32f10x_it.h 以及 stm32f10x_conf.h 文件

 stm32f10x_it.c、stm32f10x_it.h顾名思义这对文件是用来中断服务函数,stm32f10x_conf.h(confer:参看文件打开可以看到一堆的#include,这里你建立工程的时候,可以注释掉一些你不用的外设头文件.