一:学习的原因
1.1 嵌入式技术知识结构
嵌入式是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。
嵌入式开发的技术人员需要对计算机技术的各个方面都有了解,而在这个体系之中,每一个小部分又可以单独做出一番,因此嵌入式的技术要求比较高。
图1-1 嵌入式技术知识结构
1.2 CMSIS标准
我们知道由ST公司生产的STM32采用的是Cortex-M3内核,内核是 整个微控制器的CPU。该内核是ARM公司设计的一个处理器体系架构, ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其他芯片 生产厂商如TI,负责设计的是在内核之外的部件,被称为核外外设或 片上外设、设备外设。如芯片内部的模数转换外设ADC、串口UART、定 时器TIM等。
内核与外设,类似PC上的CPU与主板、内存、显卡、硬盘的关系, 见图1-2。
图1-2 内核与外设的关系
因为基于Cortex的某系列芯片采用的内核都是相同的,区别主要 为核外的片上外设的差异,这些差异却导致软件在同内核、不同外设 的芯片上移植困难。为了解决不同芯片厂商生产的Cortex微控制器软 件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(Cortex Microcontroller Software Interface Standard)。
所谓CMSIS标准,实际是新建了一个软件抽象层,见图1-3。
图1-3 CMSIS架构
CMSIS标准中最主要的是CMSIS核心层,它包括:
内核函数层:其中包含用于访问内核寄存器的名称、地址定义, 主要由ARM公司提供。
设备外设访问层:提供了片上的核外外设的地址和中断定义,主 要由芯片生产商提供。
可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片 生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单 的处理器软件接口,屏蔽了硬件差异,这对软件的移植有极大的好 处。STM32固件库就是按照CMSIS标准建立的。
二:库目录,文件简介
本次讲解用STM32的3.5版本的库,这个库可以直接从官网进行下载,也可以通过我分享的链接进行下载。
STM32的3.5版本的库下载链接:https://pan.baidu.com/s/1KxA1ZgRO6p3Cjez-ajV18Q?pwd=tong 提取码:tong
解压库文件后进入其目录:
图2-1 STM32固件库目录
Libraries文件夹下是驱动库的源代码及启动文件。
Project文件夹下是用驱动库写的例子和一个工程模板。
库帮助文档,这是一个已经编译好的HTML文件,主要讲述如何使 用驱动库来编写自己的应用程序。
在使用库开发时,我们需要把Libraries目录下的库函数文件添加 到工程中,并查阅库帮助文档来了解ST提供的库函数,这个文档说明 了每一个库函数的使用方法。
进入Libraries文件夹看到,关于内核与外设的库文件分别存放在 CMSIS和STM32F10x_StdPeriph_Driver文件夹中。 Libraries\CMSIS\CM3文件夹下又分为CoreSupport和DeviceSupport文 件夹。
2.1 core_cm3.c文件
在CoreSupport文件夹中的是位于CMSIS标准的核内设备函数层的 CM3核通用的源文件core_cm3.c和头文件core_cm3.h,它们的作用是为 采用Cortex-M3核设计SoC的芯片商设计的芯片外设提供一个进入CM3内 核的接口。对于其他公司的CM3系列芯片这两个文件也是相同的。
较重要的是在core_cm3.c文件中包含了stdin.h这个头文件,这是 一个ANSI C文件,是独立于处理器之外的,就像我们熟知的C语言头文 件stdio.h文件一样。它位于RVMDK这个软件的安装目录下,主要作用 是提供一些新类型定义。
2.2 stm32f10x.h文件
stm32f10x. h这个文件非常重要,是一个非常底层的文件。它包 含了STM32中寄存器地址和结构体类型定义,在使用到STM32固件库的 地方都要包含这个头文件。
2.3 启动文件
2.3.1 名称
Libraries\CMSIS\Core\CM3\startup\arm文件夹下是由汇编语言 编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意。
文件名的英文缩写的意义如下:
cl:互联型产品,stm32f105/107系列。
vl:超值型产品,stm32f100系列。
xl:超高密度(容量)产品,stm32f101/103系列。
ld:低密度产品,Flash小于64KB。
md:中等密度产品,Flash等于64KB或128KB。
hd:高密度产品,Flash大于128KB。
2.3.2 作用
启动文件是任何处理器在上电复位之后最先运行的一段汇编程 序。在我们编写的C语言代码运行之前,需要由汇编语言为C语言的运 行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要 把启动文件添加到我们的工程中。
总的来说,启动文件的作用是:
初始化堆栈指针SP。 初始化程序计数器指针PC。 设置堆、栈的大小。 设置异常向量表的入口地址。 配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板 没有外部SRAM)。 设置C库的分支入口__main(最终用来调用main函数)。
3.5版的启动文件还调用了在system_stm32f10x.c文件中的 SystemIni()函数配置系统时钟,在旧版本的工程中要用户进入main函 数自己调用SystemIni()函数。
固件库里还有很多文件分别有着不同的作用,还需要大家自己慢慢了解,慢慢使用。无他,唯手熟尔,乃卖油翁之说。