第一部分 入门篇 -第1章 学嵌入式从STM32开始

1.1 STM32简介

ARM公司简介

ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。

这里写图片描述

图1-1

ARM(Advanced RISC Machines)有3种含义:

  • 一个公司的名称;
  • 一类微处理器的通称;
  • 一种技术的名称。

ARM微处理器的特点

(1)体积小、低功耗、低成本、高性能;
(2)支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;
(3)大量使用寄存器,指令执行速度更快;
(4)大多数数据操作都在寄存器中完成;
(5)寻址方式灵活简单,执行效率高;
(6)指令长度固定。

ARM微处理器系列

ARM处理器的产品系列非常广,包括ARM7、ARM9、ARM9E、ARM10E、ARM11和Cortex等。以及其它厂商基于ARM体系结构的处理器,除了具有ARM体系结构的共同特点以外,每一系列提供一套特定的性能来满足设计者对功耗、性能、体积的需求。

表 1-1 ARM 系列

这里写图片描述

基于ARMv7版本的ARM Cortex系列产品由A、R、M三个系列组成,具体分类延续了一直以来ARM面向具体应用设计CPU的思路。
其中:
A应用处理器(Application Processor )系列
R实时控制处理(Real Time Control )系列
M微控制器(Micro Controller )系列

  • CortexTM-R4处理器简介

该处理器是首款基于ARMv7架构的高级嵌入式处理器,其主要目标为产量巨大的高级嵌入式应用系统,如硬盘,喷墨式打印机,以及汽车安全系统等等。

  • CortexTM-R4F处理器简介

该处理器在CortexTM-R4处理器的基础上加入了代码错误校正(ECC)技术,浮点运算单元(FPU)以及DMA综合配置的能力,增强了处理器在存储器保护单元、缓存、紧密耦合存储器、DMA访问以及调试方面的能力。

  • CortexTM-A8处理器简介

该处理器是ARM公司所开发的基于ARMv7架构的首款应用级处理器,其特色是运用了可增加代码密度和加强性能的技术、可支持多媒体以及信号处理能力的NEONTM技术、以及能够支持Java和其他文字代码语言的提前即时编译的[email protected]技术。众多先进的技术使其适用于家电以及电子行业等各种高端的应用领域。

  • CortexTM-M3处理器简介

Cortex-M3处理器是一个低功耗的处理器,具有门数少,中断延迟小,调试容易等特点。它是为功耗和价格敏感的应用领域而专门设计的、具有较高性能的处理器,应用范围可从低端微控制器到复杂SoC。
Cortex-M3处理器使用了ARMv7-M体系结构,采用了纯Thumb2指令的执行方式,具有极高的运算能力和中断相应能力,是一个可综合的、高度可配置的处理器。它包含了一个高效的哈佛结构三级流水线,可提供1.25DMIPS/MHz的性能。在一个具有32个物理中断的标准处理器上实现([email protected]),达到了突出的0.06mW/MHz能效比。

这里写图片描述

图1-2基于Cortex-M3的MCU

表1-2ARM7与Cortex-M3的比较

这里写图片描述

Cortex-M3处理器在高性能内核基础上,集成了多种系统外设,可以满足不同应用对成本和性能的要求。处理器是全部可综合、高度可定制的(包括物理中断、系统调试等),Cortex-M3还有一个可选的细粒度的(fine-granularity)存储器保护单元(MPU)和一个嵌入式跟踪宏单元(ETM)。
为了降低成本,Cortex-M3处理器采用了与系统部件紧耦合的实现方法,来缩小芯片面积,其内核面积比现有的三级流水线内核缩小了30%。Cortex-M3处理器实现了Thumb-2指令集架构,具有很高的代码密度,可降低存储器需求,并能达到非常接近32位ARM指令集的性能。
对于系统和软件开发,Cortex-M3处理器具有以下优势:
(1)小的处理器内核、系统和存储器,可降低器件成本;
(2)完整的电源管理,很低的功耗;
(3)突出的处理器性能,可满足挑战性的应用需求;
(4)快速的中断处理,满足高速、临界的控制应用;
(5)可选的存储器保护单元(MPU),提供平台级的安全性;
(6)增强的系统调试功能,可以加快开发进程;
(7)没有汇编代码要求,简化系统开发;
(8)宽广的适用范围:从超低成本微控制器到高性能Soc。
Cortex-M3主要应用于汽车车身系统,工业控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域。目前最便宜的基于该内核的ARM单片机售价为1美元。

1.2 为什么学习 STM32

可以发现,在嵌入式领域 STM32 芯片介于低端和高端之间,它相对于普通的 8/16 位机有更多的片上外设,更先进的内核架构,可以运行 μC/OS 等实时操作系统 ;相对于可运行 Linux 操作系统的高端 CPU,其成本低,实时性强。这个定位使得 STM32 不仅占领了大部分中端控制器的市场,更是成为提升开发者技术的优良过渡平台,为后续的学习打下坚实的基础。
本节系统介绍了嵌入式工程师的技术成长路线,并详细介绍技术路线中的岗位设置和知识结构,让读者对于嵌入式工程师有一个全面系统地了解,并在此基础上引导工程师规划自己职业生涯。在本章的最后,作为承上启下的内容,从为什么学习 STM32 和如何学习 STM32 这两个话题入手,引导读者开始对于 STM32 的库开发方式有个初步地理解。

1.2.1 嵌入式技术知识结构

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

这里写图片描述

图 1- 3 嵌入式技术知识结构

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

1.2.2 嵌入式工程师成长之路

1.从学生成为工程师

