STM32建项目使用库官方库与修改库的方法
基于ST官方V3.5固件库的STM32新建工程心得

基于ST官方V3.5固件库的STM32新建工程心得之前笔记有寄存器版本的新建工程步骤,这里介绍下基于ST官方V3.5固件库的STM32新建工程,和寄存器新建工程类似,在其基础上添加库文件。
1、WINSOWS环境下新建工程文件夹test →inc 存放自己的库文件src 存放自己的.C文件out 存放自己的输出文件txt 存放技术文档Libraries 拷贝的官方库文件到自己的工程文件夹下将打包文件夹下system目录下的inc和src文件夹中的3个文件或复制inc 和src到test文件夹下2、打开keil,新建一个工程将工程保存到自己新建的工程文件夹test的根目录选择芯片型号在弹出的是否自动导入启动代码的选项卡中选择否3、点击manage project items图标进行工程组管理test →CMSIS (Cortex微控制器软件接口标准)放启动代码内核文件STD_DRIVER (驱动程序放封装好的函数)SYSTEMMAINSRC在CMSIS工程组下添加以下文件:Libraries/CMSIS/CM3/Core Support/core_cm3.cLibraries/CMSIS/CM3/Devicesupport/ST/STM32F10x/system_stm32f10x.cLibraries/CMSIS/CM3/Devicesupport/ST/STM32F10x/startu p/arm/startup_st m32f10x_hd.s(.s文件可能在目录下被过滤,选择查看.s文件才能找到)至此,管理组CMSIS目录下共有3个文件在STD_DRIVER工程组目录下添加以下文件:Libraries/STM32F10x_StdPeriph_Driver/所有.c文件(这里暂时全部添加,以后可以用到哪个添加哪个)工程组设置完毕,点击确定保存4、从标准库文件夹STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h 拷贝到新建工程文件夹test的inc文件夹下stm32f10x_it.c 拷贝到新建工程文件夹test的src文件夹下stm32f10x_it.h 拷贝到新建工程文件夹test的inc文件夹下5、点击Opetions for Target图标进行工程配置Device选项卡是芯片,新建工程时候已经选择Target选项卡晶振8.0MHzOutput选项卡Select Folder for Objects选择输出文件路径为创建文件夹test目录下的out,勾选Create HEX File,生成HEX烧写文件Listing选项卡Select Folder for Listing选择列表文件输出路径为test的outC/C++选项卡这里要添加两个宏:STM32F10X_HD,USE_STDPERIPH_DRIVER,指定芯片为大容量产品,使用ST官方的标准固件库Include Paths添加指定所有库文件路径,这里包含了Libraries文件夹下的标准库文件和test文件夹下自己定义的库文件有4个路径:test/inctest\Libraries\CMSIS\CM3\CoreSupporttest\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10xtest\Libraries\STM32F10x_StdPeriph_Driver\incDebug选项卡选择使用Jlink仿真调试Utilities选项卡去掉Use debug Driver选项前的勾选,然后选择Jlink在setting中选择FLASH,我们的芯片是大容量512K,可以选择勾选Reset and Run,烧写玩程序自动复位并运行。
MDK环境下利用STM32库V3.5创建工程并调试的方法

MDK环境下利用STM32库V3.5创建工程并调试的方法STM32标准外设库及说明1.解压STM32F10x_StdPeriph_Lib_V3.5.0库到硬盘(如F盘)2.库中自带的MDK模板示例1)位置2)工程组织结构3)详细结构3.库文件结构1)Chm中的目录树2)Windows资源管理器中的结构表:STM32F10x_StdPeriph_Lib_V3.5.0文件夹描述标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,是STM32F10x CPU资源的总括:CMSIS是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间;STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。
Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。
Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,很多驱动函数同样可以作为学习的重要参考。
CMSIS中内核设备访问层:(CM3/CoreSupport)core_cm3.h:CMSIS的Cortex-M3内核设备访问层头文件core_cm3.c:CMSIS的Cortex-M3内核设备访问层源文件微控制器外设访问层:(CM3/DeviceSupport/ST/STM32F10X)stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件system_stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件system_stm32f10x.c:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层源文件STM32F10xxx标准外设库体系结构文件功能说明在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库(StdPeriph_Lib):(1) 使用外设驱动:这时应用程序开发基于外设驱动的API(应用编程接口)。
STM32工程模板

