Keil5新建STM32F10xx固件库工程详解

Keil5新建STM32F10xx固件库工程详解

stm32资料繁多,建立工程模块也略有不同,同时HAL库和固件库的工程模板也有差别,虽然HAL库模块可以通过STM32CUBEMX快速建立,但是对于想深入学习STM32的初学者来说,还是自己动手一步步建立的好,本文除了会讲解如何建立STM32的固件库工程模板,还会说明建立过程中使用了哪些资料,供读者日后开发参考。

对于固件库的理解

STM32F103是ST公司出品的32为微控制器,基于Cotext-M3内核。像ST这样的公司并不会去设计芯片的内核架构,他们会给ARM公司一些专利费,根据ARM公司做好的Cotext-M3内核作为标准来设计自己的芯片。这样虽然大家都使用一个标准内核,但是自己设计自己的外设,存储,IO等等。ARM 公司为了能让不同的芯片公司生产Cortex-M3 芯片能在软件上基本兼容,和芯片生产商共同提出了一套标准 CMSIS 标准(Cortex Microcontroller Software Interface Standard) ,翻译过来是“ARM Cortex™ 微控制器软件接口标准”。
我们建立工程使用的标准库,就是ST公司根据自己外设所设计的一套函数库,使用这套函数库我们就可以通过函数来调用STM32F10微控制器的外设接口,做我们想做的事。这套函数库不仅包含调用外设的接口函数,而且包含根据上述的CMSIS编写的启动文件。至于固件库的具体目录结构和文件描述,可以参考《STM32开发指南–库函数版本》,如果想深入了解Cotext-M3内核可以参考《Cotext-M3权威指南(中文)》

建立固件库工程

建立工程所在文件夹

不同的资料介绍建立的STM32的固件库工程文件夹的目录结构略有不同,但大致都必须包含几个文件:keil工程文件,用户自己写的.c/.h文件,固件库的源码文件,固件库的核心文件和启动文件,已经编译过程文件和hex文件。
下面介绍一下笔者常用的工程文件目录。
在这里插入图片描述

core:存放启动文件和核心文件,启动文件在start_up中,核心文件位于固件库STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport中,文件 core_cm3.c和文件 core_cm3.h;
启动文件位于STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
OBJ:用于存放编译文件和hex文件
STM32F10x_StdPeriph_Lib_V3.5.0:存放固件库源码文件,位于STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver
user:用于存放工程文件,用户自己编写的代码以及stm32f10x.h等文件,分别位于:
STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h;
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template中的main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h;

将文件添加到工程中

建立工程时要注意将工程目录选到自己建立的文件夹中,其它就是很常规的操作不再赘述了。这里说一下把刚刚放到文件夹里的文件如何放到工程里面。
新建工程左侧的工程目录栏里面会有二级目录target,右键target选Manger project items,进入下面的界面
在这里插入图片描述
进入之后需要在Groups栏下建立如图文件夹,并且导入文件:
CORE:core_cm3.c,startup_stm32f10x_md.s,这里的hd.s需要根据芯片容量来确定,如果是大容量芯片,添加的是hd.s,小容量是ld.s
USER:main.c,stm32f10x_it.c,system_stm32f10x.c
FWLIB:STM32F10x_FWLib/src所有

工程配置及验证

上一步将需要到的文件添加到了工程中,这一步需要设置头文件目录,添加全局宏定义以及编译中间文件的存放位置。

设置头文件路径

在这里插入图片描述
点击此处,进入配置界面
在这里插入图片描述
include paths 处右侧的三个点来选择头文件所在目录,注意定位到最后一级子目录。

添加全局宏定义

在Define处添加“STM32F10X_MD,USE_STDPERIPH_DRIVER“
这里如果是大容量那么 STM32F10X_MD 修改为 STM32F10X_HD,小容量修改为 STM32F10X_LD.

设置编译文件存放位置

在这里插入图片描述

勾选如图,并且点击Select Folder for Objects选择存储位置。

编译验证

找的main.c文件用以下代码覆盖

#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIO
 GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高 
 while(1)
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_5);
 GPIO_SetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
Delay(3000000);
} 
	}

在这里插入图片描述
左上角编译,正常情况下"0 Error(s), 0 Warning(s)."工程建立完成

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值