stm32f103学习笔记-11-新建工程(固件库版本)
点明了这样做的好处:我们只需要在编译器全局设置中定义一次,整个工程的所有文件就都能识别到这个宏,而不需要在每个.c文件里都写一遍。
一、STM32固件库工程创建图解全流程
图1:创建新工程 - 开工大吉
-
内容:这是Keil软件的主界面。你点击了
Project菜单,然后选择了New μVision Project...。 -
讲解:这是所有事情的第一步,相当于你决定要“盖一栋新房子”。点击这里,Keil就会引导你创建一个全新的工程文件。
图2:给工程安个“家”(选择保存位置)
-
内容:这是一个保存文件对话框。可以看到,你已经导航到了一个名为
06Template.Fwlib的文件夹下。这个文件夹里已经提前建好了四个子文件夹:Doc,Libraries,Project,User。 -
讲解:这一步是决定把你的“工程蓝图”(Keil工程文件)保存在哪里。最佳实践就是像图中这样,把它保存在
Project文件夹里。这样你的工程结构会非常清晰。
图3:挑选“地基”(选择芯片型号)
-
内容:这是一个芯片选择窗口。你在左侧的树状列表中展开了
STMicroelectronics->STM32F1 Series,并选择了STM32F103这个系列。 -
讲解:STM32有非常多型号,你必须在这里准确选择你使用的芯片型号。这相当于为你的房子选择一块正确的地基。选错型号会导致后续编译和下载出现问题。图中选择F103系列是一个很常见的入门选择。
图4:规划“房间”格局(管理工程组)
-
内容:这是Keil的“Manage Project Items”窗口。在“Groups”列表里,已经创建了好几个组,如
STARTUP,CMSIS,FWLIB,USER,DOC。 -
讲解:这一步是在规划你的工程内部结构。虽然你在电脑上有了实体文件夹(
Libraries,User等),但还需要在Keil工程内创建对应的“虚拟文件夹”(组),方便管理文件。就像房子有客厅、卧室,Keil工程里也用组来分门别类地存放不同用途的源文件。
图5 & 图6 & 图7 & 图8:搬运“建材”(理解库文件结构)
这四张图一起看,展示了官方固件库的来源和内容。
-
图5(核心):左边是你的“模板固件库”文件夹(
06Template.Fwlib/Libraries),右边是“官方固件库”的原始位置。红色箭头指明了文件复制关系。意思是:你需要从右边的官方库中,把必要的文件复制到左边你的工程文件夹里。

-
图6、7、8:这三张图详细展示了需要复制的库文件具体是哪些。主要包含两大部分:
CMSIS(与芯片内核相关的文件):

-
core_cm3.c和core_cm3.h(图7):这是Cortex-M3内核的核心文件。

-
stm32f10x.h,system_stm32f10x.c/.h(图8):这是ST公司为F10x系列写的设备相关文件,非常重要。 -
startup文件夹(图8):里面是启动文件(.s文件),芯片上电后第一个运行的程序。
STM32F10x_StdPeriph_Driver(外设驱动库):
-
包含
inc(.h头文件) 和src(.c源文件) 文件夹,提供了操作GPIO、串口等外设的函数。
图9:整理“建材仓库”(整合库文件)
-
内容:这张图显示的是你的工程目录
06Template.Fwlib/Libraries/CMSIS下的内容。可以看到,已经从官方库复制过来的文件都放在这里了,包括core_cm3.c/.h等。 -
讲解:这一步是手动操作,你需要根据图5-8的指引,将官方库里的必要文件,复制到你工程的
Libraries文件夹下对应的位置。这样,你的工程就拥有了所有必需的“建筑材料”,不再依赖官方库的原始位置。
图10:开始“装修”(编写用户代码)
-
内容:这张图显示的是
User文件夹,里面新建了一个main.c文件,并用记事本打开。文件内容非常简单,只有两行:#include "stm32f10x.h"和空的main函数。 -
讲解:这是你自己写代码的地方!
User文件夹是你的专属工作区。main.c是程序的入口。#include "stm32f10x.h"包含了芯片的所有寄存器定义,是必须写的第一行代码。int main(void)是程序开始执行的地方。
图11 & 图12:整理“建材仓库”——清理无用文件

