在 keil 建立基于STM32开发的工程模板--详细步骤

1 先说几句

1.1 什么是STM32?

  STM32是**意法半导体(STMicroelectronics)**较早推向市场的基于Cortex-M内核架构的微处理器系列产品,该系列产品具有成本低、功耗优、性能高、功能多等优势,并且以系列化方式推出,方便用户选型,在市场上获得了广泛好评。

  STM32目前常用的有STM32F103~107系列,简称“1系列”。最近 又推出了高端系列STM32F4xx系列,简称“4系列”。前者基于Cortex-M3内核架构,后者基于Cortex-M4内核架构。
  
  下面是STM32103芯片的实拍图:STM32103实拍图

1.2 什么是cortex?

  Cortex 是 ARM 的全新一代处理器内核,它在本质上是 ARM V7 架构的实现,它完全有别于ARM的其他内核,是全新开发的。按照3类 典型的嵌入式系统应用,即高性能、微控制器、实时类,它又分成 3 个 系 列 , 即 Cortex-A 、 Cortex-M 、 Cortex-R 。 而 STM32 就 属 于Cortex-M系列。

1.3 什么是ARM?

  1990年,苹果来到英国,和另外两家科技公司成立一家公司,名为Advanced RISC Machines的公司,简称就是ARM。

  点击这里查看详情:ARM公司简介-百科介绍

  ARM 公司本身并不生产和销售芯片,它以出售 ARM 内核的知识产 权为主要模式。全球顶尖的半导体公司,例如 Actel、TI、ST、
Fujitsu、NXP 等均通过购买 ARM 的内核,结合各自的技术优势进行 生产和销售

  ARM 的设计具有典型的精简指令系统(RISC)风格。ARM 的体系 架构已经经历了 6个版本,版本号分别是 V1~V6。每个版本各有特 色,定位也各有不同,彼此之间不能简单地相互替代。

  后来,设计了全新的架构:Cortex,也就是ARM V7

1.4 什么是意法半导体?

  意法半导体(英语:STMicroelectronics)是一家国际性的半导体生产商,总部位于瑞士日内瓦。
点击这里查看详情:意法半导体-百科介绍
在这里插入图片描述

2 硬件平台

2.1 STM32103C8T6最小系统板

  先看看这个实物图:
在这里插入图片描述
这个小板子就是最小系统,那么这个“最小系统”是怎么定义的呢?
  一个微控制器的最小系统是指能使微控制器正常工作所需要的最少元件,通常由微控制器芯片、电源电路、时钟电路、复位电路、调试和下载电路等部分组成,可以看下面的概念图。
在这里插入图片描述

这个小板子上的东西可以分成两部分:
  i: STM32103C8T6芯片
  ii: 其他元器件:电源电路、时钟电路、复位电路、调试和
          下载电路

i: 芯片名:STM32103C8T6的含义
在这里插入图片描述
具体详情,这里不再多说,感兴趣的同学,可以去参考野火的开发手册零死角玩转 STM32

ii: 其他元器件
  要说清楚这一部分,我们需要从系统的角度,分析一下最小系统板的组成原则。
  从常识上讲,要认识一件事物,必然是先外后内。先看颜值如何,再看修养如何。
在这里插入图片描述
这个芯片采用的是贴片式的封装,四边,每边各有12个引脚,共48个引脚。
引脚是怎么定义的呢?
在这里插入图片描述
具体各个引脚的功能,日后再看,这里提供功能定义表:STM32F103C8T6引脚定义表,可以自行下载,留作参考资料。

2.2 电源供电

  任何一个电子产品要正 常工作,电源必不可少。所以,首先要给芯片供电。

  STM32的工作电压 V D D V_{DD} VDD 2.0 ~ 3.6 V 2.0~3.6V 2.03.6V。通过内置电压调节器提供所需的 1.8 V 1.8V 1.8V电源。

  一般芯片不止一个供电引脚,STM32F103C8T6,这款芯片,有三个接地引脚 V S S V_{SS} VSS,和三个电源引脚 V D D V_{DD} VDD V D D V_{DD} VDD一般就供电 3.3 V 3.3V 3.3V,至于为什么在 ** 2.0 ~ 3.6 V 2.0~3.6V 2.03.6V**中选择 3.3 V 3.3V 3.3V,以后再说。
