STM32库开发实战指南(光盘内容另行下载,地址见书封底)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-22 06:24:51

点击下载

作者:刘火良,杨森

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

STM32库开发实战指南(光盘内容另行下载,地址见书封底)

STM32库开发实战指南(光盘内容另行下载,地址见书封底)试读:

前言

单片机是对8/16位MCU(微控制器)的另外一种叫法。传统的8/16位单片机,久经岁月的洗礼,仍然在工业控制应用中大放光芒。然而,现在的工程师面对的更多的工业控制产品需求是多功能、易用界面、低功耗以及多任务等。基于这样的需求,以往的8/16位单片机已不能满足要求,工程师必须寻找新的符合要求的MCU。工程师虽然可以选择诸如ARM7、ARM9这类速度更快的32位MCU,但是鉴于对成本和开发门槛等种种考虑,它们还是不能满足需求。正是看准了这个市场,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU——STM32。STM32凭借其产品线的多样化、极高的性价比、简单易用的开发方式,迅速在众多Cortex-M3 MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,颇有星火燎原之势,这与它倡导的基于固件库的开发方式密不可分。采用库开发的方式可以快速上手,仅通过调用库里面的API(应用程序接口)就可以迅速搭建一个大型的程序,写出各种用户所需的应用,这就大大降低了学习的门槛和开发周期。然而,又因为在开发中只是调用API,而忽略了底层寄存器的操作,库开发被习惯了寄存器开发方式的工程师指为“于浮沙筑高台”,没有学习的价值。这种看法具有一定的片面性,他显然没有意识到这是一种全新的学习方法。试问,对于初学者,面对一个32位且有如此多寄存器的单片机,如果还像我们以往操作8位机,通过配置寄存器的方式来实现,那会是多么繁杂的一项工作?除此之外,库的开发方式自顶向下,它是迈向更高端嵌入式Linux开发的一个垫脚石。

库开发已成主流,这是不争的事实。STM32固件库之所以流行并被大家所喜爱,可以归结为以下两个原因:(1)技术潮流

1)于个人:库开发大大地降低了学习的门槛,提高了学习的效率,使个人初步了解了大的程序设计,是一种自顶向下的学习方法,可以从上层的API层层跟踪到底层,可以彻彻底底地了解寄存器,了解CPU的内存分布,再到启动代码、开发环境的配置等。如果再深究,还会涉及编译器甚至工具链。库的学习,可不仅仅是简单地调用API,我们需要去分析这个库是如何构建的,是如何从内存到寄存器,寄存器到结构体,结构体到更各层的API,再到层层外设的文件关联。这里面涉及了太多的C语言的知识,如关键字、宏、结构体、指针、类型转换、条件编译、断言、内联函数等。这些知识的学习,又岂能说是“于浮沙筑高台”。如果你的C语言还停留在基本语法的阶段,那么通过对库的使用和学习,你的C语言将会得到脱胎换骨的提升。学会了库开发还可以快速地迁移到ST其他系列单片机的学习,如STM32F207、STM32F407,这些MCU的固件库基本上都是兼容的。反观如此庞大的固件库,还要相互兼容,细心的人一定可以从中获益良多!

2)于公司:在公司产品开发中,产品上市速度是非常重要的成功因素,库开发可以极大地缩短产品研发周期,以便快速抢占市场。而且库让程序的维护成本更低,程序的升级更快捷。用库来开发,真可谓事半功倍,一箭双雕。(2)市场趋势

有人曾经质疑STM32的固件库降低了MCU的性能,然而,他却没有考虑到STM32的性能和资源已经不是传统的8/16单片机可比的了。强大的硬件应该与消耗这些资源的软件相匹配,否则资源就被浪费了。硬件和软件是相辅相成、共同促进的。所以硬件改善后,工程师对于MCU的关注应该从全局着眼。

本书采用MDK开发环境,全部例程基于3.5.0版本的固件库讲解,不是简单地调用库,而是试图通过对固件库的使用详细讲解什么是库、为什么使用库、怎样使用库等一系列问题,进而引导读者使用高效率的库开发方法。

