一、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.ccore_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.csystem_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”里添加路径。

    1. 点击“Include Paths”输入框右边的按钮,会弹出文件夹选择窗口。

    2. 将你的工程中所有存放.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”选项卡。

  • 关键配置讲解​:

    1. 设备型号​:已正确选择STMicroelectronics STM32F103VE。这是工程的基础。

    2. 晶振频率​:Xtal (MHz)设置为12.0。这个频率需要与你硬件上使用的实际晶振频率一致,它会影响串口波特率、延时函数等的计算。

    3. 必选项​:​勾选 Use MicroLIB。图中下方的中文标注“微库用于串口”点明了其核心作用:这个精简C库是后续使用printf函数通过串口打印信息的前提条件。​此项必须勾选

图2:Output选项卡配置——生成“最终产品”​
  • 内容​:展示了“Output”选项卡。

  • 关键配置讲解​:

    1. 必选项​:​勾选 Create HEX File。勾选后,编译器在编译成功后会生成一个.hex格式的文件,这个文件就是可以下载到STM32芯片中执行的最终程序文件。

    2. 可选项​:勾选 Browse Information。勾选后,你可以在代码中按F12跳转到函数或变量的定义处,方便调试。这会增加编译时间,但建议勾选。

图3 & 图4 & 图5:管理编译输出文件
  • 内容​:图3展示了一个用于清理这些中间文件的批处理脚本keilkill.bat。这三张图展示了如何设置编译过程中产生的Objects(图4)和Listings(图5)等中间文件的存放目录。

  • 讲解​:keilkill.bat脚本(图3)则可以一键删除这些临时文件以节省空间,是一个非常实用的“清理”工具。Keil编译会产生大量临时文件。通过“Select Folder for Objects/Listings...”按钮,可以将它们集中存放在指定目录下,OutputListings文件夹自动生成默认存放在Project文件夹下面。这样做的好处是工程结构清晰。

图6 & 图7:Debug调试器配置——连接“调试桥梁”​
  • 内容​:图6选择调试工具,图7配置调试工具参数。

  • 关键配置讲解​:

    1. 选择调试器​:在图6右侧,选择你的硬件仿真器,例如 CMSIS-DAP Debugger(根据你使用的实际调试工具选择)。

    2. 配置连接​:点击Settings进入图7的界面。这里是最容易连接失败的地方。

      • 端口​:选择 SW(最常用)。

      • 时钟速率​:可以设置为 5MHz,如果连接不稳定可以尝试降低频率。

      • 检查连接​:最关键的步骤!确保右下角“SW Device”列表中能识别到你的芯片,并显示一个有效的IDCODE。如果这里是空的,说明仿真器与芯片连接失败,需要检查硬件连接、驱动或电源。图中的标注“上电+连接编译器”是基本前提。

图8:Flash Download配置——设置“程序烧录”​
  • 内容​:展示了“Flash Download”选项卡,用于配置程序下载到芯片闪存的行为。

  • 关键配置讲解​:

    1. 下载算法​:在“Programming Algorithm”列表中,必须添加与你芯片型号匹配的算法。图中已添加STM32F10x High-density Flash(适用于大容量F103芯片)。如果这里为空或选错,会导致下载失败。

    2. 重要选项​:​勾选 Reset and Run。这个选项的作用是,在程序下载完成后自动复位并运行。如果不勾选,下载后芯片会停止在复位状态,需要手动复位才能运行程序。

图9 & 图10:编辑器个性化设置——优化“编码体验”​
  • 内容​:这两张图是Keil编辑器的个性化设置,与工程编译无关,但能极大提升编码舒适度。

  • 关键配置讲解​:

    1. 关闭动态语法检查​:在图9的“Text Completion”中,​取消勾选 Dynamic Syntax CheckingEnable。Keil自带的动态检查非常不准确,会产生大量烦人的红色波浪线,关闭后世界就清净了。

    2. 设置中文编码​:在图10的“Editor”选项卡中,将 Encoding设置为 ​Chinese GB2312 (Simplified)。这可以完美支持中文注释和显示,并解决删除一个中文字符需要按两次删除键的问题。


三、全流程框图注解


四、​STM32新手工程创建终极检查清单