在这里插入图片描述
可见,在电源端并联了两个电容, C 10 C_{10} C10 C 11 C_{11} C11,这个电容的作用是“去耦”,原理分析见空间里的另一篇文章。

2.3 时钟电路

  我们知道,对千时序电路来说,除了电源外 ,还需要有稳定的时钟信号才能正常工作。作为数字系统,微控制器 是一种复杂的时序逻辑电路,需要专门的时钟源为其提供脉冲信号。
  STM32Fl03微控制器也不例外。 对于STM32Fl03 来说,尽管它内置了内部RC 振 荡 器 , 可 以为内部锁相环(Phase Locked Loop, PLL)提供时钟, 这样STM32Fl03依靠内部振荡器就可以在 72MHz的满速状态下运行。
  但是,内部RC振荡器相比外部晶振来说不够准确也不够稳定 ,因此在条件允许的情况下,尽最使用外部主时钟源。
  外部主时钟源主要作为Cortex-M3内核和 STM32外设的驱动时钟,一般称为高速外部时钟信号(HSE)。
  常用的时钟电路是这样的:
在这里插入图片描述
这里就是一个晶体串联两个电容,有时,还会并联一个电阻,如下:
在这里插入图片描述
至于原理分析,我们暂且搁置,将会单独写一篇文章进行说明。

2.4 复位电路

  就像一台完整的 PC 必须具备 Reset 系统一样,一个强壮的微控制器最小系统也需要具备复位电路。 当微控制器上电时,电压不是直接跳变到微控制器可工作的范围(如3. 3V) 而是一个逐步上升的过程。
  此时,微控制器无法正常工作,会引起芯片内程序的无序执行。 同样的情况也会发生在微控制器的供电电压波动不稳定时。
  因此,需要复位电路给它延时,使微控制器保待复位,暂不进入工作状态,防止 CPU 执行错误指令,确保CPU 及各部件处千确定的初始状态,直至电压稳定。

  微控制器复位电路的设计直接影响到整个系统工作的稳定性和可靠性。 许多用户在设计完基于微控制器的嵌入式系统并在实验室调试成功后,在现场却出现“ 死机”“程序跑飞”等现象,这主要是未添加复位电路或复位电路设计不可靠引起的。

  最简单的复位电路是手动复位电路。 按下外部复位键并延时很短 一段时间后释放,即可完成微控制器的一 次外部手动复位。

STM32Fl03C8T6的复位引脚是,第七个,NRST,当给它接通低电平时,芯片就知道,你想让它复位。
在这里插入图片描述
假设我们采用手动复位,即弄一个按键,按下时,NRST接通的是低电平,可以实现这个功能的是下面这个简单电路:
在这里插入图片描述
让我们眯上眼,感受一下,它是怎么工作的:当按下按键时, R E S E T RESET RESET接通地端,变为低电平,松开后,电容瞬间充满电,达到了断路的效果,瞬间, R E S E T RESET RESET的电平变成了3.3V。这就完成了复位功能。

2.5 调试和下载电路

  为了让微控制器按照程序员的设想真正跑起来,要事先将实现指定功能的程序烧写到微控制器片内ROM或RAM中进行反复调试。
  这就需要调试和下载电路。
  微控制器通过 调试和下载接口仿真器 相连,并借助仿真器与主机上嵌入式开发工具中的调试器通信,根据调试器的指令控制 程序的运行,同时向主机的调试器提供程序以及微控制器的相关信息(如程序中的变量、微控制器的寄存器和存储器信息等)供程序员 调试时使用,从而实现程序 从宿主机到微控制器 ROM或RAM的下载和调试。

3 建立工程模板

3.0 开发模式有哪些?

STM32单片机系统的开发模式通常有三种:
(1) 基于寄存器开发
(2) 基于固件库开发
(3) 基于嵌入式操作系统的开发

  基于操作系统的开发模式,对于初学者不是很合适,因为它对操 作系统、多任务等理论把握的要求较高。建议学习者在对嵌入式系统的开发达到一定的阶段后,再开始尝试这种开发模式。
  从学习的角度,可以从基于寄存器的开发模式入手,这样可以更
