1. 下载官方软件包
	a. 官网 st.com
	b. 选择本地站点
	c. 搜索目标芯片 STM32F103C8
	d. 选择工具和软件
	e. 在工具和软件的快速链接中选择MCU及MPU嵌入式软件
	f. 找到STM32CubeF1  原厂固件包示例源码
		i. 这个资料包包含了HAL库,CMSIS、RTOS、还有例程,新建我们自己的工程,就是从这个包里面拿到我们需要的支持文件
	g. 点击STM32CubeF1进去
		i. 里面通常有两个包,一个是完整包,一个是补丁包path,一般只需要完整包就行
2. 需要以下文件
	a. 启动文件 
		i. startup_stm32f103xb.s
			1) \STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm
			2) 芯片启动一开始会执行的汇编代码,里面设置了堆栈的大小,并跳入到system_stm32f1xx.c文件的SystemInit()函数进行一些系统的初始化,然后跳入到main()函数
	b. 库文件 
		i. STM32F1xx_HAL_Driver文件夹
			1) \STM32Cube_FW_F1_V1.8.0\Drivers
			2) 包含hal库的所有文件,开发者可以直接使用hal函数来操作芯片,而不用操作寄存器
	c. CMSIS标准接口文件
		i. CMSIS文件夹
			1) \STM32Cube_FW_F1_V1.8.0\Drivers
	d. 初始化文件
		i. system_stm32f1xx.c
			1) \STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates
		ii. system_stm32f1xx.h
			1) \STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Include
	e. st处理器的中断处理文件
		i. stm32f1xx_it.c
			1) \STM32Cube_FW_F1_V1.8.0\Projects   
				a) 可以在这个路径下的工程任意选一个例程里面的src文件夹下找到
				b) 最好找template工程的 这样的代码比较干净,别的例程可能会用到一些中断
		ii. stm32f1xx_it.h
			1) \STM32Cube_FW_F1_V1.8.0\Projects   
				a) 可以在这个路径下的工程任意选一个例程里面的inc文件夹下找到
				b) 最好找template工程的 这样的代码比较干净,别的例程可能会用到一些中断
	f. st处理器的HAl库的配置文件
		i. stm32xxx_hal_conf.h
		ii. \STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_conf_template.h
		iii. 把stm32f1xx_hal_conf_template.h的template删掉就行
		iv. 同样的,如果从别的例程里面复制,例程里面用到的功能不一样,不如拿最干净的,自己改
		v. hal库的配置文件 通过宏来控制哪部分功能需要使用,减少代码空间
3. 代码工程目录
	a. 1_APP
		i. 应用层,存放业务逻辑代码文件
	b. 2_Device
		i. 设备层,存放设备层代码文件
	c. 3_protocol
		i. 协议层,存放协议层代码文件,比如网络通信协议,蓝牙协议
	d. 4_Middleware
		i. 中间组件层,例如RTOS实时操作系统,FatFs文件系统
	e. 5_Platform
		i. 平台层代码文件
	f. 6_MoudleDriver
		i. 外设模块代码文件
	g. 7_HAL
		i. 硬件抽象层,存放处理器的内核接口文件和库文件
	h. 8_Core
		i. 处理器需要的一些配置文件,比如hal库的配置文件Stm32xxx_hal_conf.h,中断处理文件Stm32xxx_it.c和Stm32xxx_it.h,系统初始化文件system_stm32f1xx.c和system_stm32f1xx.h,
		ii. 还可以新建stm32f1xx_clk.c和stm32f1xx_clk.h来存放stm32的时钟树配置函数
	i. Project
		i. 工程文件,启动文件startup.s也放到这里
4. 移植
	a. 把STM32F1xx_HAL_Driver和CMSIS这两个文件夹复制到7_HAL文件夹
	b. 把启动文件startup_stm32f103xb.s复制到Project文件夹
	c. 中断处理文件stm32f1xx_it.c和stm32f1xx_it.h复制到8_Core文件夹
	d. hal库配置文件stm32xxx_hal_conf.h复制到8_Core文件夹
	e. 系统初始化文件system_stm32f1xx.c和system_stm32f1xx.c复制到8_Core文件夹
5. 新建keil工程
	a. 选择stm32F103C8芯片
		i. 如果没有stm32系列的芯片选择,是因为没有给keil安装stm32F103的芯片支持包Keil.STM32F1xx_DFP.2.3.0.pack,有了这个包,keil就知道芯片的flash地址ram地址,大小这些,主频大小,这个文件一样是可以在官网找到的
	b. 工程里面把代码工程目录建好,把移植中出现的文件(不包括第一步的文件夹)添加到工程对应的文件夹
	c. 把系统必须的hal库文件添加到工程中的文件夹7_HAL
		i. stm32f1xx_hal.c     系统滴答定时器和仿真调试
		ii. stm32f1xx_hal_cortex.c  内核相关
		iii. stm32f1xx_hal_dma.c   内核有些地方需要用到dma,加上比较好
		iv. stm32f1xx_hal_gpio.c  gpio相关  最小系统,外部晶振需要用到
		v. stm32f1xx_hal_gpio_ex.c  gpio拓展的,一些不常用的函数
		vi. stm32f1xx_hal_pwr.c  低功耗电源管理相关
		vii. stm32f1xx_hal_rcc.c  时钟树相关
		viii. stm32f1xx_hal_rcc_ex.c  时钟树拓展的,不常用的一些函数
		ix. 上面的去掉一些也能正常运行,但是教程是添加了这些,以后慢慢研究具体文件用处
	d. Options for target
		i. Target界面下,ARM Compiler 选择use default compiler version 5
		ii. Output界面下,勾选Create HEX_File,这样编译的时候就会生成HEX烧录文件
			1) 如果需要编译完成之后生成bin文件,需要在User界面下,添加命令,在After Build/rebuild
		iii. C/C++界面
			1) 优化等级Optimization选择Level 0(-o0)   优化等级最低
			2) 勾选C99 Mode 可以支持C99的语法
			3) define框框 定义两个必须的宏 
				a) 使用HAL库USE_HAL_DRIVER  
					i) 这个宏在stm32f1xx.h里面做了判断,如果定义了这个宏,就包含 #include "stm32f1xx_hal.h",这个文件又包含了#include "stm32f1xx_hal_conf.h"定义了所有的hal的所有功能,stm32f1xx_hal.h定义了系统滴答定时器功能和仿真调试功能
					ii) stm32f1xx.h这个文件是被system_stm32f1xx.c包含的
				b) 定义芯片型号STM32F103xB
					i) 这个宏在stm32f1xx.h里面做了判断,如果定义了这个宏,就包含#include "stm32f103xb.h",这个文件定义了stm32f103xb的寄存器地址等。
			4) Include Paths框框 设置工程除了C语言标准库的其他头文件路径
				a) #include<> 直接去C语言标准库的路径去找(这里是安装keil软件自动设置好的,在keil的安装路径下可以找到C语言的标准库的文件,如果是别的软件使用gcc去编译,就需要在系统环境变量中添加相对应的路径)
				b) #include“”去这里设置的头文件路径去找,找不到再去标准库路径
		iv. Debug界面,仿真调试设置
		 v.方便所有文件字符类型相同,建议在菜单栏edit->configuration->editor->encoding选择UTF-8