固件库结构

  本文使用的固件库是STM32F10x_StdPeriph_Lib_V3.5.0,可以在官网获取。该固件库包含四个文件夹和一个库的说明文档,如下图所示,stm32f10x_stdperiph_lib_um这个英文的帮助文档非常有用,可以很方便地了解某个库函数的使用方法。

Project

  Project文件夹是一些写好的官方例程,便于学习和开发。

Libraries/CMSIS/CoreSupport

  Libraries文件夹下包含了固件库的源代码和启动文件,是固件库的核心所在。如果想要自己建库,就必须包含该文件下大部分源代码。Libraries下包含了CMSISSTM32F10x_StdPeriph_Driver这两个子文件夹,前者是内核相关文件,后者是各种外设的驱动文件。

  CMSIS的组织结构如下图所示,包含了CoreSupportDeviceSupport。其中CoreSpport下是core_cm3的源文件和头文件,与内核寄存器映射相关,一般不需要用户了解和更改。

  

Libraries/CMSIS/DeviceSupport

  DeviceSupport下包含了三个重要的文件,如下图所示。stm32f10x.h实现了片上外设寄存器的映射,例如GPIO寄存器、NVIC中断寄存器等等。此外,它还include了一些重要头文件,例如stdint.h——定义了各种数据类型、core_cm3.hstm32f10x_conf.h——外设头文件的管家,include了大部分外设驱动头文件、system_stm32f10x.h等。所以,一般在用户文件main.c里只要include stm32f10x.h就可以实现大部分头文件的包含。

  system_stm32f10x的源文件和头文件实现了STM32上电时的RCC时钟配置。

  

  DeviceSupport下的startup就是启动文件了,根据设备类型,启动文件有很多种,如下图所示,其中基本型芯片的启动文件有startup_stm32f10x_ld.sstartup_stm32f10x_md.sstartup_stm32f10x_hd.sstartup_stm32f10x_xd.s,分别匹配16~32k、64~128k、256~512k、512~1024k的Flash容量。以STM32F103C8为例,其FLASH容量为64k,因此启动文件选择startup_stm32f10x_md.s

Libraries/STM32F10x_StdPeriph_Driver

  回头看STM32F10x_StdPeriph_Driver,其下的内容就纯粹很多了,只包含incsrc文件夹,分别是外设头文件和源文件的集合。

自定义工程模板

工程文件组

  由于固件库默认使用的设备型号跟我们自己的芯片会有差异,这时候就需要自己来新建工程模板。首先,新建文件结构如下图所示,Doc存放工程代码的说明文档,Libraries跟官方和固件库相同,Project存放工程文件,User存放用户修改创建的代码文件。

  

  

  先从官方固件库中拷贝Libraries,然后还需要从官方固件库的例程中拷贝三个文件:stm32f10x_conf.hstm32f10_it.cstm32f10_it.h。这三个文件所在位置如下左图所示,拷贝到User文件夹下后如右图所示。

                  

  接下来,打开keil5软件,新建工程,选择设备,这里以STM32F103C8为例,如下图所示:

  添加工程文件夹,效果如下:

              

  分别为各文件夹添加源代码文件,只要添加.c和启动文件即可,结果如下:

  最后,我们还缺最重要的main.c文件,可以自己创建一个,并且添加到工程目录中的USER下,main.c内容如下:

#include "stm32f10x.h"

int main()
{
while();
}

配置魔术棒选项

  Output选项卡,将输出文件定位到工程目录的Output文件夹下(如果不存在,可以新建一个),并且勾选HEX选项,如下图所示:

   

  

  C/C++选项卡下,选择头文件包含路径(将文件夹中含头文件代码的目录都添加进来),添加两个宏定义(否则需要在代码中更改添加),结果如下:

   

  

  Linker选项卡下配置实际使用的仿真器,这里我使用的是ST-Link。

  

  到此为止,进行编译,如果没有错误和警告,则大功告成。

最新文章

  1. js 对象合并
  2. Android开发自学笔记(Android Studio) 目录
  3. HDFS体系架构
  4. sqlce中不支持sp_rename修改表名
  5. spi can't create GMem lock
  6. ListView13添加2
  7. Visual Tracker Benchmark
  8. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密
  9. Android中自定义ActionBar的背景色等样式style
  10. poj 3744 矩阵 高斯消元
  11. JAVA线程池学习,ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
  12. ubuntu/deepin 下 Sha 哈 dow 哈 socks 全局配置
  13. elasticsearch常用命令
  14. 【原创】大叔经验分享(31)CM金丝雀Canary报错
  15. 全栈JavaScript之路(十九)HTML5 插入 html标记 ( 一 )innerHTML 与outerHTML
  16. ie和dom事件流的区别
  17. 20172302 《Java软件结构与数据结构》实验一:线性结构实验报告
  18. [转]SSH反向连接及Autossh
  19. PHP 与 YAML
  20. Selenium-ActionChainsApi接口详解

热门文章

  1. 16、python面对对象之类和继承
  2. xlwings excel(二)
  3. Maven的学习之路1
  4. [集训]Trominoes,钩子公式运用
  5. python 3 创建虚拟环境(Win10)
  6. 报错requests.exceptions.InvalidSchema: No connection adapters were found for
  7. JDK源码之Integer类分析
  8. Android和servlet通过json完成登录
  9. 微信小程序框架分析小练手(一)——猫眼电影底部标签导航制作
  10. 一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具