Day11:搭建 STM32 开发环境
前言
大家已经学完了 C语言编程入门(电赛入门的前半部分)的内容,今天开始老师将带领大家在 充电宝团队自治的 “电赛 STM32 学习板” 上深入浅出的了解单片机的基础和领略 STM32 的妙用。

小贴士
总所周知,计算机由硬件(外设,中央处理器,存储器等)和软件(操作系统,应用程序)组成。
单片机(单片微型计算机,Single-Chip Microcomputer),又称微控制器(Microcontroller)。
是把中央处理器、存储器、定时/计数器(Timer/Counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。
8051是一种8位元的单芯片微控制器,属于MCS-51单芯片的一种,由英特尔公司于 1981 年制造。
STM32系列芯片由ST公司基于ARM公司的Cortex-M3内核开发的 32 位微控制器(MCU)。
为什么学习STM32
可以发现,在嵌入式领域STM32芯片介于低端和高端之间,它相对于普通的8/16位机有更多的片上外设,更先进的内核架构,可以运行μC/OS等实时操作系统,相对于可运行Linux 操作系统的高端CPU,其成本低,实时性强。这个定位使得STM32不仅占领了大部分中端控制器的市场,更是成为提升开发者技术的优良过渡平台,为后续的学习打下坚实的基础。
如何学习STM32
为STM32的开发方式较普通的单片机开发还是有很大的不同,所以学习时要注意如下几点
(1)转变思维,适应使用固件库的开发方式,加强运用C语言的能力,建立工程意识。
(2)熟悉Cortex-M系列芯片架构,了解CMSIS标准,熟悉STM32的总线架构。
(3)掌握IC、SPI、SDIO、CAN、TCP/IP等各种通信协议,掌握了这些协议,开发软件驱动对容易了。
好了,开始我们今天的任务熟悉STM32的开发环境和工程模板。
1. STM32 开发前的常识
STM32系列芯片由ST公司基于 ARM 公司的 Cortex-M3 内核开发的 32 位微控制器(MCU)
STM32按内核架构分为不同产品,其中 STM32F1 系列有:
STM32F101“基本型”系列
STM32F103“增强型”系列
STM32F105、STM32F107“互联型”系列

电赛学习板上使用的是 STM32F103RBT6 64管脚的单片机
ST(意法半导体)为了方便用户开发程序,提供了一套丰富的 STM32 固件库。
到底什么是固件库?它与直接操作寄存器开发有什么区别和联系?很多初学者很是费解,这里我们简单了解一下 STM32 固件库相关的基础知识,希望能够让大家对 STM32 固件库有一个初步的了解,至于固件库的详细使用方法,我们会在后面的章节一一介绍。
这章节有一些图片是截图的权威手册。这一节的知识可以参考《STM32 固件库使用手册中文翻译版》 P32,固件库手册讲解更加详细,这里只是提到一下,希望大家谅解。官方包的地址:软件资料\STM32 固件库使用参考资料\ STM32F10x_StdPeriph_Lib_V3.5.0

STM32F10x 标准外设库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用 API(Application Programming Interface应用编程界面)驱动,API 对该驱动程序的结构,函数和参数名称都进行了标准化。
小贴士
任何处理器,不管它有多么的高级,归根结底都是要对处理器的寄存器进行操作。但是固件库不是万能的,您如果想要把 STM32 学透,光读 STM32 固件库是远远不够的。你还是要了解一下 STM32 的原理,而这些原理了解了,你在进行固件库开发过程中才可能得心应手游刃有余。
固件库与CMSIS
前面我们讲到, STM32 固件库就是函数的集合,那么对这些函数有什么要求呢??这里就涉及到一个 CMSIS 标准的基础知识,这部分知识可以从《Cortex-M3 权威指南》中了解到,我们这里只是对权威指南的讲解做个概括性的介绍。
经常有人问到 STM32 和 ARM 以及 ARM7 是什么关系这样的问题,其实 ARM 是一个做芯片标准的公司,它负责的是芯片内核的架构设计,而 TI, ST 这样的公司,他们并不做标准,他们是芯片公司,他们是根据 ARM 公司提供的芯片内核标准设计自己的芯片。
所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量, 片上外设, IO 以及其他模块的区别。所以你会发现,不同公司设计的 Cortex-M3 芯片他们的端口数量,串口数量,控制方法这些都是有区别的, 这些资源他们可以根据自己的需求理念来设计。同一家公司设计的多种 Cortex-m3 内核芯片的片上外设也会有很大的区别,比如 STM32F103RBT 和 STM32F103ZET,他们的片上外设就有很大的区别。我们可以通过《Cortex-M3 权威指南》中的一个图来了解一下:

从上图可以看出,芯片虽然是芯片公司设计,但是内核却要服从 ARM 公司提出的 Cortex-M3内核标准了,理所当然,芯片公司每卖出一片芯片,需要向 ARM 公司交一定的专利费。
既然大家都使用的是 Cortex-M3 核,也就是说,本质上大家都是一样的,这样 ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。 ST 官方库就是根据这套标准设计的。这里我们又要引用参考资料里面的图片来看看基于 CMSIS 应用程序基本结构:

如图2所示,基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及中间件接口层、CMSIS层、硬件寄存器层。
CMSIS层起着承上启下的作用
一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对 Cortex-M系列微处理器核内外设寄存器的不同定义;
另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程 序开发难度,使开发人员 能够在完全透明的情况下进行应用程序开发。
2. 学习资料下载及熟悉
电赛学习板的学习资料在百度网盘和CSDN中都可以下载
解压后的内容

硬件资料
- 主要有电赛学习板的原理图
- 电赛学习板上各芯片的参考手册
学习资料

工具软件

工程模板
STM32 在 Keil5 上使用的工程配置
官方例程
主要是 ST 公司出的 STM32 固件库 V3.5 的原始资料
3. Keil5 的 安装和注册
- 在 [工具软件] 下找到 [MDK~Keil5]

- 双击 [mdk515.exe],开始安装,选择 [next]。

-
选择 [ I agree to all the terms ...] ,点击 [next]

-
选择安装路径,路径不能带中文,点击 [next]

小贴士
1、安装路径不能带中文,必须是英文路径
2、安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开
3、KEIL5 的安装比起 KEIL4 多了一个步骤,必须添加 MCU 库,不然没法使用。
4、如果使用的时候出现莫名其妙的错误,先百度查找解决方法。
- 填写用户信息,全部填空格即可,点击 [next]

- Finish,安装完成。

- KEIL5 不像 KEIL4 那样自带了很多厂商的 MCU 型号,KEIL5 需要自己安装。把下面弹出的界面关掉,我们直接去 keil 的官网下载:http://www.keil.com/dd2/pack/,或者直接用我们下载好的包 [Keil.STM32F1xx_DFP.2.1.0.pack]。

- 把下载好的包双击安装即可,安装路径选择跟 KEIL5 一样的安装路径,安装成功之后,在 KEIL5 的 Pack Installer 中就可以看到我们安装的三个包,以后我们新建工程的时候,就有单片机的型号可选。 这里我只下载目前教程需要使用的 F1 系列的包。

- 通过 KEIL5 的快捷方式打开Keil,选择 [File] > [License Management] 复制 CID (记得复制你自己电脑上的,别复制图片上的)

-
在 [MDK~Keil5] 下找到 [注册.exe] 打开注册机,把刚刚复制的 CID 粘贴到注册机的 CID 框处;

-
Target 选择 ARM,然后点击 Generate,复制注册机生成的 License ID Code ;
-
回到 KEIL5,[File] > [License Management] ,把刚刚从注册机复制到的 License ID Code粘贴到 New License ID Code(LIC)框处,点击 Add LIC。搞定,破解成功。

小贴士:
这个操作步骤确实有点儿长,但是所幸大家只需要操作一次就好,后续我们就直接用它来写程序就行,希望大家多点儿耐心和细心,把它完成
4. 工程模板的介绍和使用
在 [工具软件] 中找到 [MDK~Keil5] 下的 [EmptyPro] 工程

在 EmptyPro 录下建立以下几个目录
(1)CMSIS目录:官方库 [STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS] 下的源码;
(2)Devices目录:后续做项目需要用到的设备文件夹(暂时没用);
(3)FWlib目录 :官方库 [STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver] 下的源码;
(4)List目录:用于存放keil生成的list文件。于存放keil开发环境的工程文件,工程文件位置所在;
(5)Output目录:用于存放编译过程中生成的 16 进制文件,用于下载烧写程序到开发板上;
(6)Project目录:STM32工程文件的位置,平时就是从这里打开工程的;
(7)Startup目录:用于存放STM32处理器的启动引导代码。
(8)System目录:基础但最常用的代码 如 printf() 函数的重定向,延时函数,中断分组等。
(9)User目录:用于存放工程中主要的用户代码,如 main.c。

User 目录下 大家可以看到我们最熟悉的 C 语言的 main(),对就是这里,接下来我们的主要操作也是在这里完成
System 文件夹下的内容简述
delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 3 个函数(这里我们不讲 SysTick_Handler 函数,该函数在讲 ucos 的时候再介绍):
void delay_init(u8 SYSCLK); // 延时函数的初始化:例如
void delay_ms(u16 nms); // 毫秒级延时函数
void delay_us(u32 nus); // 微秒级延时函数
sys 文件夹内包含了 sys.c 和 sys.h 两个文件。在 sys.h 里面定义了 STM32 的 IO 口输入读取宏定义和输出宏定义。 sys.c 里面只定义了一个中断分组函数。下面我们将分别向大家介绍 。
该部分代码在 sys.h 文件中,实现对 STM32 各个 IO 口的位操作,包括读入和输出。当然在这些函数调用之前,必须先进行 IO 口时钟的使能和 IO 口功能定义。此部分仅仅对IO 口进行输入输出读取和控制。
位带操作简单的说, 就是把每个比特膨胀为一个 32 位的字,当访问这些字的时候就达到了访问比特的目的,比如说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,我们去访问这 32 个地址就达到访问 32 个比特的目的。 这样我们往某个地址写 1 就达到往对应比特位写 1 的目的,同样往某个地址写 0 就达到往对应的比特位写 0 的目的。
usart 文件夹内包含了 usart.c 和 usart.h 两个文件。这两个文件用于串口的初始化和中 断接收。这里只是针对串口 1,比如你要用串口 2 或者其他的串口,只要对代码稍作修改就可以了。
usart.c 里面包含了 2 个函数:
void uart_init(u32 bound); /// 串口1的初始化函数
void usart1_IRQHandler(void); /// 串口1中断服务函数
这段引入 printf 函数支持的代码在 usart.h 头文件的最上方,这段代码加入之后便可以通过 printf 函数向串口发送我们需要的内容,方便开发过程中查看代码执行情况以及一些变量值。这段代码不需要修改,引入到 usart.h 即可。
小贴士:这里我把操作简化了一些,后续我们就在这个工程上完成操作,具体创建空工程的操作很复杂,有兴趣的同学可以看文章 【Keil 创建空工程】
5. 下载程序到开发板
-
在 [工具软件] 中找到CH341串口驱动

-
双击CH341SER.EXE,点击安装串口驱动

-
安装完成后,使用USB线,将你的电脑和电赛学习板链接在一起,如下图所示:

-
右击 [此电脑] > [管理],选择 [设备管理器] , 查看识别的端口号,每个人电脑识别的可能不一样,例如:我的电脑是COM3

-
在 [工具软件] 中找到 STM下载器ISP;

-
双击打开 mcuisp.exe ,可以看到Port为COM3,如果没有点击搜索串口

-
点击
选项,选择 [EmptyPro] 中的 [Output] 目录下的 [Empty.hex] 文件

-
点击 [开始编程] 按钮,开始下载程序

-
等待进度条结束,下载完成,在开发板上按下复位按键(S2),即可以查看学习板上的状态了

小贴士:除了通过串口下载程序,也可以通过 JTAG 下载,操作比较复杂,具体见文档[ 通过 J-link 下载程序]
6. 今天练习
- 安装 RealView MDK 软件开发环境;
- 下载并运行程序,注意观看现象。
- 熟悉工程模板 EmptyPro 的代码;