STM32(5):番外篇之stm32固件库工程搭建

发布者:technology1最新更新时间:2024-12-17 来源: jianshu关键字:STM32  固件库  工程搭建 手机看文章 扫描二维码
随时随地手机看文章

创建工程目录文件

首先,创建好工程文件目录,比如task4_exit;

然后在里面创建一个proj目录,创建工程选择的文件夹就选择proj,这样创建Keil工程文件都是放在proj里面;

接着在task4_exit的根目录创建一个main.c(空文件即可);

最后在task4_exit的根目录放入如下固件库文件:

1)startup_stm32f10x_md.s,程序运行启动汇编文件;

2)stm32f10x.h,微控制器专用头文件;

3)stm32f10x_conf.h,固件库配置文件;

4)system_stm32f10x.c, system_stm32f10x.h,微控制专用的系统文件,其中SystemInit就是定义在这个源文件里面;

配置小魔方

file

配置targets

配置target,group以及files;target基本保持和工程名称一致即可;group里面添加两个,一个user,用于存放源文件,一个是lib用于存放stm32等固件库;

添加文件

然后在lib目录里面添加core以及STM32F10x_StdPeriph_Driversrc下面的.c的固件库源文件;


file


在user目录里面添加main.c,startup_stm32f10x_md.s以及system_stm32f10x.c三个源文件


file

关于target,groups以及files

在Keil里面,可以创建多个target;比如把LED点亮最一个target;后面按键中断作为一个target;target含义就是独立编译的单元;

然后可以在Keil的targets下拉框列表中选择需要编译/ 烧写的编译单元:

file

对于Groups,则是一个逻辑文件夹,因为并没有在磁盘上面真正的创建文件夹,这里逻辑文件夹只是按照意义进行文件分割而已。

Files则是添加物理磁盘上面的文件;

需要注意的是配置Targets/ Groups/ Files,都是逻辑层面的,并没有创建文件夹和文件,只是创建逻辑文件夹,引用已经存在的文件,这个配置过程其实是用来生成编译配置文件,即类似于make文件,这个编译配置文件里面定义好了都要编译那些文件。

配置小魔法棒

“Device”标签页

里面确认设备选择的是你自己要烧写的板子型号(这里是选择的是我的板子:STM32f103C8,STM32命名规则请见上次番外篇的介绍);


file

“Target”标签页

a. 确认ARM compile选择的version5(version6会有语法编译问题);

b. Use MicroLIB勾选上;MicroLib是一个微型的C库,提供了嵌入式常见的c的函数库,但是因为是对嵌入式函数的支持,所以相比于linux的gcclib很不完整;之所以需要勾选,是因为有的时候需要使用一些诸如在'stdio.h'来实现printf的时候,是需要c库支持的,这些底层c库的API接口以及实现stm32固件库是不提供的,注意stm提供是固件库,是直接操作(硬件)寄存器的,而c是操作系统层面的,属于软件层面的,所以有需要的时候勾选上;


file

“c/c++”标签页

file

添加宏USE_STDPERIPH_DRIVER

为什么需要整个宏呢?这里添加这个宏相当于是全局定义了:

#define USE_STDPERIPH_DRIVER

其实你在stm32f10x.h里面可以看到对于这个这个判断:

#ifdef USE_STDPERIPH_DRIVER
    #include 'stm32f10x_conf.h'#endif

只有定义了这个宏才会导入stm32f10x_conf.h;引入这个conf.h,就是为了引入外围设备操作,比如GPIO就是一个外围设备,只有导入stm32f10x_conf.h才能够操作外设;

如果不添加这个宏,在编译的时候将会长篇累牍的报告警,其实不仅仅是告警,在运行时还会报错,因为没有.h的引用,是无法调用到函数的:

warning: #223-D: function 'assert_param' declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx));


勾选'C99 Mode'

大大减小语法编译报错的概率;C99相比于默认的C89,不仅带来很多新特性,而且更加人性化,比如上一个小节中我们提到变量定义要在第一行可执行代码之前,否则编译报错:

int main(void){
        GPIO_InitTypeDef led;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        ... ...}