本书采用原理分析、代码讲解、实验运用这三点连线的讲解方式,循序渐进,适合在校大学生和科研机构开发人员学习使用。全书分为四个部分,第一部分(第1~5章)是库开发初级篇,涉及入门的两个主题。一个是嵌入式工程师成长之路,属于方法论的问题,涉及了一个工程师从学生时代开始,在每一个不同的阶段应该学习什么、该如何进阶等。另一个是通过对库的了解和GPIO的学习,让读者快速掌握STM32的开发方法,这是入门的第一步。第二部分(第6~16章)是库开发中级篇,讲解了STM32各个外设的使用,是学习的一个进阶阶段,也是STM32学习的重中之重。第三部分(第17~25章)是库开发高级篇,是STM32各个外设的实战演练,如MP3、液晶、摄像头、Wi-Fi等,是属于项目实战的例子,一般可直接用于工程项目的开发。第四部分(第26~28章)是库开发系统篇,这是嵌入式系统开发的必经之路,是区别裸与不裸的分水岭;这部分讲解了μC/OS最新版本μC/OS-Ⅲ在STM32中的移植,通过该移植应用实践,相信可以为以后进阶到WinCE、Linux操作系统的学习打下坚实的基础。

致谢

首先要感谢本书的策划编辑张国强先生,是他对STM32的关注促成了这本书的出版,同时在我们撰写书稿时对本书提出了宝贵的写作建议,并对书稿进行了仔细审阅。其次要感谢野火工作室的成员廖锦松、曾云清等人提供的部分例程及资料;感谢好友何卓波对书稿内容的校正工作。

由于本书涉及的知识面广,时间又仓促,限于笔者的水平和经验,疏漏之处在所难免,恳请专家和读者批评指正,可以发送邮件到wildfireteam@163.com与作者进行交流,或者到阿莫论坛野火M3专区http://www.amobbs.com进行讨论。刘火良 杨森  第一部分 库开发初级篇

大多数技术书籍会告诉读者如何掌握某一门技术,但少有讨论与职业规划相关的问题,例如应该学什么以及为什么学。在本书的第一部分我们将与大家共同探讨这些问题,引导读者思考为什么学习STM32。

初级篇可以帮助初学者快速上手STM32,以点亮LED灯的实例,从软件工程的角度深入剖析什么是固件库、为什么使用固件库和怎样使用固件库;从STM32固件库、新建工程、编译和下载程序出发,了解如何操作GPIO,让新手步步为营,尽享STM32的学习乐趣。

我们对初学者的要求是具有基本的单片机基础,如51、AVR等,曾使用C语言写过单片机程序,但不需精通。读者在学习STM32的时候,无需太担心自己的基础,学习这门技术的决心和持之以恒的耐心才是掌握这门技术的法宝。

第1章 为什么学习STM32

第2章 初识STM32固件库

第3章 GPIO入门之流水灯

第4章 深入分析流水灯例程

第5章 调试程序第1章 为什么学习STM32

本章系统介绍了嵌入式工程师的技术成长路线,并详细介绍技术路线中的岗位设置和知识结构,让读者对于嵌入式工程师有一个全面系统地了解,并在此基础上引导工程师规划自己职业生涯。在本章的最后,作为承上启下的内容,从为什么学习STM32和如何学习STM32这两个话题入手,引导读者开始对于STM32的库开发方式有个初步地理解。1.1 嵌入式技术知识结构

嵌入式技术是专用计算机系统技术,它以应用为核心,以计算机技术为基础,软硬件均可裁剪,适用在对功能、稳定性、功耗有严格要求的系统之中。嵌入式技术的开发人员需要对整个计算机体系(从底层硬件到软件操作系统)都有了解,而在这个体系之中,每个部分都可以分出一些小领域,因而技术要求很高,见图1-1。图 1-1 嵌入式技术知识结构

这个图只是粗略地概括了嵌入式技术的知识结构,但从中已经可以看出它涉及的知识面非常广,难怪众多学生甚至技术人员总是“迷茫”。不少电子专业出身的嵌入式技术人员主要从事硬件抽象层(中间层)的开发,这一层是沟通嵌入式系统的硬件层和软件操作系统的桥梁,因而主要的工作是开发驱动程序、板级应用支持、协调软硬件的开发,因而对软硬件都要有深入的了解。1.2 嵌入式工程师成长之路1.从学生成为工程师

若希望从事硬件抽象层的开发,应该如何学习这些知识,才能从学生过渡到工程师呢?见图1-2,对于希望成为其他方向的嵌入式技术人员也可以参考。图 1-2 从事硬件抽象层开发的工程师成长之路

从图1-2可以看出,越往上层深入,就越接近于纯软件开发,但这并不代表嵌入式技术人员就不需要了解硬件,相反,上层的知识都是以底层为基础的,很多人说的“做嵌入式软件开发至少要读懂原理图”就是这个道理。2.职业规划

