第十一章:STM32学习之库目录、文件简介

先从官网下载STM32 的3.5 版库。

解压库文件后进入其目录:stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0


Libraries 文件夹下是驱动库源码和启动文件

Project 文件夹下是用驱动库写的一个例子和工程模板

库帮助文档,这是一个已经编译好的HTML 文件,主要讲述如何使用驱动库来编写自己的应用程序。

在使用库开发时,我们需要把Libraries 目录下的库函数文件添加到工程中,并查阅库帮助文档来了解ST 提供的库函数,这个文档说明了每一个库函数的使用方法。

进入Libraries 文件夹看到,关于内核与外设的库文件分别存放在CMSIS 和STM32F10x_StdPeriph_Driver 文件夹中。Libraries\CMSIS\CM3 文件夹下又分为CoreSupport 和DeviceSupport 文件夹。

1. core_cm3.c 文件
在CoreSupport 文件夹中的是位于CMSIS 标准的核内设备函数层的CM3 核通用的源文件core_cm3.c 和头文件core_cm3.h,它们的作用是为采用Cortex-M3 核设计SoC 的芯片商设计的芯片外设提供一个进入CM3 内核的接口。对于其他公司的CM3 系列芯片这两个文件也是相同的。至于这些功能是怎样用源码实现的,我们先不用理会,我们只需把这个文件加进我们的工程文件即可,有兴趣的朋友可以深究。

core_cm3.c 文件还有一些与编译器相关的条件编译语句,用于屏蔽不同编译器的差异,我们在开发时不需要知道,有兴趣可以了解一下。里面包含了一些与编译器相关的信息,如:RealView Compiler (MDK)、ICC Compiler (IAR)、GNU
Compiler。见代码清单


较重要的是在core_cm3.c 文件中包含了stdin.h 这个头文件,这是一个ANSI C 文件,是独立于处理器之外的,就像我们熟知的C 语言头文件stdio.h 文件一样。它位于RVMDK 这个软件的安装目录下,主要作用是提供一些新类型定义

代码清单 core_cm3.c 文件中的类型定义


这些新类型定义屏蔽了在不同芯片平台时,出现的诸如int 的大小是16 位还是32 位的差异。所以在我们以后的程序中,都将使用新类型如uint8_t 、uint16_t 等。

在稍旧版的程序中还经常会出现如u8、u16、u32 这样的类型,分别表示的无符号的8位、16 位、32 位整型。初学者碰到这样的旧类型感觉一头雾水,它们定义的位置在STM32f10x.h 文件中。建议在以后的新程序中尽量使用uint8_t 、uint16_t 类型的定义。

core_cm3.c 与启动文件一样都是底层文件,都是由ARM 公司提供的,遵守CMSIS 标准,即所有CM3 芯片的库都带有这个文件,这样软件在不同的CM3 芯片的移植工作就得以简化。

2. system_stm32f10x.c 文件

在DeviceSupport 文件夹下是启动文件,外设寄存器定义和中断向量定义成的一些文件,有ST公司提供

system_stm32f10x.c 文件是由ST 公司提供的,遵守CMSIS 标准,该文件的功能是设置系统时钟和总线时钟。

system_stm32f10x.c 文件是由ST 公司提供的,遵守CMSIS 标准,该文件的功能是设置系统时钟和总线时钟。STM32 比51 单片机复杂得多,并不是说我们外部给一个8M 的晶振,STM32 整个系统就以8M 为时钟协调整个处理器的工作。我们还要通过CM3 核的核内寄存器来对8M 的时钟进行倍频、分频,或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。



system_stm32f10x.c 在实现系统时钟的时候要用到PLL(锁相环),这就需要操作寄存器,寄存器都是以存储器映射的方式来访问的,所以该文件中包含了stm32f10x.h 这个头文件。

3. stm32f10x. h 文件
stm32f10x.h 这个文件非常重要,是一个非常底层的文件。它包含了STM32 中寄存器地址和结构体类型定义,在使用到STM32 固件库的地方都要包含这个头文件。

4. 启动文件
(1)启动文件的类型Libraries\CMSIS\Core\CM3\startup\arm 文件夹下是由汇编语言编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意!


 cl:互联型产品,stm32f105/107 系列
 vl:超值型产品,stm32f100 系列
 xl:超高密度(容量)产品,stm32f101/103 系列
 ld:低密度产品,FLASH 小于64K
 md:中等密度产品,FLASH=64 or 128
 hd:高密度产品,FLASH 大于128

(2)启动文件的作用
启动文件是任何处理器在上电复位之后最先运行的一段汇编程序。在我们编写的C 语言代码运行之前,需要由汇编语言为C 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要把启动文件添加到我们的工程中。

 初始化堆栈指针SP;
 初始化程序计数器指针PC;
 设置堆、栈的大小;
 设置异常向量表的入口地址;
 配置外部SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
 设置C 库的分支入口__main(最终用来调用main 函数);

 在3.5 版的启动文件还调用了在system_stm32f10x.c 文件中的SystemIni() 函数配置系统时钟,在旧版本的工程中要用户进入main 函数自己调用SystemIni() 函数。