但是,如果勾选了C99,就没有这个限制了;

确认编译优化选项

Debug状态Level0,Level0在生成的二进制文件中,会添加很多调试相关信息,在调试的时候可以准确的走位,其他Level因为做了很多CPU指令级别优化,会导致(单步)调试过程中会出现不可预知的走位;
如果编译是为了最终部署的时候需要修改为Level3以减小编译文件大小,同时提高执行性能;

添加Include Path

include path就是添加包含有.h头文件的路径,这样在编译的时候.c文件,里面包含了#include,可以到定义的include path下面去找.h文件;需要添加三个路径分别是
a. 工程的根目录,下面有三个.h文件
b. core根目录,系统内核的头文件;
c. STM32F10x_StdPeriph_Driveinc,标准外设相关的头文件;

小贴士

.h文件是做什么的呢?就是用来做引用和实现分离的;为什么要分离?好处有两个:

  1. 调用方和实现方彼此独立,这样无论是调用方,还是是实现方有变化不需要再编译对方;比如调用方是在exe里面,调用方在编译到时候只要有头文件存在即可,而实现方是在也dll里面,彼此独立,无论是exe修改,还是dll修改,都不影响;

  2. 方便交叉编译,比如可以实现在windows上面编译Linux代码,只要配置了include路径,找到.h的定义,就可以完成编译;

这两点优点其实本质都是将调用的过程推迟到了运行时,编译的时候只要有头文件,有函数的声明信息即可(不需要函数定义信息),函数定义信息要求放在了运行的时候。

“Debug”标签页

选择使用指定的调试器,我的是ST-Link,所以下拉框选择“ST-Link Debuger”;


file

Utilities

取消勾选“User Debug Driver”,选择“ST-Link Debuger”:


file

点击“Setting”

Trace标签页

可以配置调试的时钟,注意,只是debug的时候才有效,烧写到板子之后,时钟走的是板子自己的时钟:


file

“Flash Download”标签页

勾选上“Reset And Run”,这样在烧写到STM32完成后,将会自动重启系统;


file

”Pack“标签页

里面确认取消勾选'Enable',如果勾选部分功能回合MicroLib冲突,将会导致一些功能异常,比如printf失效:


file


运行main

配置完成后,在main.c里面添加一个空的main函数,run一下;如果0waring,0 error就是OK咯。


关键字:STM32  固件库  工程搭建 引用地址:STM32(5):番外篇之stm32固件库工程搭建

上一篇:《嵌入式-STM32开发指南》第一部分 入门篇 -第6章 STM32下载程序及调试
下一篇:【STM32学习笔记1】Cortex-M3与STM32基本概念

推荐阅读最新更新时间:2026-03-25 14:06