在嵌入式技术领域的公司,除了工程师还分很多职业岗位。一般公司的研发部门职位见图1-3。图 1-3 嵌入式工程师的职业成长路线

一般需要3~5年过渡到下一级的岗位,在小公司里项目经理一般也兼任部门经理。部门经理不一定要懂技术,并不是非由项目经理升职而成。直接与技术相关的是开发工程师和系统架构师,开发工程师会针对嵌入式技术的不同领域有不同的区分。在小公司里,熟悉软硬件的跨领域工程师很受欢迎,而大公司则分工明确,更看重在某领域研究得深入的开发工程师。作为系统架构师,则需要熟悉整个嵌入式领域,能够协调不同领域的开发工程师进行项目开发。

对于职业规划,不同的人有不同的见解,情况千差万别,以上所述仅供读者参考。1.3 为什么学习STM32

可以发现,在嵌入式领域STM32芯片介于低端和高端之间,它相对于普通的8/16位机有更多的片上外设,更先进的内核架构,可以运行μC/OS等实时操作系统;相对于可运行Linux操作系统的高端CPU,其成本低,实时性强。这个定位使得STM32不仅占领了大部分中端控制器的市场,更是成为提升开发者技术的优良过渡平台,为后续的学习打下坚实的基础。1.4 如何学习STM32

因为STM32的开发方式较普通的单片机开发还是有很大的不同,所以学习时要注意如下几点:

1)转变思维,适应使用固件库的开发方式,加强运用C语言的能力,建立工程意识。

2)熟悉Cortex-M系列芯片架构,了解CMSIS标准,熟悉STM32的总线架构。

3)掌握I2C、SPI、SDIO、CAN、TCP/IP等各种通信协议,掌握了这些协议,开发软件驱动就变得相对容易了。

上面有关的内容本书都会详细讲解,但“纸上得来终觉浅,绝知此事要躬行”,读者亲自编程实践是不能少的。

初级篇可以帮助初学者快速上手STM32,写出自己的应用程序。以点亮LED灯的实例,从软件工程的角度深入剖析什么是固件库、为什么使用固件库和怎样使用固件库;从STM32固件库、新建工程、编译和下载程序出发,了解如何操作GPIO,让新手步步为营,尽享STM32的学习乐趣。

我们对初学者的要求是具有基本的单片机基础,如51、AVR等,曾使用C语言写过单片机程序,但不需精通。读者在学习STM32的时候,无需太担心自己的基础,我们更需要的是学习的勇气,需要的是拿下STM32的决心。试问,我们刚开始学习最简单的单片机的时候,是不是也没基础呢,是不是因此就停止了自己学习的脚步了呢?不是的。我们需要做的是认定一个目标,行动起来,坚持朝向目标的苦行,其中艰辛芳华,唯你自知。第2章 初识STM32固件库

本章通过简单介绍STM32固件库的各个文件以及文件之间的关系,让读者建立STM32固件库的概念,看完后对固件库有个总体印象即可,在后期实际开发时接触了具体固件库时,再回头看看本章,相信你对STM32固件库又会有一个更深刻的认识。2.1 STM32神器之库开发2.1.1 什么是STM32库

在51单片机的程序开发中,我们直接配置51单片机的寄存器,控制芯片的工作方式,如中断、定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能该置1还是置0。这些都是很琐碎的、机械的工作,因为51单片机的软件相对来说较简单,而且资源很有限,所以可以通过直接配置寄存器的方式来开发。

STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface),开发者可调用这些函数接口来配置STM32的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速、易于阅读、维护成本低等优点。

当我们调用库的API时可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习C语言,用printf()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。

实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。库开发方式与直接配置寄存器方式的区别见图2-1。图 2-1 开发方式对比图2.1.2 为什么采用库开发

对于STM32,因为外设资源丰富,带来的必然是寄存器的数量和复杂度的增加,这时直接配置寄存器方式的缺陷就突显出来了:

1)开发速度慢。

2)程序可读性差。

这两个缺陷直接影响了开发效率、程序维护成本和交流成本。库开发方式则正好弥补了这两个缺陷。

而坚持采用直接配置寄存器方式开发的程序员,会列举以下原因:

1)更直观。

2)程序运行占用资源少。

初学STM32的读者,普遍因为第一个原因而选择以直接配置寄存器的方法来学习。认为这种方法直观,能够了解到是配置了哪些寄存器以及怎样配置寄存器。事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解,相信你会为它严谨、优美的实现方式而陶醉。要想修炼C语言,就从STM32官方库开始吧。我们将在第4章对STM32官方库进行详细分析。