你是问有官方固件库创建工程吧?我这里给你说说MDK的创建方法,如果你用的时IAR环境也差不多。
1.解压stm32f10x_stdperiph_lib.zip 可以从ST官方网站免费下载。
最新标准库版本为3.5.02.创建一个Demo文件夹2.1 新建子文件夹User,用于存放用户源程序2.2 新建子文件夹Project,用户KEIL工程文件2.3 在Project下依次创建Obj和List子文件夹,存放编译过程中产生的中间文件。
3. 复制源代码到Demo文件夹3.1 将stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.1.2Li braries文件整体复制到Demo文件夹下。
这就是ST的标准库,是以源代码形式提供的。
3.2 将库中的演示代码IOToggle中的文件复制到Demo\User文件夹.4. 新建一个Keil MDK工程4.1 启动Keil MDK,点击菜单New uVision Project,然后按向导进行操作4.2 选择CPU类型为STM32F103ZE (这是安富莱STM32开发板采用CPU类型)4.3 当提示是否复制启动代码时,请选择否。
(我们用最新的库中的启动代码,不用Keil软件自带的旧版本启动文件)4.4 根据自己的需要修改Target名字。
(名字任意)4.5 为了便于代码管理,在这个Project下创建几个Group (名字可以任意)User : 存放用户自己写的源代码RVMDK : 存放启动文件(汇编文件)StdPeriph_Driver : 存放ST标准库文件CMSIS : 存放CMSIS接口文件(这也是库的一部分)4.6 创建好Group后,我们开始依次添加文件。
5. 修改源代码。
我们将修改main.c 文件,换成我们自己跑马灯程序。
6. 配置工程, 点击“Options”按钮6.1 切换到Output。
选择Object文件夹。
stm32f103移植到GD32修改内容及注意事项

stm32f103移植到GD32修改内容及注意事项在国内芯片紧张的情况下,目前如果项目没有成型可以安装官方提供的GD32的pack,选择相关的pack即可正常编程。
若程序已经成型,需要移植,首先就要考虑芯片类型(stm32系列)的选择。
选择过程中首先要根据已用stm32单片机的封装和引脚定义去对应相关的gd32芯片类型。
这里我选用的是GD32f305芯片替换stm32f103rc,所作设置如下:1.点击魔术棒选择stm32f103芯片2.根据晶振设置晶振,这里设置72MHz3.根据芯片flash大小设置STM32F10X_LD、STM32F10X_MD、STM32F10X_HD,不知道的可以查手册,实在不行就一个一个去试。
4.Debug中设置,如果用的是jlink仿真器就选择jlink仿真器,其他的就选用其他的,这里选择SW方式。
另外注意:如果右边框读取不到单片机信息,或者下载不了程序可以把速度降低一些,设置10k或者5k基本可以解决!Device芯片选型C++内容设置Debug内容设置1.软件移植注意事项1.1系统方面的注意事项stm32移植到GD32上芯片选择上的问题:1.1.1 HSE相关内容修改在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x.h中(HSEStartUp_Ti meOut);修改前:#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) /*!< Time out for HSE start up */修改后:#define HSE_STARTUP_TIMEOUT ((uint16_t)0xFFFF) /*!< Time out for HSE start up */这里我使用的库是stm32f10x.h里面,位置如图所示。
修改原因:GD和STM32的晶振部分电路设计有一定的差异,两者对外部高速晶振的参数要求也不一样,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振正常起振。
arm-none-eabi-gcc,makefile,stm官方库构建stm32f4xx工程