-
图11内容:在STM32固件库包中找到
Project/STM32F10x_StdPeriph_Template这个官方示例工程文件夹。从官方模板文件夹中,将stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h文件复制到你自己的06Template.Fwlib/User文件夹中,不要直接复制官方的main.c。在你自己的User文件夹里新建一个main.c文件,然后参考官方示例的内容来编写你的主程序。注意system_stm32f10x.c等文件已经存在于Libraries下,切勿重复复制。

-
图12内容:展示了工程
Libraries/CMSIS/startup目录下的内容。这里有一个arm文件夹和多个针对不同编译器的启动文件。右键菜单中,“删除(D)”选项被红框突出显示。 -
讲解:这是一个非常重要的文件管理操作。
startup文件夹里存放了针对不同编译器(如IAR, GCC等)的启动文件。但我们使用的是Keil MDK,所以只需要保留与ARM编译器相关的文件。图中提示“iar文件夹用不到”,指导我们将这些不需要的编译器文件夹和文件删除,只保留我们需要的(通常是arm文件夹下的内容)。这能保持工程简洁,避免混淆。
图13 & 图14 & 图15:为工程添加“核心部件”——启动文件

-
图13内容:文件管理器显示
startup/arm目录下有一系列以startup_stm32f10x_开头的.s文件(汇编文件),移动到startup目录下。

-
图14内容:文件管理器显示
startup目录下的文件列表,删除arm文件夹。

-
图15内容(关键):这是Keil软件的界面。左侧工程管理器中,
STARTUP组被选中。右侧弹出了“Add Files to Group 'STARTUP'”对话框,正在startup文件夹下选择文件。图中选中了startup_stm32f10x_hd.s这个文件,并且“Add”按钮被标红。 -
讲解:这几张图连起来展示了添加启动文件的完整过程。
-
找到文件:在工程的
Libraries/CMSIS/startup目录下找到启动文件。 -
选择正确文件:这些文件后缀表示芯片的Flash容量(
ld-小容量,md-中容量,hd-大容量,xl-超大容量)。你必须根据你的芯片型号选择正确的文件。例如,STM32F103VET6是大容量芯片,就选hd.s的文件。 -
添加到工程:在Keil中,右键点击
STARTUP组,选择“Add Files to Group...”,然后导航到文件位置,选择正确的启动文件并点击“Add”。这个文件是芯片上电后运行的第一段代码,至关重要。
-
图16:添加“核心框架”文件——CMSIS

-
图16内容:Keil界面中,正在向
CMSIS组添加文件。对话框中选中了两个核心C文件:core_cm3.c(Cortex-M3内核支持)和system_stm32f10x.c(芯片特定的系统初始化代码)。 -
讲解:CMSIS是ARM定义的微控制器软件接口标准,为芯片内核提供了一致的接口。
core_cm3.c和system_stm32f10x.c这两个文件是STM32工程运行的基础框架,必须添加到工程中。
图17:添加“功能模块”文件——外设库
-
图17内容:正在向
FWLIB组添加文件。查找范围是src文件夹,里面列出了所有外设驱动的源文件(如stm32f10x_adc.c,stm32f10x_gpio.c等)。 -
讲解:
FWLIB(固件库)包含了ST官方编写的用于操作STM32所有外设(如GPIO、串口、定时器等)的函数。通常的做法是,点击“Add”按钮旁边的下拉箭头,选择“Add All files in the folder...”或按住Ctrl键全部选中,将它们一次性全部添加到工程中。编译器在最后链接时,只会将程序中实际用到的外设代码包含进来,所以全添加进去并不会增加最终程序的大小,但会给开发带来极大便利。
图18 & 图19:添加“自定义内容”——用户文件与文档
-
图18内容:向
USER组添加,User文件夹下的文件:main.c(主程序),stm32f10x_it.c(中断服务程序)。