若希望从事硬件抽象层的开发,应该如何学习这些知识,才能从学生过渡到工程师呢?见图 1- 2,对于希望成为其他方向的嵌入式技术人员也可以参考。从图 1- 2 可以看出,越往上层深入,就越接近于纯软件开发,但这并不代表嵌入式技术人员就不需要了解硬件,相反,上层的知识都是以底层为基础的,很多人说的“做嵌入式软件开发至少要读懂原理图”就是这个道理。

这里写图片描述

图 1- 4 从事硬件抽象层开发的工程师成长之路

2.职业规划

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

这里写图片描述

图 1- 5嵌入式工程师的职业成长路线

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

1.3学习STM32需要哪些基础

首先要对C语言有一定的了解,不用学到精通,只要会使用一些简单的命令语句。比如赋值语句、if语句、for循环语句、while语句、一维数组、二维数组等。还有一点需要重点学习的是函数的定义、调用,参数的传递与参数的返回。推荐给大家一本学C语言的书籍《谭浩强C语言程序设计》,这本书也是很多大学里的教材,写的很详细。
当你学会了C语言,说明你已经掌握了软件的基础了,接下来需要学习一些硬件的基础知识。可以到书店买两本数字电路与模拟电路相关的书籍,建议你不用学的太深,只要简单的了解能看懂原理图就可以了,等到你真正到工作岗位上,大的公司里软件开发人员和硬件设计人员都是分开的,只有专心做一件事情才能做的精益求精,有一个好的发展。如果你以前学过51单片机,你一定熟悉C语言、模拟电路和数字电路。那么你就可以直接学习STM32。需要注意的是我们以前学习51单片机时都是直接操作寄存器,而现在我们学习STM32大部分都是调用库函数。
我们对初学者的要求是具有基本的单片机基础,如 51、AVR 等,曾使用 C 语言写过单片机程序,但不需精通。读者在学习 STM32 的时候,无需太担心自己的基础,我们更需要的是学习的勇气,需要的是拿下 STM32 的决心。试问,我们刚开始学习最简单的单片机的时候,是不是也没基础呢,是不是因此就停止了自己学习的脚步了呢?不是的。我们需要做的是认定一个目标,行动起来,坚持朝向目标的苦行,其中艰辛芳华,唯你自知。

1.4 如何学习 STM32

如果你去问业内人士,怎样学习STM32,他们都会说多实践,做多了自然就会了。可是我觉得对于一名初学者,没有一点的理论基础,根本就无从下手,不知道从何做起。我们常说实践是在有理论的指导下进行的,没有理论的实践是蛮干,没有实践的理论那是空谈。那么怎样获得理论知识那?最好的办法就是看视频教程与配套的书籍。建议初学者多看视频教程,一遍不会就看两遍。然后再仔细看看配套的书籍,当我们有了理论基础,就可以动手实践了。实践也要由小到大,由浅入深的进行,别总想一步登天。知识都是一点一滴的逐渐积累起来的。
因为 STM32 的开发方式较普通的单片机开发还是有很大的不同,所以学习时要注意如下几点 :
1)转变思维,适应使用固件库的开发方式,加强运用 C 语言的能力,建立工程意
识。
2)熟悉 Cortex-M 系列芯片架构,了解 CMSIS 标准,熟悉 STM32 的总线架构。
3)掌握 I 2 C、SPI、SDIO、CAN、TCP/IP 等各种通信协议,掌握了这些协议,开发软件驱动就变得相对容易了。
上面有关的内容本教程都会详细讲解,但“纸上得来终觉浅,绝知此事要躬行”,读者亲自编程实践是不能少的。
基础入门篇可以帮助初学者快速上手 STM32,写出自己的应用程序。以点亮 LED 灯的实例,从软件工程的角度深入剖析什么是固件库、为什么使用固件库和怎样使用固件库 ;从 STM32 固件库、新建工程、编译和下载程序出发,了解如何操作 GPIO,让新手步步为营,尽享 STM32 的学习乐趣。

整套教程主要分为四部分:

1.入门篇 ,主要介绍STM32及环境搭建,新建工程以及下载代码及调试等;
2.基础篇,主要讲解的是STM32F103VET6芯片内部的资源。包括(TIMER、CAN、ADC、DAC、RTC、DMA、USART等);
3.外设篇,主要讲解的是外围芯片的使用方法。包(24C04、FLASH芯片、红外发射与接收、MP3、FM收音机、USB通讯、以太网、触摸屏等);
4.系统篇,主要讲解ucosⅡ实时操作系统和ucgui图形支持系统的移植与使用方法。

1.5应用领域

1.销售终端

银行的读卡机、收银机、热敏打印机、票据验证、包裹跟踪、自动售货机。

2.身份识别设备

安全和生物特征识别、公路自动收费系统。

3.工业自动化

现场数据采集器、电表、可编程逻辑控制器(PLC)、工业缝纫机。

4.消费电子

计算机外设、游戏手柄、玩具、万能遥控器、卫星收音机、

5.建筑安防/消防/HVAC

报警系统、控制面板。

6.医疗

心脏监控、便携试仪器。

7.通信领域

同声翻译系统、光纤接入控制、3G基站监控。

8.家电

电动自行车、变频空调、洗衣机。

9.仪器仪表

电子秤、电表、水表。

小贴士:寄存器与库函数的区别

首先,两个都是C语言。从51过渡过来的,就先说寄存器操作。每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0、P1、SMOD、TMOD之类的,这些存在于标准头文件reg.h里面。因为少,所以大家就直接去操作了。每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。所以做51开发的时候大多数都是直接操作寄存器。 到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM内核的芯片,功能多了很多,寄存器自然也就多了很多,STM32的手册有1000多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。 简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。 有人说用库函数掌握不到芯片的精髓,仁者见仁智者见智。熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验。