arm-none-eabi-gcc,makefile,stm官⽅库构建stm32f4xx⼯程参考⽂章:准备⼯具:arm-none-eabi-gccstm32f4官⽅库vs code(看代码⽤)建⽴⼯程⽂件夹stlib/inc和stlib/src这两个⽂件夹是官⽅库⽂件夹⾥⾯的inc和src,分别对应.h和.cstlib/cminc⾥⾯是官⽅库⾥⾯的startup_stm32f40xx.S(后缀S要改成⼤写)是使⽤官⽅库⾥⾯TrueStudio的启动⽂件(注:不可以使⽤MDK的)stm32f4xx_conf.h, stm32f4xx.h, system_stm32f4xx.c, system_stm32f4xx.h这⼏个⽂件到官⽅库相应地⽅复制过来就好了。
STM32F407ZET6_FLASH.ld是从官⽅库的project/STM32F4xx_stdPeriph_Templates/TrueSTUDIO/STM32F40_41xxx/STM32F417IG_FLASH.ld改名⽽来的,后⾯还会修改该⽂件,使得可以⽤在407ZET6上根⽬录中的main.c,Makefile是⾃⼰创建的main。
c写⾃⼰的程序,Makefile⽤于编译⼯程stm32f4xx_it.c, stm32f4xx_it.h是从官⽅库中拿来负责写中断函数arm-none-eabi-gcc安装解压到任意⽂件夹,把arm-none-eabi-gcc⾥的bin⽂件夹添加到环境变量,注销然后在命令⾏中输⼊arm-none-eabi-gcc -v如果显⽰了版本就说明安装成功编写Makefile# 添加包含路径vpath %.S stlibvpath %.c stlib stlib/srcvpath %.h stlib stlib/cminc stlib/incDEFS += -DUSE_STDPERIPH_DRIVERINCS += -Istlib -Istlib/cminc -Istlib/inc# 使⽤其他外设在这⾥添加OBJS += main.oOBJS += stlib/startup_stm32f40xx.oOBJS += stlib/system_stm32f4xx.oOBJS += stlib/src/stm32f4xx_syscfg.o stlib/src/stm32f4xx_gpio.o# 使⽤了编译优化和硬件浮点数CFLAGS += -mcpu=cortex-m4 -mthumb -WallCFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16CFLAGS += -OsCFLAGS += -ffunction-sections -fdata-sectionsLFLAGS += -mcpu=cortex-m4 -mthumbLFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16LFLAGS += -Wl,--gc-sections# 最后⽣成的bin⽂件all:blink.binclean:@rm -f $(OBJS) $(OBJ_FLASH) $(OBJ_SRAM)@rm -f blink.bin blink.elf blinks.bin blinks.elfblink.bin:blink.elf@arm-none-eabi-objcopy -O binary -S $< $@blinks.bin:blinks.elf@arm-none-eabi-objcopy -O binary -S $< $@blink.elf:$(OBJS) $(OBJ_FLASH)@arm-none-eabi-gcc $(LFLAGS) $^ -Tstlib/STM32F407ZET6_FLASH.ld -o $@@arm-none-eabi-size $@burn:blink.bin@st-flash write $< 0x08000000%.o:%.S@echo cc: $<@arm-none-eabi-gcc $(CFLAGS) -c $< -o $@%.o:%.c@echo cc: $<@arm-none-eabi-gcc $(CFLAGS) $(DEFS) $(INCS) -c $< -o $@修改STM32F417IG_FLASH.ld⽂件该⽂件是定义了芯⽚内存中的代码的存放位置我们的芯⽚是stm32f407zet6,RAM是192k(128K SRAM , 64K CCMRAM),flash是512K 修改地⽅如下34⾏_estack = 0x20020000; /* end of RAM */43到46⾏MEMORY{FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128KCCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K}修改stlib/stm32f4xx.h70⾏去掉#define STM32F40_41xxx的注释186⾏添加#define __FPU_USED 1开启芯⽚的FPU(硬件浮点运算)编写main函数打开main.c#include "stm32f4xx.h"#include "stm32f4xx_syscfg.h"#include "stm32f4xx_gpio.h"int main(void){return 0;}最后make⼀下就可以⽣成.bin⽂件,然后就可以使⽤openocd烧写进芯⽚。
STM32 固件库的使用