-
图19内容:向
DOC组添加文档。正在添加Doc文件夹下的readme.txt文件。 -
讲解:
-
USER组:这里是你大展拳脚的地方。你需要将
main.c等自己编写的代码文件添加进来。stm32f10x_conf.h这个文件非常重要,用于通过宏定义开启或关闭你使用的外设,以优化编译。 -
DOC组:这是一个好习惯,用于存放工程说明文档
readme.txt,可以记录工程信息、版本记录等。
-
图20:最关键的配置——“告诉编译器头文件在哪”
-
图20内容:这张图信息量很大。它并排显示了文件资源管理器(左)和Keil的代码编辑界面(右)。代码中
#include "stm32f10x.h"这一行下方有红色波浪线报错。文件管理器展示了两个stm32f10x.h文件路径:一个在我们自己工程的Libraries/CMSIS下,另一个在Keil软件的安装目录下。 -
讲解:这是整个工程创建过程中最容易出错、也最重要的一步!
-
问题:虽然你把所有
.c源文件都添加到了工程里,但当你编写代码#include "stm32f10x.h"时,编译器并不知道去哪里找这个头文件。因此会报错。 -
解决方案:必须手动设置头文件包含路径。
-
图21:设置“头文件搜索路径”——告诉编译器“.h文件在哪”
-
图解场景:这张图展示了如何设置头文件包含路径。左侧是工程结构,右侧是“Options for Target”窗口中“C/C++”选项卡下的“Include Paths”设置界面。
-
核心问题:我们在代码中写
#include "stm32f10x.h",编译器如何知道这个文件在哪个文件夹里? -
解决方案:就是本图展示的操作——在“Include Paths”里添加路径。
-
点击“Include Paths”输入框右边的按钮,会弹出文件夹选择窗口。
-
将你的工程中所有存放.h头文件的文件夹路径添加进去。图中红色框标注提示,只需要添加到最后一级目录即可:
-
..\Libraries\CMSIS(存放stm32f10x.h等核心文件) -
..\Libraries\STM32F10x_StdPeriph_Driver\inc(存放所有外设的头文件,如stm32f10x_gpio.h) -
..\User(存放你自己编写的头文件,如stm32f10x_conf.h)
-
这是解决 fatal error: stm32f10x.h: No such file or directory错误的唯一方法。只要编译报错找不到头文件,第一个就要来检查这里。
图22:定义核心宏 USE_STDPERIPH_DRIVER——启用固件库
-
图解场景:这张图并排展示了“C/C++”选项的配置界面(左)和
stm32f10x.h文件中的一段代码(右)。 -
核心代码分析:看图片右侧的代码编辑器,在第8300行左右,有这样一段条件编译代码:
#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif-
含义:这段代码的意思是,只有当预定义了一个叫做
USE_STDPERIPH_DRIVER的宏时,编译器才会去包含stm32f10x_conf.h这个文件。 -
重要性:
stm32f10x_conf.h是固件库的配置文件,你需要在里面开启或关闭你使用的外设。如果不定义USE_STDPERIPH_DRIVER宏,这个配置文件就不会被包含,固件库也就无法正常使用。
-
-
解决方案:看图片左侧的“Preprocessor Symbols”下的“Define”输入框。我们在这里手动输入
USE_STDPERIPH_DRIVER。-
图中的中文注释“避免每一个使用conf.h的文件里反复定义”点明了这样做的好处:我们只需要在编译器全局设置中定义一次,整个工程的所有文件就都能识别到这个宏,而不需要在每个.c文件里都写一遍
#define USE_STDPERIPH_DRIVER。
-
图23:定义设备型号宏(如STM32F10X_HD)——告诉库你的芯片是谁
-
图解场景:这张图同样结合了代码(
stm32f10x.h)和配置界面(“C/C++”选项卡的“Define”输入框)。 -
核心代码分析:看图片右侧的代码,在60多行的地方,文件本身提供了一种最直接但不推荐的方法来定义芯片型号:直接取消对应代码行的注释,例如
#define STM32F10X_HD。图片中用绿色框标出了这种方式。 -
最佳实践:图片下方的英文提示和红色框指出了正确的方法:“为了避免每次切换设备时都修改此文件,你可以在编译器预处理器中定义设备宏。”
-
解决方案:看图片左下角叠加的配置窗口,在“Define”输入框中,我们在之前定义的
USE_STDPERIPH_DRIVER后面,用一个英文逗号隔开,继续添加芯片型号宏,例如STM32F10X_HD。 -
这个宏的意义:它告诉固件库,你使用的STM32F10x系列芯片的Flash容量等级是大容量(High Density)。这个定义会影响芯片底层寄存器的映射和一些内存计算,必须根据你的实际芯片型号来选择了(LD-小容量,MD-中容量,HD-大容量,XL-超大容量)。
好的,看来这10张新图片详细展示了在Keil环境中进行工程配置的后续关键步骤。这些步骤正是将我们准备好的“房子框架”和“建筑材料”变为一个可编译、可下载、可调试的完整工程的核心环节。
下面我将结合这些图片,为你进行详细的讲解。
二、STM32工程创建后Keil环境配置图解全流程
图1:Target选项卡配置——选择“地基”和“基础工具”
-
内容:展示了“Options for Target”窗口的“Target”选项卡。
-
关键配置讲解:
-
设备型号:已正确选择
STMicroelectronics STM32F103VE。这是工程的基础。 -
晶振频率:
Xtal (MHz)设置为12.0。这个频率需要与你硬件上使用的实际晶振频率一致,它会影响串口波特率、延时函数等的计算。 -
必选项:勾选
Use MicroLIB。图中下方的中文标注“微库用于串口”点明了其核心作用:这个精简C库是后续使用printf函数通过串口打印信息的前提条件。此项必须勾选。
-
图2:Output选项卡配置——生成“最终产品”
-
内容:展示了“Output”选项卡。
-
关键配置讲解:
-
必选项:勾选
Create HEX File。勾选后,编译器在编译成功后会生成一个.hex格式的文件,这个文件就是可以下载到STM32芯片中执行的最终程序文件。 -
可选项:勾选
Browse Information。勾选后,你可以在代码中按F12跳转到函数或变量的定义处,方便调试。这会增加编译时间,但建议勾选。
-
图3 & 图4 & 图5:管理编译输出文件