相对于库开发的方式,直接配置寄存器方式生成的代码量的确会少一点,但因为STM32有充足的资源,权衡库的优势与不足,绝大部分时候我们愿意牺牲一点资源,选择库开发更划算。一般只有在对代码运行时间要求极其苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。

对于库开发与直接配置寄存器的方式,在STM32刚推出时就引起程序员的激烈争论,但是,随着STM32官方库的完善与大家对库的了解,更多的程序员选择了库开发的方式。

本书采用STM32固件库进行讲解,既介绍如何使用库接口,也讲解库接口的实现方式。使读者既能利用库进行快速开发,也能深入了解STM32的工作原理。

为进一步解答读者为什么使用库开发,请读者先思考一下为什么采用C语言开发软件而不是采用汇编。相比之下,可以发现调用库接口开发与直接配置寄存器开发的关系,犹如C语言与汇编的关系。见表2-1和表2-2。

据某IT大师说过,虽然无从考证,但他(她)说得很有道理:“一切计算机科学的问题都可以用分层来解决。”从汇编到C,从直接配置寄存器到使用库,从裸机到系统,从操作系统到应用层软件,无不体现着这样的分层思想。开发的软件多了,跨越的软件层次多了,会深刻地认同他这句话,分层思想在软件开发上体现得淋漓尽致,分层使得问题变得更简单,使得能够屏蔽底层实现方式的差异,使得软件开发变成简单的调用函数接口,而不用管它的实现,大大提高效率。

库的本质就是建立了一个新的软件抽象层,库的优点,其实就是分层的优点,库的缺点,也是软件分层带来的,而对于STM32这样高性能的芯片,承受分层带来的痛苦相比获得的优势是值得的。2.2 STM32结构及库层次关系2.2.1 CMSIS标准

我们知道由ST公司生产的STM32采用的是Cortex-M3内核,内核是整个微控制器的CPU。该内核是ARM公司设计的一个处理器体系架构,ARM公司并不生产芯片,而是出售其芯片技术授权。ST公司或其他芯片生产厂商如TI,负责设计的是在内核之外的部件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设ADC、串口UART、定时器TIM等。

内核与外设,类似PC上的CPU与主板、内存、显卡、硬盘的关系,见图2-2。图 2-2 内核与外设的关系

因为基于Cortex的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核、不同外设的芯片上移植困难。为了解决不同芯片厂商生产的Cortex微控制器软件的兼容性问题,ARM与芯片厂商建立了CMSIS标准(Cortex Microcontroller Software Interface Standard)。

所谓CMSIS标准,实际是新建了一个软件抽象层,见图2-3。图 2-3 CMSIS架构

CMSIS标准中最主要的是CMSIS核心层,它包括:

内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由ARM公司提供。

设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。

可见CMSIS层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植有极大的好处。STM32固件库就是按照CMSIS标准建立的。2.2.2 库目录、文件简介

STM32的3.5版库可以从官网获得,也可以直接从本书的随书光盘得到。本书讲解的例程全部采用最新的3.5版库文件。因为3.5版与3.0版的库文件兼容性很好,光盘中附带的其他例程仍然保留了一些使用3.0版的代码。

解压库文件后进入其目录:

stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0

各文件夹内容说明见图2-4。图 2-4 STM32固件库目录

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。见代码清单2-1。

代码清单2-1 core_cm3.c文件中对编译器差异的屏蔽

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

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

1./*exact-width signed integer types*/

2.typedef signed char int8_t;

3.typedef signed short int int16_t;

4.typedef signed int int32_t;

5.typedef signed__int64 int64_t;

6.

7./*exact-width unsigned integer types*/

8.typedef unsigned char uint8_t;

9.typedef unsigned short int uint16_t;

10.typedef unsigned int uint32_t;

11.typedef unsigned__int64 uint64_t;

这些新类型定义屏蔽了在不同芯片平台时,出现的诸如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公司提供的,见图2-5。

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

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

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

Libraries\CMSIS\Core\CM3\startup\arm文件夹下是由汇编语言编写的系统启动文件,不同的文件对应不同的芯片型号,在使用时要注意,见图2-6。图 2-6 启动文件

文件名的英文缩写的意义如下:

cl:互联型产品,stm32f105/107系列。

vl:超值型产品,stm32f100系列。

xl:超高密度(容量)产品,stm32f101/103系列。

ld:低密度产品,Flash小于64KB。

