stm32标准外设库使⽤详解
下载代码
stm32标准外设库是stm32全系列芯⽚的外设驱动,有了它可以⼤⼤加速我们开发stm32。
⾸先从st公司的⽹站下载最新的stm32标准外设库,写本⽂时最新的版本是V3.5.0。
解压该zip⽂件,得到如下⽂件夹和⽂件
STM32F10x_StdPeriph_Lib_V3.5.0\
_htmresc
Libraries
Project
Utilities
Release_Notes.html
stm32f10x_stdperiph_lib_um.chm
其中Libraries包含库的源代码,Project包含stm32各个外设的使⽤范例和⼀个⼯程模板,Utilities是使⽤st公司评估板的例⼦,stm32f10x_stdperiph_lib_um.chm教我们怎么⽤标准外设库。
⼯程⽬录结构
既然准备使⽤32位单⽚机,应该是个不⼩项⽬,因此⼯程⽬录也应该做个规划。这⾥我推荐⼀下我所使⽤的⽬录结构。假设⼯程名字叫template,建⼀个名为template的⽂件夹,该⽬录下有个3个固定⽂件夹doc,src,include,doc⽤来存放⼯程相关的资料⽂件,src放源代码,在src下每个功能模块⼀个⽂件夹,include放各个模块都要使⽤的公共头⽂件。output放编译输出⽂件,内含两个⼦⽂件夹obj和list。
template\
doc
src
include
output\obj
\list
整理库代码
由于Libraries下的CMSIS⽂件夹中很多代码是和编译器及芯⽚相关的,导致⽂件夹多且深度⼤,不利于⼯程维护,实际上⼀个项⽬往往是⽤固定的编译器和芯⽚,因此有必要对库进⾏整理。
在src下建⽴libstm32⽬录
1. 把Libraries\STM32F10x_StdPeriph_Driver\下的内容拷贝到libstm32⽬录下
2. 在libstm32⽬录下建⽴cmsis⽂件夹,把Libraries\CMSIS\CM3\CoreSupport\下的core_cm
3.c,core_cm3.h;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h拷贝到cmsis⽂件夹中。
3. 根据你所选的芯⽚类型将Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\下对应的启动⽂件拷贝到cmsis⽂件夹中。这⾥我拷贝的是startup_stm32f10x_hd.s(⼤容量型stm32芯⽚的启动⽂件)。
下⾯对该库⽂件做个简单介绍:
Libraries\STM32F10x_StdPeriph_Driver\下的内容很好理解就是stm32的各个外设模块驱动代码。
misc.h和misc.c是和CM3内核有关的NVIC和SysTick的驱动代码。
Libraries\CMSIS下是什么呢?cmsis英⽂全称:Cortex Microcontroller Software Interface Standard,是Cortex系列处理器硬件抽象层,可以理解为cortex内核的软件接⼝。
core_cm3.c, core_cm3.h
它们的⽬录名为CoreSupport,说明这两个⽂件是CM3内核⽀撑⽂件,其他使⽤CM3内核的芯⽚也可以⽤,不⼀定是
stm32。这两个⽂件⽤来获取设置CM3内核,配置⼀些内核寄存器。
stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport⽬录下,说明这⼏个⽂件是和具体的芯⽚有关的,也就是stm32芯⽚的⽀撑⽂件。其中stm32f10x.h是标准外设库的⼊⼝,使⽤标准外设库的代码中必须包含该头⽂件。system_stm32f10x.c, system_stm32f10x.h这两个⽂件提供函数⽤来初始化stm32芯⽚,配置PLL、系统时钟和内置flash接⼝。startup_stm32f10x_hd.s是⼤容量型stm32芯⽚的启动⽂件。
建⽴⼯程
使⽤keil MDK(我使⽤4.12版)在template⽬录下建⽴⼯程,⼯程名为template。选⼀个stm32系列的芯⽚,哪⼀个都⽆所谓(我选的是STM32F101RC,因为我的板⼦就是⽤这个芯⽚),接下来要注意的是当弹出是否拷贝启动代码到⼯程⽂件夹时要选No,因为标准外设库⾥已经有启动代码了。
将UV4中project window⾥的顶层⽬录名改为template,并将第⼀个group名改为libstm32。把libstm32⽬录下所有.c和.s⽂件加载到⼯程⾥的libstm32。
在src下建⽴⼀个init⽬录⽤来放置系统初始化代码。把Project\STM32F10x_StdPeriph_Template\下的stm32f10x_it.c拷贝到init⽂件夹中,stm32f10x_it.h,stm32f10x_conf.h拷贝到include⽂件夹中。
stm32f10x_it.c,stm32f10x_it.h是中断服务程序⽂件。stm32f10x_conf.h是标准外设库的配置⽂件,对于⼯程中不需要的外设,可以注释掉⾥⾯的包含的头⽂件。这⾥我建议先仅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,⽤到什么再打开什么,这样编译起来快⼀点,当然也可都留着。
使⽤stm32标准外设库
事实上,stm32标准外设库的使⽤在stm32f10x_stdperiph_lib_um.chm中的How to use the Library⼀节中已有说明,下⾯我把其中的步骤罗列⼀下:
1. 根据所选芯⽚,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的启动代码加
到⼯程中,这⼀步在上⾯已经做过了。
2. 在stm32f10x.h的66-73⾏,根据所选芯⽚类型,去掉相应注释,这⾥我去掉STM32F10X_HD⾏的注释(⼤容量型stm32芯⽚)。
system的头文件3. 去掉105⾏的USE_STDPERIPH_DRIVER注释,启⽤stm32标准外设库。
4. 在system_stm32f10x.c的110-115⾏,根据所选芯⽚主频,去掉相应注释,默认SYSCLK_FREQ_72MHz注释已去掉,如果你的芯⽚主频是72MHz,就不⽤做修改了,这⾥我的芯⽚是36MHz,注释SYSCLK_FREQ_72MHz,去掉
SYSCLK_FREQ_36MHz注释。
跑马灯程序
现在可以使⽤stm32标准外设库了,下⾯以⼀个简单的跑马灯程序说明。
在init⽬录下建⽴main.c作为系统⼊⼝。
在src下建⽴⼀个bsp⽬录⽤来放置板级⽀持代码,建⽴led.c,led.h。
代码如下:
led.h
led.c
根据不同的板⼦需要对该代码中的管脚进⾏修改,但结构是⼀样的。main.c
--完--