-
内容:图3展示了一个用于清理这些中间文件的批处理脚本
keilkill.bat。这三张图展示了如何设置编译过程中产生的Objects(图4)和Listings(图5)等中间文件的存放目录。 -
讲解:
keilkill.bat脚本(图3)则可以一键删除这些临时文件以节省空间,是一个非常实用的“清理”工具。Keil编译会产生大量临时文件。通过“Select Folder for Objects/Listings...”按钮,可以将它们集中存放在指定目录下,Output和Listings文件夹自动生成默认存放在Project文件夹下面。这样做的好处是工程结构清晰。
图6 & 图7:Debug调试器配置——连接“调试桥梁”

-
内容:图6选择调试工具,图7配置调试工具参数。
-
关键配置讲解:
-
选择调试器:在图6右侧,选择你的硬件仿真器,例如
CMSIS-DAP Debugger(根据你使用的实际调试工具选择)。 -
配置连接:点击
Settings进入图7的界面。这里是最容易连接失败的地方。-
端口:选择
SW(最常用)。 -
时钟速率:可以设置为
5MHz,如果连接不稳定可以尝试降低频率。 -
检查连接:最关键的步骤!确保右下角“SW Device”列表中能识别到你的芯片,并显示一个有效的
IDCODE。如果这里是空的,说明仿真器与芯片连接失败,需要检查硬件连接、驱动或电源。图中的标注“上电+连接编译器”是基本前提。
-
-
图8:Flash Download配置——设置“程序烧录”
-
内容:展示了“Flash Download”选项卡,用于配置程序下载到芯片闪存的行为。
-
关键配置讲解:
-
下载算法:在“Programming Algorithm”列表中,必须添加与你芯片型号匹配的算法。图中已添加
STM32F10x High-density Flash(适用于大容量F103芯片)。如果这里为空或选错,会导致下载失败。 -
重要选项:勾选
Reset and Run。这个选项的作用是,在程序下载完成后自动复位并运行。如果不勾选,下载后芯片会停止在复位状态,需要手动复位才能运行程序。
-
图9 & 图10:编辑器个性化设置——优化“编码体验”
-
内容:这两张图是Keil编辑器的个性化设置,与工程编译无关,但能极大提升编码舒适度。
-
关键配置讲解:
-
关闭动态语法检查:在图9的“Text Completion”中,取消勾选
Dynamic Syntax Checking的Enable。Keil自带的动态检查非常不准确,会产生大量烦人的红色波浪线,关闭后世界就清净了。 -
设置中文编码:在图10的“Editor”选项卡中,将
Encoding设置为 Chinese GB2312 (Simplified)。这可以完美支持中文注释和显示,并解决删除一个中文字符需要按两次删除键的问题。
-
三、全流程框图注解

四、STM32新手工程创建终极检查清单
第一阶段:准备工作——“搭好房子框架”
-
[ ] 工程目录检查
-
是否在指定位置创建了清晰的文件夹结构?
-
Template/(工程总文件夹)-
Project/(只放Keil工程文件.uvprojx) -
Libraries/(存放官方固件库文件,只读,一般不修改) -
User/(存放你自己编写的所有代码,如main.c) -
Document/(存放说明文档readme.txt)
-
-
第二阶段:Keil工程设置——“绘制施工蓝图”
-
[ ] 芯片型号选择
-
新建Keil工程时,是否准确选择了你的STM32芯片具体型号?(如STM32F103VE)
-
陷阱:选错型号会导致程序无法正常运行。
-
-
[ ] 工程分组管理
-
是否在Keil工程内创建了与文件夹对应的“组”(Groups)?如:
STARTUP,CMSIS,FWLIB,USER。 -
目的:让工程结构清晰,便于管理。
-
第三阶段:文件管理——“搬运和整理建材”
-
[ ] 固件库文件复制
-
是否已将官方固件库中必要的文件(如
CMSIS和STM32F10x_StdPeriph_Driver文件夹)复制到你自己的Libraries文件夹下? -
关键:确保工程不再依赖官方库的原始位置。
-
-
[ ] 清理无用文件
-
是否删除了
Libraries文件夹中与你开发环境无关的文件?(如针对IAR、GCC编译器的启动文件,只保留arm文件夹下的)
-
-
[ ] 添加文件到Keil组
-
是否将以下文件添加到了Keil工程对应的组里?
-
STARTUP组:添加正确的启动文件(startup_stm32f10x_xx.s,根据芯片容量选ld/md/hd)。 -
CMSIS组:添加core_cm3.c和system_stm32f10x.c。 -
FWLIB组:添加Libraries/STM32F10x_StdPeriph_Driver/src/下的所有.c文件。 -
USER组:添加你自己User/文件夹下的main.c,stm32f10x_it.c等。
-
第四阶段:核心配置——“最关键的两步,90%的错误由此产生!”
-
[ ] 头文件路径设置(重中之重!)
-
点击魔术棒
Option for Target->C/C++选项卡。 -
是否在
Include Paths中添加了以下三个路径?(路径指向的是文件夹,不是文件)-
../Libraries/CMSIS -
../Libraries/STM32F10x_StdPeriph_Driver/inc -
../User
-
-
症状:如果漏掉,编译会报错
fatal error: stm32f10x.h file not found。
-
-
[ ] 预定义宏设置(同样重要!)
-
在同一个
C/C++选项卡的Define输入框中,是否用英文逗号分隔,添加了以下两个宏?-
USE_STDPERIPH_DRIVER(启用固件库,没有它库函数无效) -
STM32F10X_HD(根据你的芯片容量选择,HD为大容量,还有MD,LD,XL)
-
-
症状:如果漏掉或写错,编译可能通过,但程序运行会异常或外设无法使用。
-
第五阶段:编译与调试——“收尾工作”
-
[ ] Target选项卡必选项
-
是否勾选了
Use MicroLIB?(必须勾选,否则后续串口printf无法使用)
-
-
[ ] Output选项卡必选项
-
是否勾选了
Create HEX File?(必须勾选,才能生成可下载到芯片的文件)
-
-
[ ] Debug仿真器配置
-
Debug选项卡中,是否选择了你的仿真器(如CMSIS-DAP)? -
点击
Settings,确认能否识别到设备,端口是否设置为SW,速率是否合理(如5MHz)。 -
Flash Download选项卡中,是否勾选了Reset and Run?(建议勾选,下载后自动运行程序)
-
-
[ ] 首次编译
-
点击
Build(小锤子)进行编译。 -
目标:出现
0 Error(s)。有少量警告(Warning)可以暂时忽略。 -
如果报错:90%的概率是第7步和第8步没做对,请返回仔细检查!
-
-
[ ] 下载与调试
-
点击
Load(向下箭头)下载程序到芯片。 -
按
F12键尝试跳转到函数定义,测试调试功能是否正常。
-
更多推荐





所有评论(0)