为什么会有固件库
对于51核的8位单片机我们在进行开发时,我们是直接进行配置单片机的寄存器,控制芯片的工作方式。只要我们明白寄存器各位的功能和设置方法,直接进行赋值就可以了。 不存在固件库的问题。那么使用ARM 32位 CORTEX -M3核心的STM32芯片为什么有固件库呢? 当然在使用STM32时也可以像51那样脱离固件库,自己进行配置开发。 对于SMT32因为其外设资源非常的丰富,必然带来寄存器的数量十分庞大并且比较复杂,这时直接配置寄存器方式的就会带来: 开发速度慢 程序可读性差 这两个缺陷会直接影响开发效率,程序的维护和交流。而库开发方式能很好的弥补这两个缺陷。 两种思路的对比: 相对于库开发的方式,直接配置寄存器的方式生成的代码量的确会少一点,但是SMT32有充足的资源,权衡库的优势与不足,绝大部分时候,我们愿意牺牲一点资料,选择库开发。 一般只在对代码运行时间要求极其苛刻的地方,才使用直接配置寄存器的方式替代。如频繁调用中断服务程序。 STM32结构及库层次关系 基于CORTEX的某系列芯片采用的内核都是相同的,区别是核外的片上外设的差异,这些差异导致软件在同内核,不同外设的芯片上移植的困难。为解决不同芯片厂商生产的CORTEX微控制器软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准。即 Cortex MicroController software Interface Standard ;CORTEX 微控制器软件接口标准 CMSIS包括了: 内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。 设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。 CMSIS层位于硬件层与操作系统或用户层之间,提供了芯片生产商无关的硬件抽象层,可以为借口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。 STM32的库,就是按照CMSIS标准建立的。 固件库主要文件说明: -htmresc: LOGO Libraries : 驱动库的源代码及启动文件 Project :用驱动库写的例子个一个工程模板 Utilities:基于STM官方开发板的例子 Release_Notes.html:库版本更新说明 stm32f10x_stdperiph_lib_um.chm:库帮助文件 Core_cm3.c和core_cm3.h 作用:为采用CORTEX—M3核的芯片商设计的芯片外设提供一个进入M3内核的接口。 只要是采用了M3的核,不同公司的芯片的这两个文件是相同。 这两个文件在我们的工程文件是不可缺少的。 System_stm32f10x.c文件 是由ST公司提供的。功能是设置系统时钟和总线时钟。M3比51单片机复杂的多,它不像51直接接一个8M的晶振就可以工作了,我们还要通过M3核的核内寄存器对8M的时钟进行倍频、分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率相关,所以这个文件的时钟配置是很关键的。 在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来进行访问的,所以该文件中包含了stm32f10x.h这个头文件。 Stm32f10x.h文件 是一个很重要很底层的文件 所有的处理器厂商都会将对内存的操作封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环境中。这样在开发自己的应用程序时只要将这个文件包含进来就可以了。 启动文件 Libraries/CMSIS/core/CM3/startup/arm文件夹下由汇编编写的系统启动文件,不同的文件对应不同的芯片型号。 文件名的英文缩写的意义如下: Cl:互联型产片,STM32F105/107系列 Vl: 超值型产品,STM32F100系列 Xl: 超高容量产品,STM32F101/103系列 Ld: 低密度产品,FLASH小于64K Md: 中密度产品,FLASH=64 or 128K Hd: 高密度产品,FLASH大于128K 启动文件是任何处理器在上电复位后最先运行的一段汇编程序。在我们编写的C代码开始运行之前,需要由汇编语言为C语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以要把启动文件添加进我们的工程中去。 启动文件的作用: 1、初始化堆栈指针SP; 2、初始化程序计数器指针PC; 3、设置堆、栈的大小 4、设置异常向量表的入口地址 5、配置外部SRAM作为数据存储器 6、设置C库的分支入口___main 7、在3.5版本的启动文件中还调用了在system_stm32f10x.c文件中的SystemIni()函数配置系统时钟,在旧的版本中需要用户进入main函数自己调用这个函数。 Inc和src 位于libraries/STM32F10X_StdPeriph_Driver文件夹下,inc即include的缩写,src即source的缩写。属于CMSIS的设备外设函数部分。这些外设是芯片制造商在M3核外加进去的。 在src和inc文件夹中是ST公司针对每个STM32外设编写的库函数文件,每个外设对应一个.c和.h文件。在进行开发时,可以用到那个模块就将那两个文件包含到工程中。 还有一个很特别的misc.c文件,这个文件提供了外设对内核的NVIC(中断向量控制器)的访问函数 ,在配置中断时,必须把这个文件添加到工程中。 Stm32f10x_it.c 和 stm32f10x_conf.h文件 Stm32f10x_it.c ,专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常的接口,其他的普通中断服务函数由我们自己添加。这些中断函数的入口不是我们随意可以定的,可以去汇编启动文件中找到。 stm32f10x_conf.h,这个文件被包含进stm32f10x.h文件。用来配置使用了什么外设的头文件,用这个头文件可以很方便的增加或删除外设驱动函数库。 库文件之间的关系 库文件直接包含进工程即可,有些文件则需要我们根据使用到的功能进行配置。 各个文件在库工程中的层次或关系 stm32f10x_stdperiph_lib_um.chm:库帮助文件 库函数就是STM32的库文件中为我们编写好的函数接口,我们只要调用这些库函数,就能对STM32进行配置,达到控制的目的。 调用函数式必须知道:函数的功能、可传入的参数及其意义和函数的返回值。 库函数提供的函数的数量也是极其庞大的,这时就需要好好的利用这个库帮助文件,进行查找。同时由于每个函数和数据类型都是按照“见名知义”的原则编写的,这样名称比较长,在进行输入时很容易出错,也可以在开发软件时,在用到库函数的时候,直接把帮助文件中的函数复制到工程文件中,避免出错。 以上内容节选至《野火》,感谢分享。 看了STM32的库才发现,原来嵌入式C语言程序应该这样来编写,可以如此的简洁流畅与优美。对一个系统架构的构思,对每个细节表达,对指针,变量,函数,纯熟的应用。对库的编写者深深折服,看到了大师的风范。相见恨晚。
|