5. STM32F10x_StdPeriph_Driver 文件夹
Libraries\STM32F10x_StdPeriph_Driver 文件夹下有inc(include 的缩写)和src(source的缩写)这两个文件夹,这都属于CMSIS 的设备外设函数部分。src 里面是每个设备外设的驱动程序,这些外设是芯片制造商在Cortex-M3 核外加进去的


在src 和inc 文件夹里的就是ST 公司针对每个STM32 外设而编写的库函数文件,每个外设对应一个.c 和.h 后缀的文件。我们把这类外设文件统称为:stm32f10x_ppp.c 或stm32f10x_ppp.h 文件,ppp 表示外设名称。

如针对模数转换(ADC)外设,在src 文件夹下有一个stm32f10x_adc.c 源文件,在inc 文件夹下有一个stm32f10x_adc.h 头文件,若我们开发的工程中用到了STM32 内部的ADC,则至少要把这两个文件包含到工程里


stm32f10x_conf.h 这个文件还可配置是否使用“断言”编译选项,在开发时使用“断言”可由编译器检查库函数传入的参数是否正确,软件编写成功后,去掉“断言”编译选项可使程序全速运行。可通过定义USE_FULL_ASSERT 或取消定义来配置是否使用“断
言”。


STM32 固件库文件间的关系
前面简单介绍了各个库文件的作用,库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。接下来从整体上把握一下各个文件在库工程中的层次或关系,这些文件都对应到CMSIS 标准架构上
下图 描述了STM32 固件库各文件之间的调用关系,这个图省略了DSP 核(Cortex-M3 没有DSP 核)和实时系统层的文件关系。在实际使用库开发工程的过程中,我们把位于CMSIS 层的文件包含进工程,丝毫不用修改,也不建议修改。
对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。



                 


如何使用库帮助文档?
官方资料是所有关于STM32 知识的源头,如何使用官方资料。官方的帮助手册是最好的教程,几乎包含了所有在开发过程中遇到的问题。

1. 常用官方资料
 《stm32f10x_stdperiph_lib_um.chm》这个就是前面提到的库帮助文档,在使用库函数时,我们最好通过查阅此文件来了解库函数原型或库函数调用的方法,也可以直接阅读源码里面的函数说明。
 《STM32 参考手册.pdf 》这个文件相当于STM32 的datasheet,它把STM32 的时钟、存储器架构及各种外设、寄存器都描述得清清楚楚。当我们对STM32 库函数的实现方式感到困惑时,可查阅这个文件。若以直接配置寄存器方式开发,查阅这个文档的频率会更高,但这样效率太低了。
 《Cortex-M3 权威指南》该手册是由ARM 公司提供的, 它详细讲解了Cortex 内核的架构和特性,要深入了解Cortex-M3 内核,这个文档是首选

怎么使用ST函数库

所谓库函数,就是STM32 固件库文件中为我们编写好的函数接口,我们只要调用这些库函数,就可以对STM32 进行配置,达到控制目的。我们可以不知道库函数是如何实现的,但我们调用函数必须要知道函数的功能、可传入的参数及其意义和函数的返回值。对ST库函数会查就行!所以我们学会查阅库帮助文档是很有必要的。打开库帮助文档stm32f10x_stdperiph_lib_um.chm


层层打开文档的目录标签Modules\STM32F10x_StdPeriph_Driver , 可看到STM32F10x_StdPeriph_Driver 标签下有很多外设驱动文件的名字MISC、ADC、BKP、CAN 等标签。我们试着查看ADC 的初始化库函数(ADC_Init) 看看, 继续打开标签
\ADC\ADC_Exported_Functions\Functions\ADC_Init


利用这个文档,我们即使没有去看它的具体代码,也知道要怎么利用它了。

如ADC_Init 的功能是:以ADC_InitStruct 参数配置ADC,进行初始化。原型为:void ADC_Init(ADC_TypeDef * ADCx , ADC_Init_TypeDef * ADC_InitStruct)其中输入的参数ADCx 和ADC_InitStruct 均为库文档中的自定义数据类型,这两个传入参数均为结构体指针。我们不知道ADC_TypeDef 这样的类型是什么意思,可以点击函数原型中带下划线的ADC_TypeDef 就可以查看这是什么类型了。

就这样初步了解一下库函数,读者就可以发现STM32 的库写得很优美。每个函数和数据类型都符合见名知义的原则,当然,这样的名称写起来特别长,而且对于我们来说要输入这么长的英文很容易出错,所以在开发软件的时候,在用到库函数的地方,直接把库帮助文档中函数名称复制粘贴到工程文件就可以了。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值