加清晰地了解和掌握STM32的架构、原理。从高效开发的角度,从学习容易上手的角度,建议使用基于固件 库函数的开发模式,毕竟这种模式把底层比较复杂的一些原理和概念 封装起来了,更容易理解。这种模式开发的程序更容易维护、移植,开发周期更短,程序出错的概率更小。
  当然,也可以采用基于寄存器和基于固件库混合的方式。
  我们这里采用的就是基于固件库开发。

3.1 去下载固件库

  STM32 的固件库是一个或一个以上的完整的软件包(称为固件 包),包括所有的标准外设的设备驱动程序,其本质是一个固件函数 包(库),它由程序、数据结构和各种宏组成,包括了微控制器所有 外设的性能特征。
  该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间 API(Application Programming Interface,应用编程接口)。
  通过使用固件函数库,无须深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
  每个外设驱动都由一组函数组成,这组函数覆盖了该外设的所有功能。每个器件的开发都由一个通用API驱动,API对该驱动程序的结构、函数和参数名称都进行了标准化。
  ST 公司 2007 年 10 月发布了 V1.0 版本的固件库,2008 年 6 月发布了 V2.0 版的固件库。V3.0 以后的版本相对之前的版本改动较大,本教材使用目前最为通用的 V3.5 版本,该版本固件库支持所有的STM32F10X系列。
  同学们可以去ST的官网下载,查找教程很多,这里不再多说。这里可以直接下载:STM32F10x固件库
在这里插入图片描述
  文件解压后,有四个文件夹和一个后缀为chm的文件。
stm32f10x_stdperiph_lib_um.chm 为已经编译的帮助系统,也就是该固件库的使用手册和应用举例。
  Libraries文件夹下是驱动库的源代码与启动文件。
  Project文件 夹下是用驱动库写的例子和一个工程模板。
  _htmresc 文件夹是 ST 公 司的 LOGO 图标等文件,可以直接忽视它。
  Utilities 文件夹下存放 的是 ST 公司评估板的相关例程代码,可以作为学习资料使用,对程 序开发没有影响,也可以直接忽视它。

  因此,固件库中的核心是Libraries 、 Project 两 个 文 件 夹 及 其 内 容 , 以 及stm32f10x_stdperiph_lib_um.chm 这一已经编译的帮助系统,它主要讲的是如何使用固件库来编写自己的应用程序并举例说明。

  既然 ST 官方给我们提供了使用范例,因此其代码的规范性和正 确性是毋庸置疑的,学习者可以将范例作为快捷地掌握固件库使用方法的重要资料。学习者通过 ST 公司官方提供的范例学习STM32的原理、应用,是一种非常值得推荐的学习方法。

  打开Libraries后,呈现这样的画面:
在这里插入图片描述
  文件夹 CMSIS 包含的是 Cortex-M3 内核自带的外设驱动代码和 启动代码(通常是汇编语言编写的)。双击打开 CMSIS 后,是这样的:
在这里插入图片描述
  核心是CM3文件夹,其余可忽略。双击打开CM3后,是这样的:
在这里插入图片描述
  再双击打开CoreSupport 后,是下面这样的,这是 Cortex-M3 内核自带的外设的驱动程序,十分重要。
在这里插入图片描述
  双击打开DeviceSupport 后,是这样的:
在这里插入图片描述
  再打开ST,
在这里插入图片描述
  打开STM32F10x,
在这里插入图片描述
  除启动文件夹startup 外 , 另 有 3 个 源 程 序 文 件 :stm32f10x.h 、system_stm32f10x.c、system_stm32f10x.h,它们十分重要。
  启动文件夹startup 下又分别包含 arm 等四个对应不同开发环境的启动代码文件夹,如图 2.8所示,其中arm文件夹对应KEIL开发环境
在这里插入图片描述
  这些文件夹下的代码文件均由汇编语言开发,以 arm 文件夹下的 文件为例,其下包含如下图所示的文件,它们实际上是对应不同容量芯片的启动代码。
在这里插入图片描述
  启动代码是任何处理器在上电复位之后最先运行的一段汇编程序代码。启动代码的作用是:
(1) 初始化堆栈指针SP;
(2) 初始化程序计数器指针PC;
(3) 设置异常向量表的入口地址;
(4) 配置外部SRAM作为数据存储器(但一般的开发板没有外部
SRAM);
(5) 设置C程序的分支入口_main(最终用来调用main函数)。
  这些文件分别对应于不同存储器容量(Flash容量)和功能的不同 版本的STM32系列芯片,主要是 小(LD)、中(MD)、大(HD) 容量Flash等不同性能的STM32单片机。

  再回到,打开libraries时的画面:
在这里插入图片描述
  文件夹 STM32F10x_StdPeriph_Driver 包含的是芯片制造商在Cortex-M3 内核上外加的外设的驱动程序,包含 inc(include 的缩 写)与 src(source 的简写)这两个文件夹,如下所示。
在这里插入图片描述
  文件夹inc的内容如下,它包含的是每个驱动文件对应的头文件。当应用程序需要用到某个外设的驱动程序的时候,将它的头文件包含至应用程序即可。
在这里插入图片描述
  文件夹src的内容如下所示,它包含的是每个驱动文件对应的C源代码文件。
在这里插入图片描述
再回到固件库文件夹的初始画面:
在这里插入图片描述
  Project文件夹下的STM32F10x_StdPeriph_Template(工程模板)文件夹下有4个文件很重要,在接下来的工程模板中必须使用,这4个文件如下所示。
在这里插入图片描述

3.2 复制固件库文件

  我们新建一个文件夹,名字随便起,我这里是“7 工程模板示例”,在此文件夹下新建三个空文件夹和一个txt文件。
在这里插入图片描述
它们各自的作用如下:
   (1)Libraries 文件夹就是固件库里的同名文件夹。 这是 STM32单片机及其外设的驱动程序(包括启动代码),不能缺少。

   (2) Output 文件夹主要存储输出文件, 例如,最后编译和链接 生成的机器码文件(HEX 文件),也包括其他文件的中间文件。该文 件夹内容可手工定期清理。模板建立后,该文件下无任何文件。只有
编译和链接后,才会出现很多文件。

  (3) Project 文件夹主要存储开发者自己开发的相关程序文 件,例如,工程文件,main.c,stm32f10x_conf.h (外设头文件配置 文件),stm32f10x_it.c (中断函数文件),stm32f10x_it.h(中断 函数头文件)。当然,如果程序不涉及中断,不需要上述这两个中断 函数相关的文件。但是,作为通用模板,建议保留这两个文件。上述 文件中,除工程文件外,另4个文件可直接从固件库中拷贝得到,这4 个文件的内容均为固件库里的默认内容,根据应用程序的需要,必须要进行相应的修改和调整,尤其是main.c文件,必须重新设计。
  (4)readme.txt 用于说明本程序的使用要求、注意事项、使用方法等。

在这里插入图片描述
在这里插入图片描述

3.2 step-by-step

(1)新建KEIL工程

在这里插入图片描述
输入创建的文件名称,随便写即可。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(2)为工程添加分组(Group)

在这里插入图片描述
在这里插入图片描述
  本例添加了 5 个分组,分别 为:User、Driver、CM3、Startup、Doc
在这里插入图片描述
其作用分别是:
  (1) User—用于管理自行开发的程序代码;
  (2) Driver—用于管理STM32外设的相关驱动程序代码;
  (3) CM3—用于管理CMSIS内核的驱动程序代码;
  (4) Startup—用于管理MDK开发环境下与具体芯片相对应
         的启动代码;
  (5) Doc—用于管理程序的说明文档,例如readme.txt等。

(3)为各组添加相关文件

1)User组–自己写的程序

  添加 Project 文件夹下的 main.c、stm32f10x_it.c,如要调整 系 统 时 钟 设 置 , 还 必 须 添 加Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f1
0x.c。
在这里插入图片描述
在这里插入图片描述

2)Driver组–外设驱动程序

  添加Libraries\STM32F10x_StdPeriph_Driver\src文件夹下的所
有C代码文件。具体文件如图2.22所示。

在这里插入图片描述

3)CM3组–管理内核的驱动程序

  添加Libraries\CMSIS\CM3\CoreSupport\core_cm3.c,如图2.23
所示。

在这里插入图片描述

4)Startup组–启动程序

作用: 管理MDK开发环境下与具体芯片相对应的启动代码。

  添 加
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 文
件夹下的所有ASM代码文件。
在这里插入图片描述
在这里插入图片描述
  可以看到,该组包含了STM32F10x系列的所有8个启动 代码。

  但是,对某一个具体的项目而言,因为选用的 STM32 单片机是 固定的,所以只能使用其中一个启动代码,其余的都必须删除。只是 作为工程模板,为适应不同的型号,所以启动代码都添加进该组。

5)Doc组

  添加模板下的 readme.txt 等文本文件。该文件可对工程的具体环境和注意事项、使用操作等有关情况进行说明, 是一个文本文件。当然,学习者可以忽略该文件,但从开发的角度, 撰写该文档是一个很好的习惯,往往可以达到事半功倍的效果,它可以为后续的软件维护节省很多时间和精力。
在这里插入图片描述

(4)对KEIL开发环境进行必要的设置

  点击魔术棒:
在这里插入图片描述
Target页面下的外部时钟:这里为8.0MHz,可根据实际晶振加以调整。
在这里插入图片描述
Output页面下的设置主要有两个:创建HEX文件选项设置输出文件夹。必须勾选:Create HEX File,
在这里插入图片描述
在这里插入图片描述
然后设置Select Folder for Objects,选择Output文件夹为目标文件夹。
在这里插入图片描述
在这里插入图片描述

C/C++页面下主要设置的选项有两个:Define与Include Paths。
(1) Define:设置为编译过程中的预处理宏定义符号
  举例如下:
  USE_STDPERIPH_DRIVER,STM32F10X_HD。
  第一个宏定义符号表示 要使用固件库,在固件库开发模式下,该符号必须设置;后一个符号 表示选用的是高容量 STM32 芯片。如果是其他容量芯片,请自行调整,如中等容量的为STM32F10X_MD。
  一般说STM32单片机的命名都是STM32F103XYZW这样的方式,其中X表示引脚数,Y表示ROM容量,Z表示封装方式,W表示工作温度范围,比如RBT6表示为64引脚、128KB和LQFP封装,工业温度范围。
  针对ROM容量的字符,表示的容量是:

字符ROM容量
632KB
864KB
B128KB
C256KB
D384KB
E512KB
F768KB
G1024KB

  其中:我们用LD表示16-32K, MD表示64K-128K,HD表示256~512K。我用的芯片是STM32F103C8T6,宏定义符号就是STM32F10X_MD
在这里插入图片描述
  这里再多说一句,这两个宏定义符号都在头文件stm32f10x.h中。
  我们的程序,是写在main.c中,在该文件中,我们要在首行写上,#include "stm32f10x.h",其中#include是一个命令,名为文件包含命令,stm32f10x.h是一个头文件的名字,这句话的意思就是将头文件stm32f10x.h的内容插入到该命令所在的位置,从而把头文件stm32f10x.h和当前源文件main.c连接成一个源文件,这与复制粘贴的效果相同。
  头文件stm32f10x.h的作用解读,大家可以看这篇文章,点击这里

(2) Include Paths:设置为编译过程中文件包含要查找的路径 (Include Paths),单击该选项右侧的按钮,即可设置要包含的路 径。注意:必须把工程模板涉及的所有文件所在的文件夹作为路径设 置进来。
在这里插入图片描述
在这里插入图片描述
Debug 页面下主要设置所使用的仿真器的相关选项。
在这里插入图片描述
可以看到,仿真器有很多种。
STM32常用程序烧录方法
我这里用的是STLink,所以选择ST-Link Debugger,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
勾选这一项之后,我们下载程序后会立马复位并执行程序。

(5)简单配置工程模板中的相关文件

1)main.c的处理
  删除main.c中的内容,只保留下图所示的部分。
在这里插入图片描述

  其中,RCC_Configuration()函数为系统时钟配置函数,直接调 用固件库函数SystemInit(),使用默认值。如需更改,则可以调整
system_stm32f10x.c中的相关语句。

2)stm32f10x_conf.h的处理
该文件是外设的头文件配置。默认是使用所有外设的头文件。在 实际应用中,根据程序的需要,使用相关的头文件。例如,要使用GPIO,则必须包含头文件stm32f10x_gpio.h。从该文件可以看出,头 文件命名非常有规律,所以非常容易使用。

在这里插入图片描述
好啦,配置完成啦。

话说,这个博文,写了两三天,也太慢了,太憨了,哈哈哈哈哈。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三十二画生H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值