md:中等密度产品,Flash等于64KB或128KB。

hd:高密度产品,Flash大于128KB。

配套STM32开发板中用的芯片是STM32F103VET6,64KB RAM和512KB ROM,是属于高密度产品,所以启动文件要选择startup_stm32f10x_hd.s。(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核外加进去的,见图2-7。图 2-7 外设驱动

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

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

这两个文件夹中还有一个很特别的misc.c文件,这个文件提供了外设对内核中的NVIC(中断向量控制器)的访问函数,在配置中断时,我们必须把这个文件添加到工程中。6.stm32f10x_it.c和stm32f10x_conf.h文件

在库目录的Project\STM32F10x_StdPeriph_Template目录下,存放了官方的一个库工程模板,我们在用库建立一个完整的工程时,还需要添加这个目录下的stm32f10x_it.c、stm32f10x_it.h和stm32f10x_conf.h这三个文件。

stm32f10x_it. c是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统异常的接口,其他普通中断服务函数由我们自己添加。但是我们怎么知道这些中断服务函数的接口如何写呢?是不是可以自定义呢?答案当然不是的,这些都可以在汇编启动文件中找到,具体内容大家可查阅库启动文件的源码。

stm32f10x_conf. h文件被包含进stm32f10x.h文件,是用来配置使用了什么外设的头文件,用这个头文件我们可以很方便地增加或删除上面Driver目录下的外设驱动函数库。如代码清单2-3的代码配置表示使用了gpio、rcc、spi、usart的外设库函数,其他注释掉的部分,表示没有用到。

代码清单2-3 stm32f10x_conf.h文件配置固件库

1./*Includes-----------------------------------------------------*/

2./*Uncomment/Comment the line below to enable/disable peripheral header file inclusion*/

3.//#include"stm32f10x_adc.h"

4.//#include"stm32f10x_bkp.h"

5.//#include"stm32f10x_can.h"

6.//#include"stm32f10x_cec.h"

7.//#include"stm32f10x_crc.h"

8.//#include"stm32f10x_dac.h"

9.//#include"stm32f10x_dbgmcu.h"

10.//#include"stm32f10x_dma.h"

11.//#include"stm32f10x_exti.h"

12.//#include"stm32f10x_flash.h"

13.//#include"stm32f10x_fsmc.h"

14.#include"stm32f10x_gpio.h"

15.//#include"stm32f10x_i2c.h"

16.//#include"stm32f10x_iwdg.h"

17.//#include"stm32f10x_pwr.h"

18.#include"stm32f10x_rcc.h"

19.//#include"stm32f10x_rtc.h"

20.//#include"stm32f10x_sdio.h"

21.#include"stm32f10x_spi.h"

22.//#include"stm32f10x_tim.h"

23.#include"stm32f10x_usart.h"

24.//#include"stm32f10x_wwdg.h"

25.//#include"misc.h"/*High level functions for NVIC and SysTick(add-on to CMSIS functions)*/

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

前面向大家简单介绍了各个库文件的作用,库文件直接包含进工程即可,丝毫不用修改,而有的文件就要我们在使用的时候根据具体的需要进行配置。接下来从整体上把握一下各个文件在库工程中的层次或关系,这些文件都对应到CMSIS标准架构上,见图2-9。图 2-9 库各文件之间的关系

图2-9描述了STM32固件库各文件之间的调用关系,这个图省略了DSP核(Cortex-M3没有DSP核)和实时系统层的文件关系。在实际使用库开发工程的过程中,我们把位于CMSIS层的文件包含进工程,丝毫不用修改,也不建议修改。

对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用条件编译的方法增删)和改动的文件。2.2.4 使用库帮助文档

授之以鱼不如授之以渔,官方资料是所有关于STM32知识的源头,所以在本节介绍如何使用官方资料。官方的帮助手册是最好的教程,几乎包含了所有在开发过程中遇到的问题。这些资料已整理到随书光盘。1.常用官方资料

stm32f10x_stdperiph_lib_um.chm

这个就是前面提到的库帮助文档,在使用库函数时,我们最好通过查阅此文件来了解库函数原型或库函数调用的方法,也可以直接阅读源码里面的函数说明。

STM32参考手册.pdf

这个文件相当于STM32的datasheet,它把STM32的时钟、存储器架构及各种外设、寄存器都描述得清清楚楚。当我们对STM32库函数的实现方式感到困惑时,可查阅这个文件。若以直接配置寄存器方式开发,查阅这个文档的频率会更高,但这样效率太低了。《ARM Cortex-M3权威指南》