2012-03-14 10:40iar for stm32 固件库的学习笔记系统、源程序文件和头文件命名都以“stm32f10x-”作为开头寄存器作为常量处理外设函数的命名以外设的缩写加下划线开头每个单词的开头字母大写每个函数名只有一个下划线分隔外设缩写和函数名的其他部分ppp_Init :::根据PPP_InitTypeDef中指定的参数,初始化外设PPP。
PPP_DeInit::::复位外设PPP的所有寄存器至缺省值PPP_StructInit :::其功能为通过设置PPP_InitTypeDef结构中的各种参数来定义外设的功能PPP_Cmd:::使能或失能外设PPPPPP_ITConfig:::为使能或者失能来自外设PPP某中断源PPP_DMAConfig:::失能或者使能外设PPP的DMA接口用以配置外设功能的函数总是以字符串“Config”结尾PPP_GetFlagStatus:::检查外设PPP某标志位被设置与否PPP_ClearFlag:::清楚外设PPP标志位PPP_GetITStatus:::判断来自外设PPP的中断发生与否PPP_ClearITPendingBit:::清除外设PPP中断待处理标志位typedef signed long s32;typedef signed short s16;typedef signed char s8;typedef signed long const sc32; /* Read Only */typedef signed short const sc16; /* Read Only */typedef signed char const sc8; /* Read Only */typedef volatile signed long vs32;typedef volatile signed short vs16;typedef volatile signed char vs8;typedef volatile signed long const vsc32; /* Read Only */ typedef volatile signed short const vsc16; /* Read Only */ typedef volatile signed char const vsc8; /* Read Only */ typedef unsigned long u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long const uc32; /* Read Only */typedef unsigned short const uc16; /* Read Only */typedef unsigned char const uc8; /* Read Only */typedef volatile unsigned long vu32;typedef volatile unsigned short vu16;typedef volatile unsigned char vu8;typedef volatile unsigned long const vuc32; /* Read Only */ typedef volatile unsigned short const vuc16; /* Read Only */ typedef volatile unsigned char const vuc8; /* Read Only */stm32f10x_type.h文件中布尔型变量typedef enum{FALSE = 0,TRUE = !FALSE} bool;标志位状态类型 SET & RESETtypedef enum{RESET = 0,SET = !RESET} FlagStatus;功能状态类型 ENABLE&DISABLEtypedef enum{DISABLE = 0,ENABLE = !DISABLE} FunctionalState;错误状态类型 SUCCESS or ERRORtypedef enum{ERROR = 0,SUCCESS = !ERROR} ErrorStatus;stm32f10x_map.h文件包含了所有外设控制寄存器的结构,下例为SPI寄存器结构的声明:/*------------------ Serial Peripheral Interface ----------------*/ typedef struct{vu16 CR1;u16 RESERVED0;vu16 CR2;u16 RESERVED1;vu16 SR;u16 RESERVED2;vu16 DR;u16 RESERVED3;vu16 CRCPR;u16 RESERVED4;vu16 RXCRCR;u16 RESERVED5;vu16 TXCRCR;u16 RESERVED6;} SPI_TypeDef;RESERVEDi(i为一个整数索引值)表示被保留区域stm32f10x_map.h函数包含了所有的外设声明,下例为spi外设的声明:#ifndef EXT#Define EXT extern#endif...#define PERIPH_BASE ((u32)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000).../* SPI2 Base Address definition*/#define SPI2_BASE (APB1PERIPH_BASE + 0x3800).../* SPI2 peripheral declaration*/#ifndef DEBUG...#ifdef _SPI2#define SPI2 ((SPI_TypeDef *) SPI2_BASE)#endif /*_SPI2 */...#else /* DEBUG */...#ifdef _SPI2EXT SPI_TypeDef *SPI2;#endif /*_SPI2 */...#endif /* DEBUG */如果用户希望使用外设SPI,那么必须在文件STM32f10x_conf.h中定义_SPI标签例如:#define _SPI#define _SPI1#define _SPI2每个外设都有若干寄存器专门分配给标志位。
STM32固件库使用手册_v3.5版本

Keil 下配置stm32库开发环境

