引入:
准备: STM32固件库包。

  ST官方提供的STM32固件库包:STM32F10x_StdPeriph_Lib_V3.5.0(文件夹名)
介绍:
  文件夹含有:Libraries、Project、Utilities等文件夹。
    Libraries文件夹含有:CMSIS、STM32F10x_StdPeriph_Driver(包含固件库核心的所有子文件夹和文件,建立工程时都会使用到)
      CMSIS文件夹:为启动文件。
        |________ core_cm.c、core_cm.h【…\Libraries\CMSIS\CM3\CoreSupport】: CMSIS核心文件,提供进入M3内核接口。
        |________ STM32F10x文件夹【…\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x】: 启动文件、比较基础的寄存器定义和中断向量定义的文件,含有:
  1、system_stm32f10x.c与system_stm32f10x.h的功能:设置系统以及总线时钟,里面有SystemInit()函数,在系统启动时都会调用,设置系统整个时钟系统。
  2、stm32f10x.h:这个文件就相当重要,只要你做STM32开发,几乎时刻都要查看这个文件相关的定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义申明以及包装内存操作,对于这里是怎样申明以及怎样将内存操作封装起来的。
  3、startup文件夹:启动文件,里面包含8个启动文件,根据不同容量的芯片,启动文件是不同的。
    小容量:FLASH≤32K   === 》ld.s
    中容量:64K≤FLASH≤128K   === 》md.s
    大容量:256K≤FLASH  === 》hd.s
  启动文件是进行堆栈之类的初始化,中间向量表以及中断函数定义。Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。Reset_handler在我们系统启动的时候会调用。启动文件要引导进入main函数,同时在进入main函数之前,首先要调用SystemInit系统初始化。
      STM32F10x_StdPeriph_Driver文件夹:为STM32固件库源码文件。
            |______________ inc: 存放的是stm32f10x_xxx.h头文件。
            |______________ src: 存放的是stm32f10x_xxx.c格式固件库源码文件。
(每一个.c文件和相应的.h文件对应,这里的文件也是固件库的核心文件,每个外设对应一组文件)

    Project文件夹含有:STM32F10x_StdPeriph_Examples、STM32F10x_StdPeriph_Template
      STM32F10x_StdPeriph_Examples文件夹:ST官网提供的固件实例源码,(可参考修改这个官方提供的实例来快速驱动自己的外设)
      STM32F10x_StdPeriph_Template文件夹:工程模版。

    Utilities文件夹含有:官方评估板的一些对应源码(可忽略)

    stm32f10x_stdperiph_lib_um文件:固件库帮助文档(英文版)

建立STM32F1工程模版
  步骤一
  电脑某目录下创建文件夹:Tempalte——点入再创建子文件夹:USER

  步骤二
  打开MDK软件(若之前有打开项目,点击菜单选项卡“Project”——“Close Project””)——菜单选项卡“Project”——“New Uvision Project…”——定位到刚才建立的文件夹USER——点击“保存”,如下图:
在这里插入图片描述

步骤三

  这时会跳出选择芯片型号的界面,再此之前需要先添加(这边不做介绍)
  选择对应自己主板对应的芯片型号即可。
在这里插入图片描述

点击“OK”后跳出下面的界面(可添加自己需要的组件,方便构建开发环境)直接点击“X”或者“Cancel”.
在这里插入图片描述

步骤四

  这样便创建了下图所示的框架,还需要添加启动代码和.c文件。
在这里插入图片描述

且若查看对应目录下USER文件夹,会自动创建一些文件,如下图所示:
在这里插入图片描述

这边对以上文件做些简要说明:
    Tempalte.uvprojx文件(带Keil图标的文件): 是工程文件,非常关键。
    Listings、Objects文件夹: 用于存放编译过程产生的中间文件。现在是空的,可删除。【后面我们会把它们设置到新创建的文件夹OBJ中】

  步骤五
  在文件夹Tempalte下再创建3个文件夹:CORE、OBJ、STM32F10x_FWLib。
    CORE文件夹: 存放核心文件和启动文件 。
    OBJ文件夹:存放编译过程文件以及hex文件。
【之前说的USER文件夹下Listings、Objects文件夹后面会设置放在OBJ文件夹中】
    STM32F10x_FWLib文件夹:存放ST官方提供的库函数源码文件。
    USER文件夹(前面创建的文件):存放工程文件、main.c、system_stm32f10x.c等等。
  如下图所示:
在这里插入图片描述

步骤六
  复制固件库文件夹中STM32F10x_StdPeriph_Driver文件夹下的inc、src的文件夹)【…\Libraries\STM32F10x_StdPeriph_Driver】到 STM32F10x_FWLib文件夹。
     inc文件夹存放的是:固件库.c文件。
     src文件夹存放的是:固件库.h文件。
    (每个外设对应一个.c文件和一个.h文件)

在这里插入图片描述

步骤七
  复制固件库文件夹中CoreSupport文件夹下的core_cm3.c、core_cm3.h文件)【…\Libraries\CMSIS\CM3\CoreSupport】到 CORE文件夹。

  复制固件库文件夹中arm文件夹下的startup_stm32f10x_hd.s文件{启动文件})【…\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm】到 CORE文件夹。
在这里插入图片描述

步骤八
  复制固件库文件夹中STM32F10x文件夹下的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h三个文件)【…\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x】到 USER文件夹。

  复制固件库文件夹中STM32F10x_StdPeriph_Template文件夹下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四个文件)【…\Project\STM32F10x_StdPeriph_Template】到 USER文件夹。
在这里插入图片描述

到这边,我们就将固件库中所需要的文件都复制好了。

  步骤九

  接下来,需要将刚刚复制的文件都加入到我们的工程中去。右击Projectc窗口下的“Target1”——“Manage Project Item”。

在这里插入图片描述

将“Target1(双击)”修改为“Tempalte”,“Source Group1(双击)””修改为“USER”并在下面添加“CORE”、“FWLIB”,如下图所示后。
在这里插入图片描述

再对不同的文件夹添加文件。
一、选中USER文件夹,点击“Add Files…”,找到USER目录下,添加三个文件:system_stm32f10x.c、stm32f10x_it.c、main.c
在这里插入图片描述

在这里插入图片描述

二、选中CORE文件夹,点击“Add Files…”,找到CORE目录下,添加两个文件(注意文件类型要选择All files才可以看到全部后缀文件)core_cm3.c、startup_stm32f10x_hd.s
在这里插入图片描述

在这里插入图片描述

三、选中FWLIB文件夹,点击“Add Files…”,找到STM32F10x_FWLib目录下src文件夹中,添加其所有文件(使用快捷键Ctrl+A全选)
在这里插入图片描述

在这里插入图片描述

这样就将所有文件都添加到项目中。
在这里插入图片描述

 步骤十

  接下来会进行编译,编译过程会产生很多中间文件(垃圾文件 ),所以现在要先设置一下。
  选择魔术棒(Options for Target…)——选项卡“Output”——勾选“Creat HEX File”.
在这里插入图片描述

 选择魔术棒(Options for Target…)——选项卡“Output”——“Select Folder for Objects…”(默认是定位在我们刚刚说的Objects文件夹,前面说移动OBJ文件夹中)
在这里插入图片描述

再点击“OK”,则表示路径设置完成。

  步骤十一
  这时候,可以尝试编译一下,会发现编译器会报错,报错头文件路径找不到。
  这种原因多半是两原因:①头文件根本不存在。②头文件路径没包含到工程。
  那么,我们需要让头文件路径包含到工程中:

  选择魔术棒(Options for Target…)——选项卡“C/C++”——点击“Include Paths”右侧的按钮“…”——在点击“New”或者双击——点击按钮“…”选择以下三个路径(包含头文件的路径,且必须包含到最后一级)
    1、…\CORE
    2、…\USER
    3、…\STM32F10x_FWLib\inc
  这三个文件夹下都包含着头文件 ,所以三个路径一定要包含进去。
在这里插入图片描述

步骤十二
  这时候,可以尝试编译一下,会发现编译器会报错,报错有很多重复定义,这就是需要宏定义“ STM32F10X_HD,USE_STDPERIPH_DRIVER”。(千万注意不要写错了=)
  选择魔术棒(Options for Target…)——选项卡“C/C++”——“Preprocessor Symbols”下的“Define”旁的空格输入:STM32F10X_HD,USE_STDPERIPH_DRIVER——点击“OK”
在这里插入图片描述

步骤十三

  现在再次编译一遍,会发现还是有一个错误,那是因为main函数的问题,我们需要修改main函数就不会报错了,大家可以选择:选项卡下“Project”——“USER”——双击main.c——全选(Ctrl+A)+删除后,粘贴以下程序:

#include "stm32f10x.h"
/************************************************
 ALIENTEK 精英STM32F103开发板实验0
 工程模板
 注意,这是手册中的新建工程章节使用的main文件 
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/


 void Delay(u32 count)
 {
   u32 i=0;
   for(;i<count;i++);
 }
 int main(void)
 {	
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
  RCC_APB2Periph_GPIOE, ENABLE);	    //使能PB,PE端口时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;			    //LED0-->PB.5 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	 //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);			     //初始化GPIOB.5
  GPIO_SetBits(GPIOB,GPIO_Pin_5);					//PB.5 输出高
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	            //LED1-->PE.5推挽输出
  GPIO_Init(GPIOE, &GPIO_InitStructure);	  	       //初始化GPIO
  GPIO_SetBits(GPIOE,GPIO_Pin_5); 			 //PE.5 输出高 	  
  while(1)
	{
	  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	  GPIO_SetBits(GPIOE,GPIO_Pin_5);
		Delay(3000000);
		GPIO_SetBits(GPIOB,GPIO_Pin_5);
		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
		Delay(3000000);	
	}
 }