该手册是由ARM公司提供的,它详细讲解了Cortex内核的架构和特性,要深入了解Cortex-M3内核,这个文档是首选。2.初识库函数

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

于是,有读者就问那么多函数我怎么记呀?我们的回答是:会查就行!所以我们学会查阅库帮助文档是很有必要的。

打开库帮助文档stm32f10x_stdperiph_lib_um.chm,见图2-10。图 2-10 库帮助文档

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

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

如ADC_Init的功能是:以ADC_InitStruct参数配置ADC,进行初始化。原型为:

void ADC_Init(ADC_TypeDef*ADCx, ADC_Init_TypeDef*ADC_InitStruct)

其中输入的参数ADCx和ADC_InitStruct均为库文档中的自定义数据类型,这两个传入参数均为结构体指针。初学时,我们并不知道如ADC_TypeDef这样的类型是什么意思,可以点击函数原型中带下划线的ADC_TypeDef就可以查看这是什么类型了。

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

本章为读者讲解如何建立工程模板和编译下载程序。接触过Linux的朋友都知道,在开始学习GCC编程时都喜欢以Hello World来作为第一个入门程序,在单片机中我们则常常以点亮LED灯来作为入门程序。所以在这个章节,演示下载一个LED流水灯的工程,先让代码在STM32上跑起来!详细的代码分析将在第4章展开。3.1 安装MDK

在新建工程之前我们先要把MDK这个软件安装好,这里用的版本是V4.12,在安装完成之后可以在工具栏help->aboutμVision选项卡中查看到版本信息。μVision是一个集代码编辑、编译、链接及下载于一体的集成开发环境(IDE),其支持我们常见的ARM7、ARM9和ARM最新内核的CM3系列,其前身就是51中的大名鼎鼎的Keil,相信大家会很快入手这个IDE的。如果大家要把MDK用在商业行为,需购买正版软件,这里仅用作教学演示。

MDK安装过程如下所示:

1)点击Next按钮,如图3-1所示。图 3-1 安装步骤1

2)勾选复选框,点击Next按钮,如图3-2所示。图 3-2 安装步骤2

3)点击Next按钮,默认安装在C:\Keil目录下,如图3-3所示。图 3-3 安装步骤3

4)在用户名中填入名字,在邮件地址中填入邮件地址(可随便写,可空格),点击Next按钮,如图3-4所示。图 3-4 安装步骤4

5)正在安装,如图3-5所示,请耐心等待。图 3-5 安装步骤5

6)点击Finish按钮,安装完成,如图3-6所示。图 3-6 安装步骤6

7)此时就可在桌面看到μVision的快捷图标,如图3-7所示。图 3-7 快捷方式图标3.2 建立工程模板

安装完MDK之后,紧接着我们开始利用STM32的官方库来构建自己的工程模板。以后我们就用自己建立的模板来新建工程,方便快捷。3.2.1 新建工程

1)点击桌面μVision4图标,启动软件。如果是第一次使用的话会打开一个自带的工程文件,我们可以通过工具栏Project->Close Project选项把它关掉。

2)在工具栏Project->NewμVision Project新建我们的工程文件,我们将新建的工程文件保存在桌面的TEST/USER文件夹下,文件取名为STM-DEMO(英文DEMO的意思是例子),名字可以随便取,点击“保存”按钮,如图3-8所示。图 3-8 保存工程到USER目录

3)接下来的窗口是让我们选择公司和芯片的型号,我们用的芯片是ST公司的STM32F103VE,有64KB SRAM和512KB Flash,属于高集成度的芯片。按如图3-9所示选择即可。图 3-9 选择芯片型号

4)接下来的窗口问我们是否需要复制STM32的启动代码到工程文件中,这份启动代码在CM3系列中都是适用的,一般情况下我们都点击“是”按钮,但我们这里用的是ST的库,库文件里面也自带了这一份启动代码,所以为了保持库的完整性,我们就不需要开发环境为我们自带的启动代码了,稍后我们自己手动添加,这里我们点击“否”按钮,如图3-10所示。图 3-10 不使用Keil自带的启动代码

5)此时我们的工程新建成功,如图3-11所示。但我们的工程中还没有任何文件,接下来我们需要添加所需文件。图 3-11 新建工程的效果图

6)在TEST文件夹中,新建5个文件夹,分别为USER、FWlib、CMSIS、Output、Listing,其中USER已经存在,就不需再建了,见图3-12。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载