Keil MDK下配置stm32库开发环境(包括J-Link调试环境设置)准备:1.stm32官方固件库2.Keil MDK一、建立stm32工程当出现提示是否要添加启动文件时,选择否(因为在官方固件库中包含有启动文件)工程建立完成!二、添加官方固件库右键工程目录,选择Manage Components..第一栏表示工程名称,第二栏表示工程包含的文件夹,第三栏表示各个文件夹中包含的文件通过Add Files将固件库中的文件添加进工程中,添加过后如下这么整理是为了让工程开起来层次清晰,对于工程编译没有影响,也就是说即使工程里文件不是按照目录这么整理的,也可以正常编译,只是习惯上如此整理。
三、工程设置右键工程,选择Options for Target…需要设置的有C/C++标签页中的Include Paths,如下:点击最右边的三个点按钮,这里设置的意思是把整个工程中所有.h文件所在的目录添加进来,只有这样,编译器在编译程序时才会从这些路径中寻找头文件。
点击这个方框按钮,添加目录,本例中将./sys ./inc ./src ./usr都添加进来四、J-Link调试器在keil中的设置接着第三步,在Debug标签中选择J-Link调试器选择完成后,点击右侧Setting按钮,如下:提示:必须正确连接J-Link后才会显示这样选择Flash Downlade标签页,点击Add按钮,将对应CPU型号的flash点击ok在Utilities标签页中,选择J-Link后点击ok即完成所有工程设置在main.c中写入main函数后编译未提示错误可以直接使用下图中红色标记按钮直接下载程序,不用再打开J-Flash下载程序了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.正点串口配置、下载程序 最近要搞STM32串口,向同学借来一块正点的开发板。正点原子的开发板就是独树一帜,一根usb线连在usb转串口接口,板子供电与下载程序都可以搞定! 简洁地记一下:总共要设置四个短冒,TXD连PA10、RXD连PA9、BOOT0即(B0)连3.3v、 B1连GND 程序下载使用 mcuisp,设置如下界面:下载程序后即可自动执行;
下载不完全手册中的程序下载示例test后,用串口助手可观察到如下: 至此,串口下载软、硬件配置完成。之前由于有虚拟串口的干扰,系统出现了蓝屏,卸载后正常! 2.正点原子根据STM32提供的库自己修改成了“正点原子库”,MDK软件中包含有一个默认的STM32官方库,怎么指定或确认使用的是哪个版本的库呢? 在如下窗口设置,下面为能够正确编译后的正点原子的一个项目的配置截图,为什么在Preprocessor Symbols中没有指定什么,还能够编译通过呢!因为正点并没有直接用STM32 的官方库,而只是挪用了其中的一部分头文件而已,由于在Include pathes中指定了这些用到的头文件的位置,所以编译器会优先选择所指定的文件进行编译,而不会使用软件默认的库文件(头文件),同理,使用其他非软件默认的官方库操作一样,只不过由于库文件是面向STM32全系列的,因此,要做下面图2的设置。 另附一个比较完整得体的使用标准库的操作说明: 转自:http://www.cnblogs.com/emouse/archive/2012/03/01/2375146.html
通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工程模板。本节就介绍怎样利用Keil MDK开发环境和标准外设库来搭建自己的工程。 建立一个基于标准外设库其实并不复杂,网络上也有很多关于怎样在Keil MDK下建立工程的教程,方法也各异,本节所介绍的方法本着少改动、便于使用、方便更换器件等原则,给大家介绍怎样在Keil中创建一个工程,并以一个最简单的例子来说明怎样下载和调试程序。
1.1.1 开发工具与开发环境
1. 软件版本 本节所使用Keil MDK 为目前的最新版V4.21,具体版本信息如图 5-6所示。其他版本差别不大,读者可以根据自己使用的版本进行操作或者从Keil的官网下载新版本。使用的标准外设库为目前最新的V3.5版本。使用的开发调试工具为JLINK-V8,使用的驱动版本为V4.08l。
图5-6 MDK详细版本信息 2. 建立工程目录 首先先建立一个用于存放工程的文件夹,此处命名为STM32,在文件夹下分别建立LIB、USER、MDK三个文件夹,分别用于存放标准外设库文件、用户程序文件、工程目录。在MDK文件夹下建立List、Obj两个文件夹,分别用于存放在编译过程中产生的临时文件和输出文件。 接下来拷贝标准外设库和相应的文件到工程目录中,首先拷贝STM32F10x_StdPeriph_Lib_V3.5.0\Libraries文件夹下的两个文件夹CMSIS和STM32F10x_StdPeriph_Driver到刚刚新建的STM32\LIB目录下,接下来拷贝用户编写程序的程序文件,此文件可以从标准外设库自带的例程中拷贝,这里从STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA目录下拷贝main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四个文件,这四个文件是在编程的时候用户往往需要根据实际需求进行修改的。因此拷贝至STM32\USER目录下,system_stm32f10x.c文件定义了系统时钟等参数并完成微控制器的初始化,标准外设库中已经有了,这里可以不拷贝。这样所需要的文件都已经具备了,如图 5-7所示。
图5-7工程目录文件夹结构 1.1.2 MDK的操作与设置
1. 新建工程 首先启动Keil uVision4,点击菜单栏Project-New uVision Project,选择工程的保存位置,保存位置选择在之前建立的MDK文件夹下,如图 5-8所示。
图5-8保存路径的选择 在弹出的界面中选择所使用的芯片信号,笔者使用的芯片型号为STM32F103ZET6,所以选择STM32F103ZE,如图 5-9所示。
图5-9选择芯片型号 芯片选择完成后软件会弹出一条提示,提示是否要拷贝STM32大容量启动代码并添加到工程,由于我们使用新版本标准外设库中提供的启动代码,因此此处选择否。如图 5-10所示。
图5-10拷贝启动代码选择 接下来就出现了一个空的工程窗口,建立了一个新的工程。 2. 添加程序文件 在左侧Project一栏中对Target 1两次点击之后可以重命名,这里命名为STM32,然后右击,如所示,单击Manage Comoonents。出现如所图 5-11示界面。 图5-11选择 Manage Comoonents 在这个界面里可以更为方便的添加工程的相关文件。也可以在对应的Group上右键Add Group和Add Files to Group只是这种方式更方便集中的添加和管理。按照图 5-12所示,建立四个Group,点击Groups一栏右上角图标,依次新建USER、CMSIS、LIB、StartUp四个组,点击对应的组在点击右下方Add Files添加相应的文件到对应的组中。USER组中添加USER文件夹下的文件,CMSIS组中添加STM32 PJ\STM32\LIB\CMSIS\CM3\CoreSupport文件夹下core_cm3.c文件和STM32\LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹下system_stm32f10x.c文件。在LIB组下添加STM32\LIB\STM32F10x_StdPeriph_Driver\src下的所有文件,这个组的文件也可以根据后面的程序功能添加对应的功能文件。StartUp组下添加STM32\LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm文件夹下startup_stm32f10x_hd.s文件,此文件根据芯片的所属类型来选择,STM32F103ZE为大容量器件所以选择hd结尾的启动文件。至此,已经将对应的文件全部加入工程中。
图5-12编辑组并添加对应文件 文件添加完成后的工程管理窗口如图 5-13所示。其中CMSIS和LIB组中的文件图标上由个钥匙图案,表示该文件当前为只读属性,工程编译完成后前面会出现一个加号,点击展开可以显示当前文件所调用的文件。 图5-13工程管理文件列表 3. 参数设置 接下来需要对工程进行一些参数设置,在中STM32上右击,选择第一项Options for Target ‘STM32’,如图 5-14所示。
图5-14选择进行参数设置 弹出窗口如图 5-15所示。在这个窗口中共有10个选项卡,第一个选项卡Device用于选择使用的器件,由于在新建工程的时候已经选择这里可以不用在选择,当前的工程如果在后期要更换使用的芯片时可以在这个选项卡中更换芯片,同时还要注意更换对应的启动文件。在Target选项卡中,一般只需要填上使用的晶振频率即可,其他都可以保持默认。 图5-15 Target选项设置 在如图 5-16所示Output选项卡中主要注意两项,一是选择输出文件夹,选择之前工程目录中MDK文件夹下的Obj文件夹,在下面还有一个Create HEX File选项,用于选择是否生成hex文件,如果编译好的程序要写片,或者要提供给别人下载到芯片中而不希望别人知道源码时可以提供HEX文件。
图5-16 Output选项设置 在Listing选项卡下同样可以选择Listing对应的文件夹,这里选择STM32\MDK\List文件夹,下方的复选框可以选择需要生成的调试信息,这里保持默认即可,如图 5-17所示。 图5-17 Listing 选项设置 C/C++选项卡中的设置比较重要,如图 5-18所示,选项卡中主要有两个地方需要注意,首先是整个工程的宏定义,在前面标准外设库部分已经有过介绍,标准外设库中很多功能都是通过宏定义来实现的,由于标准外设库针对STM32一系列芯片,因此需要通过宏定义来进行针对性的选择。这种选择有两种方式,有的人是直接改动宏定义部分的库文件,缺点是需要更改一些功能时不是很方便,而且笔者建议在尽量不更改库文件的方式下实现功能的配置和使用,另一种方式就是在工程的设置中添加宏定义,这儿添加了两个宏定义,USE_STDPERIPH_DRIVER表示使用标准外设库进行程序开发, STM32F10X_HD表示使用的是STM32F10X系列大容量器件,本例中中使用的是STM32F103ZET6故填写此项。 需要说明的是在程序开发过程中不光库文件可以通过宏定义的方式进行程序功能配置,用户程序也可以仿照库文件的这种形式,通过相关的宏定义进行一些参数配置。STM32的标准外设库在程序组织性、层次性、规范性等方面都值得我们去学习的。在“Target”的选项卡中进行的宏定义是这对当前“Target”有效的,在每一个“Group”同样可以设置作用于Group的宏定义。 Language/Code Generation 一栏中主要是针对程序语言所所的一些优化和配置,默认情况下保持默认即可。