第一阶段:准备工作——“搭好房子框架”​
  1. [ ] ​工程目录检查

    • 是否在指定位置创建了清晰的文件夹结构?

    • Template/(工程总文件夹)

      • Project/只放Keil工程文件.uvprojx)

      • Libraries/(存放官方固件库文件,只读,一般不修改)

      • User/(存放你自己编写的所有代码,如main.c)

      • Document/(存放说明文档readme.txt)

第二阶段:Keil工程设置——“绘制施工蓝图”​
  1. [ ] ​芯片型号选择

    • 新建Keil工程时,是否准确选择了你的STM32芯片具体型号?(如STM32F103VE)

    • 陷阱​:选错型号会导致程序无法正常运行。

  2. [ ] ​工程分组管理

    • 是否在Keil工程内创建了与文件夹对应的“组”(Groups)?如:STARTUP, CMSIS, FWLIB, USER

    • 目的​:让工程结构清晰,便于管理。

第三阶段:文件管理——“搬运和整理建材”​
  1. [ ] ​固件库文件复制

    • 是否已将官方固件库中必要的文件(如CMSISSTM32F10x_StdPeriph_Driver文件夹)复制到你自己的Libraries文件夹下?

    • 关键​:确保工程不再依赖官方库的原始位置。

  2. [ ] ​清理无用文件

    • 是否删除了Libraries文件夹中与你开发环境无关的文件?(如针对IAR、GCC编译器的启动文件,只保留arm文件夹下的)

  3. [ ] ​添加文件到Keil组

    • 是否将以下文件添加到了Keil工程对应的组里?

    • STARTUP组:添加正确的启动文件(startup_stm32f10x_xx.s,根据芯片容量选ld/md/hd)。

    • CMSIS组:添加core_cm3.csystem_stm32f10x.c

    • FWLIB组:添加Libraries/STM32F10x_StdPeriph_Driver/src/下的所有.c文件。

    • USER组:添加你自己User/文件夹下的main.cstm32f10x_it.c等。

第四阶段:核心配置——“最关键的两步,90%的错误由此产生!”​
  1. [ ] ​头文件路径设置(重中之重!)​

    • 点击魔术棒 Option for Target-> C/C++选项卡。

    • 是否在 Include Paths中添加了以下三个路径?(路径指向的是文件夹,不是文件)

      • ../Libraries/CMSIS

      • ../Libraries/STM32F10x_StdPeriph_Driver/inc

      • ../User

    • 症状​:如果漏掉,编译会报错 fatal error: stm32f10x.h file not found

  2. [ ] ​预定义宏设置(同样重要!)​

    • 在同一个 C/C++选项卡的 Define输入框中,是否用英文逗号分隔,添加了以下两个宏?

      • USE_STDPERIPH_DRIVER启用固件库,没有它库函数无效)

      • STM32F10X_HD根据你的芯片容量选择HD为大容量,还有MD, LD, XL

    • 症状​:如果漏掉或写错,编译可能通过,但程序运行会异常或外设无法使用。

第五阶段:编译与调试——“收尾工作”​
  1. [ ] ​Target选项卡必选项

    • 是否勾选了 Use MicroLIB?​​(必须勾选,否则后续串口printf无法使用)​

  2. [ ] ​Output选项卡必选项

    • 是否勾选了 Create HEX File?​​(必须勾选,才能生成可下载到芯片的文件)​

  3. [ ] ​Debug仿真器配置

    • Debug选项卡中,是否选择了你的仿真器(如CMSIS-DAP)?

    • 点击 Settings,确认能否识别到设备,端口是否设置为SW,速率是否合理(如5MHz)。

    • Flash Download选项卡中,是否勾选了 Reset and Run?​​(建议勾选,下载后自动运行程序)​

  4. [ ] ​首次编译

    • 点击Build(小锤子)进行编译。

    • 目标​:出现 0 Error(s)。有少量警告(Warning)可以暂时忽略。

    • 如果报错​:90%的概率是第7步第8步没做对,请返回仔细检查!

  5. [ ] ​下载与调试

    • 点击Load(向下箭头)下载程序到芯片。

    • F12键尝试跳转到函数定义,测试调试功能是否正常。​

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