搭建Keil5与STM32创建工程中所遇到的问题
问题1、如果你安装了Keil5,但是你找不到想要的STM32芯片,你该怎么办? 答:请到Keil官网下载的你想要的芯片的固件库,下载链接如下: http://www.keil.com/dd2/Pack/ 问题2、keil软件仿真时提示no ‘read’ permission没有读或写权限 答:在工程下新建一个debug.ini文件,在文件中写入 map 0x40000000,0x40070000 read write map 0x50000000,0x50070000 read write map 0xa0000000,0xa0070000 read write 然后keil中Debug选项卡中的initialliation
[单片机]
stm32固件库之LED(DISCO F407VG)
//引脚定义 /*******************************************************/ //R 红色灯 #define LED1_PIN GPIO_Pin_14 #define LED1_GPIO_PORT GPIOD #define LED1_GPIO_CLK RCC_AHB1Periph_GPIOD //G 绿色灯 #define LED2_PIN GPIO_Pin_12 #define LED2_GPIO_PORT GPIOD #defi
[单片机]
《嵌入式-STM32开发指南》第一部分 入门篇 - 第7章 STM32固件库与STM32Cube产品介绍
自STM32标准库出道以来,备受广大工程师和公司的喜爱,但是,从2013年开始,ST逐渐停止了对标准外设库的更新和维护。目前,ST全力推崇HAL库,STM32Cube就是与HAL库配合使用图形化编程官方IDE。 7.1 STM32库简介 到目前为止,ST有标准外设库(SPL 库)、HAL 库、LL 库 三种。前两者都是常用的库,后面的 LL 库是 ST 最近才添加,随 HAL 源码包一起提供,目前支持的芯片也偏少。各库如下所示: 图1 标准库、HAL 库、LL 库对比.png 其中,SPL 库 和 HAL 库两者相互独立,互不兼容。几种库的比较如下: 图2各个库对比.png 目前几种库对不同芯片的支持情况如下: 图
[单片机]
STM32固件库SYSTEM 文件夹介绍
SYSTEM 文件夹里面的代码,此文件夹里面的代码由 ALIENTEK 提供,包含了几乎每个实验都可能用到的延时函数,位带操作,串口打印代码等。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。分别包含了 delay.c、 sys.c、usart.c 及其头文件 delay.h,sys.h,usart.h。 delay 文件夹代码介绍 delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 3 个函数: void delay_init(u8 SYSCLK); //该函数用来初始化 2 个重要参数:fac_us 以及 fac_ms;同时把
[单片机]
STM32固件库SYSTEM文件夹介绍
SYSTEM 文件夹里面的代码,此文件夹里面的代码由 ALIENTEK 提供,包含了几乎每个实验都可能用到的延时函数,位带操作,串口打印代码等。SYSTEM 文件夹下包含了 delay、 sys、 usart 等三个文件夹。分别包含了 delay.c、 sys.c、usart.c 及其头文件 delay.h,sys.h,usart.h。 delay 文件夹代码介绍 delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,其中包含 3 个函数: void delay_init(u8 SYSCLK); //该函数用来初始化 2 个重要参数:fac_us 以及 fac_ms;同时把
[单片机]
浅谈STM32芯片行丝印含义,固件库命名规则及三大结构发展图示
STM32芯片上的5行丝印 1、ARM代表ARM内核,ARM后面跟着的是 X,代表芯片版本 内核是不变的 只是ST的版本 X是最终版本,就是以后这个型号就不会再升级了,有数字的代理以后还可以升级 2/3、第二行和第三行是型号 4、原厂出厂编号 5、MYS是马来西亚封装产地,641是代表2016年41周生产的 CHN是国内封装产地 STM32固件库命名规则 1、系统文件名和源文件名以‘ stm32f10x_’的形式表示。 2、在单一文件中使用的常量在该文件中定义。在多个文件中使用的常量定义在头文件中。所有常量都以大写字母表示。 3、寄存器当做常量看待,同样以大写字母表示,多数情况下,在STM3210X参考手册中使用相同的缩写
[单片机]
浅谈<font color='red'>STM32</font>芯片行丝印含义,<font color='red'>固件库</font>命名规则及三大结构发展图示
基于STM32调用固件库实现点灯
相信学过单片机的同学,对于调库这个操作都不陌生,大多数人都是从调别人的库阶段过来的。 今天看到一个评论说,如果只会调库,到了公司后会发现自己啥都不是。其实这话说的一点也不假,如果只会调库的话,你的单片机水平还停留在C语言阶段,并不能称为真正的单片机开发。 但我们要有这么一个概念:调库是自己编写的开始,如果上来就给你讲寄存器这些,我相信很多初学者都接收不了、理解不了这写寄存器到底在干啥。可是,如果从调别人库开始学习单片机,我们就会对单片机有个初始概念,对于后面的学习非常有帮助。 所以,今天我们就来看一下如何从调库工程师成为真正的开发工程师。 1. 什么是调库? 如果你通过机构的培训视频,比如野火的STM32单片机开
[单片机]
基于<font color='red'>STM32</font>调用<font color='red'>固件库</font>实现点灯
STM32固件库文件分析
1-汇编编写的启动文件 startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用C库函数_main最终去到C的世界 2-时钟配置文件 system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M。 3-外设相关的 stm32f10x.h:实现了内核之外的外设的寄存器映射 xxx:GPIO、USRAT、I2C、SPI、FSMC stm32f10x_xx.c:外设的驱动函数库文件 stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明 4-内核相关的 CMSIS - Cortex 微控制器软件接
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved