按关键词阅读: 讲解 STM32 固件库 知识 详解
1、STM3 2 固 件 库 详 解STM32固件库详解http:/www.c l1.1基于标准外设库的软件开发1.1.1 STM32 标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库 , 是一个固件函数 包 , 它由程序、数据结构和宏组成 , 包括了微控制器所有外设的性能特征 。
该函数 库还包括每一个外设的驱动描述和应用实例 , 为开发者访问底层硬件提供了一个中 间API , 通过使用固件函数库 , 无需深入掌握底层硬件细节 , 开发者就可以轻松应 用每一个外设 。
因此 , 使用固态函数库可以大大减少用户的程序编写时间 , 进而降 低开发成本 。
每个外设驱动都由一组函数组成 , 这组函数覆盖了该外设所有功能 。
每个器件的 。
2、开发都由一个通用 API (applicatio n programmi ng in terface应用编程界面)驱动 , API对该驱动程序的结构 , 函数和参数名称都进行了标准化 。
ST公司2007年10月发布了 V1.0版本的固件库 , MDK ARM3.22 之前的版本均支持该库 。
2008年6月发布了 V2.0版的固件库 , 从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库 。
V3.0以后的版本相对之前的版本 改动较大 , 本书使用目前较新的 V3.4版本 。
1.1.2使用标准外设库开发的优势简单的说 , 使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解GPIO到定底层硬 。
3、件细节就可以灵活规范的使用每一个外设 。
标准外设库覆盖了从时器 , 再到CAN、I2C、SPI、UART和ADC等等的所有标准外设 。
对应的C源代码只是用了最基本的 C编程的知识 , 所有代码经过严格测试 , 易于理解和使用 , 并且配有完整的文档 , 非常方便进行二次开发和应用 。
1.1.3 STM32F10XXX标准外设库结构与文件描述1.标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势 , 因此对标准外设库的熟悉程度直接影响到程序的编写 , 下面让我们来认识一下STM32F10XXX的标准外设库 。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本 , 开发环境中自带的标准外设库 。
4、为2.0.3版本 , 本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构 。
可以从ST的官方网站下载到各种版本的标准外设库 , 首先看一下3.4版本标准外设库的文件结构 , 如图5-3所示 。
3.0以上版本的文件结构大致相同 , 每个版本可 能略有调整 。
L STM32F 10x_tdPe6ph,U bVKO_Hmmc, Libraries.Gtb CMSI5G . CM)CpOflB h $T& 丄 STM32Fl(h-, f ftu parm9.STM32iDC.EVAL,STM321OEJVAL.$TM3210_VAL_r.耕站处站饶Eir才寻客图5-3 STM32F10XXX V3.4标准外设 。
5、库文件结构表5-4中介绍了每个文件夹所包含的主要内容 。
表5-4 STM32F10XXX V3.4 标准外设库文件夹描述STM32F10x_StdPeriph_Lib_V3.4.0 _htmresc本文件夹包含了所有的html页面资源LibrariesCMSIS见表5-6STM32F10x_StdPeriph_Driverinc标准外设库驱动头文件src标准外设库驱动源文件ProjectExamples标准外设库驱动的完整例 程TemplateMDK-ARMKEIL RVMDK的项目模板示例RIDERais onanceRIDE的项目模板示例EWARMIAR EWARM 的项目模板示例Utili 。
6、tiesSTM3210-EVAL本文件夹包含了用于STM3210B-EVAL 禾口STM3210E-EVAL 评估板的专用驱动标准外设库的第一部分是 CMSIS 禾口 STM32F10x_StdPeriph_Driver , CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层 , 为芯片厂商和中间件供应商提 供了简单的处理器软件接口 , 简化了软件复用工作 , 降低了 Cortex-M 上操作系统 的移植难度 , 并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间 。
STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数 , 这些驱动函数均使用 C语言 。
7、编写 , 并提供了统一的易于调用的函数接口 , 供 开发者使用 。
Project文件夹中则包括了 ST官方的所有例程和基于不同编译器的项目模板 , 这些例程是学习和使用STM32的重要参考 。
Utilities包含了相关评估板的示例程序和驱动函数 , 供使用官方评估板的开发者使用 , 很多驱动函数同样可 以作为学习的重要参考 。
STM32F10xxx标准外设库体系结构如图5-4所示 。
图中很好的展示了各层以及具体文件之间的联系 , 各文件的具体功能说明如表5-5所示 。
图5-4 STM32F10xxx 标准外设库体系结构表5-5文件功能说明文件名功能描述具体功能说明core_cm3.hcore_cm3.cCortex-M3 内 。
8、核及其设备文件访问Cortex-M3 内核及其设备:NVIC , SysTick 等访问Cortex-M3 的CPU寄存器和内核外设的函数stm32f10x.h微控制器专用头 文件这个文件包含了 STM32F10X全系列 所有外设寄存器的定义(寄存器的基 地址和布局)、位定义、中断向量表、存储空间的地址映射等system_stm32f10x.hsystem_stm32f10x.c微控制器专用系统文件函数SystemInit , 用来初始化微控制 器函数Sysem_ExtMemCtl, 用来配置 外部存储器控制器 。
它位于文件 startup_stm32f10x_xx.s /.c, 在跳转 到main前调 。
9、用SystemFrequ ncy, 该值代表系统时钟 频率startup_stm32f10x_Xd.s编译器启动代码微控制器专用的中断处理程序列表(与 头文件一致)弱定义(Weak)的中断处理程序默认函 数(可以被用户代码覆盖)该文件是与 编译器相关的stm32f10x_co nf.h固件库配置文件通过更改包含的外设头文件来选择固 件库所使用的外设 , 在新建程序和进 行功能变更之前应当首先修改对应的 配置 。
stm32f10x_it.hstm32f10x_it.c外设中断函数文件用户可以相应的加入自己的中断程序 的代码 , 对于指向同一个中断向量的 多个不同中断请求 , 用户可以通过判 断外设的中断标志位 。
10、来确定准确的中 断源 , 执行相应的中断服务函数 。
stm32f10x_ppp.hstm32f10x_ppp.c外设驱动函数文件包括了相关外设的初始化配置和部分 功能应用函数 , 这部分是进行编程功 能实现的重要组成部分 。
Applicati on.c用户文件用户程序文件 , 通过标准外设库提供的接口进行相应的外设配置和功能设 计 。
2.基于CMSIS标准的软件架构根据调查研究 , 软件开发已经被嵌入式行业公认为最主要的开发成本 。
对于ARM公司来说 , 一个ARM内核往往会授权给多个厂家 , 生产种类繁多的产品 , 如果没 有一个通用的软件接口标准 , 那么当开发者在使用不同厂家的芯片时将极大的增加了软件开发成本 , 因此 ,ARM。
11、与 Atmel、IAR、Keil、hami-nary Micro 、 Micrium、NXP、SEGGER和ST等诸多芯片和软件厂商合作 , 将所有Cortex芯片厂商产品的软件接口标准化 , 制定了CMSIS标准 。
此举意在降低软件开发成本 , 尤其针对新设备项目开发 , 或者将已有软件移植到其他芯片厂商提供的基于Cortex处理器的微控制器的情况 。
有了该标准 , 芯片厂商就能够将他们的资源专 注于产品外设特性的差异化 , 并且消除对微控制器进行编程时需要维持的不同的、 互相不兼容的标准的需求 , 从而达到降低开发成本的目的 。
如图5-5所示 , 基于CMSIS标准的软件架构主要分为以下 4层:用户应用层、操 作系统及中间件接 。
12、口层、CMSIS层、硬件寄存器层 。
其中 CMSIS层起着承上启下 的作用:一方面该层对硬件寄存器层进行统一实现 , 屏蔽了不同厂商对Cortex-M系列微处理器核内外设寄存器的不同定义;另一方面又向上层的操作系统及中间件 接口层和应用层提供接口 , 简化了应用程序开发难度 , 使开发人员能够在完全透明的情况下进行应用程序开发 。
也正是如此 , CMSIS层的实现相对复杂 。
用户应用堆f?器件舉外设因対CMS1SXZMCU直他外设调i曲購 接口寥W内榕 定时as外设寄存器柏中却向量走义层zNVIC嵌奁向童中斟控制器VZ图5-5 CMSIS标准的软件架构层主要分为以下3个部分:(1)核内外设访问层(CPAL, Cor 。
13、e Peripheral Access Layer ):该层由 ARM 负责实现 。
包括对寄存器名称、地址的定义 , 对核寄存器、NVIC、调试子系统的访问接口定义以及对特殊用途寄存器的访问接口(例如:CONTROL , xPSR)定义 。
由于对特殊寄存器的访问以内联方式定义 , 所以针对不同的编译器ARM统一用来屏蔽差异 。
该层定义的接口函数均是可重入的 。
片上外设访问层(DPAL, Device Peripheral Access Layer ):该层由芯片厂 商负责实现 。
该层的实现与 CPAL类似 , 负责对硬件寄存器地址以及外设访问接口 进行定义 。
该层可调用 CPAL层提供的接口函数同时根据设备特性对异常向 。
14、量表进行扩展 , 以处理相应外设的中断请求 。
外设访问函数(AFP, Access Functions for Peripherals):该层也由芯片厂商负责实现 , 主要是提供访问片上外设的访问函数 , 这一部分是可选的 。
对一个Cortex-M微控制系统而言 , CMSIS通过以上三个部分实现了:l定义了访问外设寄存器和异常向量的通用方法;l定义了核内外设的寄存器名称和核异常向量的名称;l为RTOS核定义了与设备独立的接口 , 包括Debug通道 。
这样芯片厂商就能专注于对其产品的外设特性进行差异化 , 并且消除他们对微控制 器进行编程时需要维持的不同的、互相不兼容的标准需求 , 以达到低成本开发的目的 。
CMSIS中的 。
15、具体文件结构如表5-6所示 。
表5-6 CMSIS文件夹结构CMSISCoreDocume ntati onCMSIS文档CM3StartuparmMDKARM编译器启动文件startup_stm32f10x_hd.s:大容量产品启动文件startup_stm32f10x_md.s:中容量产品启动文件startup_stm32f10x_ld.s:小容量产品启动文件gcc_ride7GCC编译器启动文件iarIAR编译器启动文件TrueSTUDIOTrueSTUDIO编译器启动文件本文件夹包含STMFIOxxx CMSIS 文 件:微控制器外设访问 层和内核设备访问层:core_cm3.h : C 。
16、MSIS的Cortex-M3 内核设备访问层头文件core_cm3.c : CMSIS的Cortex-M3 内核设备访问层源文件stm32f10x.h : CMSIS 的 Cortex-M3STM32f10xxx 微控制器 外设访问层头文件system_stm32f10x.hCMSIS 的 Cortex-M3 STM32f10xxx 微控制器 外设访问层头文件system_stm32f10x.cCMSIS 的 Cortex-M3 STM32f10xxx 微控制器 外设访问层源文件在实际开发过程中 , 根据应用程序的需要 , 可以采取2种方法使用标准外设库 (StdPeriph_Lib)(1) 使用外设 。
17、驱动:这时应用程序开发基于外设驱动的API(应用编程接口) 。
用户只需要配置文件” stm32f10x_co nf.h ” , 并使用相应的文件”stm32f10x_ppp.h/.c ” 即可 。
(2) 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件 。
这两种方法的优缺点在“使用标准外设库开发的优势”小节中已经有了具体的介绍 , 这里仍要说明的是 , 使用使用标准外设库进行开发可以极大的减小软件开发的 工作量 , 也是目前嵌入式系统开发的一个趋势 。
标准外设库(StdPeriph_Lib)支持STM32F10xxx系列全部成员:大容量 , 中容量和小容量产品 。
从表5-6中也可以看出 , 启动文件已经对不同的 。
18、系列进行了划分 , 实际开发中根据使用的 STM32产品具体型号 , 用户可以通过文件”stm32f10x.h ”中的预处理define或者通过开发环境中的全局设置来配置标准外设库(StdPeriph_Lib) , 一个define对应一个产品系列 。
下面列出支持的产品系列STM32F10x_LD : STM32 小容量产品STM32F10x_MD : STM32 中容量产品STM32F10x_HD : STM32 大容量产品在库文件中这些define的具体作用范围是:l文件“ stm3210f.h ”中的中断IRQ定义l启动文件中的向量表 , 小容量 , 中容量 , 大容量产品各有一个启动文件I外设存储器映像和寄存器 。
19、物理地址l产品设置:外部晶振(HSE)的值等I系统配置函数因此通过宏定义这种方式 , 可以使标准外设库适用于不同系列的产品 , 同时也方便 与不同产品之间的软件移植 , 极大的方便了软件的开发 。
1.1.4 STM32F10XXX标准外设库的使用标准外设库中包含了众多的变量定义和功能函数 , 如果不能了解他们的命名规范和 使用规律将会给编程带来很大的麻烦 , 本节将主要叙述标准外设库中的相关规范 ,通过这些规范的学习可以更加灵活的使用固件库 , 同时也将极大增强程序的规范性 和易读性 , 同时标准外设库中的这种规范也值得我们在进行其他相关的开发时使用 和借鉴 。
1.缩写定义标准外设库中的主要外设均采用了缩写的形式 , 通过这些缩 。
20、写可以很容易的辨认对 应的外设 。
缩写外设/单元ADC模数转换器BKP备份寄存器CAN控制器局域网模块CECCRCCRC计算单元DAC数模转换器DBGMCU调试支持DMA直接内存存取控制器EXTI外部中断事件控制器FLASH闪存存储器FSMC灵活的静态存储器控制器GPIO通用输入输出I2CI2C 接口IWDG独立看门狗PWR电源/功耗控制RCC复位与时钟控制器RTC实时时钟SDIOSDIO 接口SPI串行外设接口TIM定时器USART通用同步/异步收发器WWDG窗口看门狗2.命名规则标准外设库遵从以下命名规则 PPP表示任一外设缩写 , 例如:ADC 。
源程序文件 和头文件命名都以“ stm32f10 。
21、x_ ”作为开头 , 例如:stm32f10x_conf.h 。
常量仅 被应用于一个文件的 , 定义于该文件中;被应用于多个文件的 , 在对应头文件中定 义 。
所有常量都由英文字母大写书写 。
寄存器作为常量处理 。
他们的命名都由英文 字母大写书写 。
在大多数情况下 , 他们采用与缩写规范一致 。
外设函数的命名以该 外设的缩写加下划线为开头 。
每个单词的第一个字母都由英文字母大写书写 , 例 如:SPI_SendData 。
在函数名中 , 只允许存在一个下划线 , 用以分隔外设缩写和 函数名的其它部分 。
对于函数命名 , 总的来说有以下规则:l名为PPP_Init的函数 , 其功能是根据 PPP_InitTypeDef中指定的参数 , 初始化 外设PP 。
22、P , 例如TIMnit.l名为PPP_DeInit的函数 , 其功能为复位外设 PPP的所有寄存器至缺省值 , 例如TIM_DeI nit.l名为PPP_Init的函数 , 其功能为通过设置 PPP_InitTypeDef结构中的各种参数 来定义外设的功能 , 例如:USARTnit .l名为PPP_Cmd的函数 , 其功能为使能或者失能外设PPP , 例如:SPI_Cmd.l名为PPP_ITConfig的函数 , 其功能为使能或者失能来自外设PPP某中断源 , 例如:RCC_ITC onfig.l名为PPP_DMAConfig 的函数 , 其功能为使能或者失能外设PPP的DMA接口 , 例如:TIM1_DMAC onfig.l用以配 。
23、置外设功能的函数 , 总是以字符串“Con fig ”结尾 , 例如GPIO_Pi nRemapCo nfig.l名为PPP_GetFlagStatus的函数 , 其功能为检查外设 PPP某标志位被设置与否 , 例如:l2C_GetFlagStatus.l名为PPP_ClearFlag的函数 , 其功能为清除外设 PPP标志位 , 例如:l2C_ClearFlag.l名为PPP_GetlTStatus的函数 , 其功能为判断来自外设 PPP的中断发生与否 ,例如:l2C_GetlTStatus.l名为PPP_ClearITPendingBit 的函数 , 其功能为清除外设 PPP中断待处理标志 位 , 例如:I2C_ClearI 。
24、TPe ndi ngBit.这样的命名方式非常便于程序的编写和阅读 , 以标准外设库中的示例函数为例 , 下面摘录了 STM32F10x_StdPeriph_ExamplesADC3ADCs_DMAmian.c中的一段程序 。
1 DMA_I ni tType Def DMA_I nitStructure;
22 /* DMA1 channel1 configuration*/43 DMA_DeI ni t(DMA1_Cha nn el1);
64 DMA_I ni tStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
85 DMAni tStructure. 。
25、DMA_MemoryBaseAddr =(ui nt32_t )&ADCICo nvertedValue;
106 DMA_I ni tStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
127 DMA_I ni tStructure.DMA_BufferSize =1;
148 DMA_I ni tStructure.DMA_Peripherall nc = DMA_PeripheralI nc_Disable;
169 DMA_I ni tStructure.DMA_Memoryl nc = DMA_MemoryI nc_Disable;
1810 DMA_I ni 。
26、 tStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
2011 DMA_I ni tStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
2212 DMA_I ni tStructure.DMA_Mode = DMA_Mode_Circular;
2413 DMA_I ni tStructure.DMA_Priority = DMA_Priority_High;
2614 DMA_I ni tStructure.DMA_M2M = DMA_M2M_Di 。
27、sable;
2815 DMA_I nit(DMA1_Cha nn el1, & DMA_I ni tStructure);
3016 /* En able DMA1 cha nn el1 */3217 DMA_Cmd(DMA1_Cha nn el1, ENABLE);
这段程序完成了 DMA1通道的配置 , 首先定义了 DMA_I ni tTypeDMA_InitStructure , 接着配置DMA_InitType的各种参数 , 各参数的命名方式也均使用约定的命名方式 , 从命名就能够很容易的看出各参数所指代的具体功能 。
功能参数配置完成后 , 使用 DMA_I nit(DMA1_Cha nn el1, & DMA 。
28、_I nitStructure);
完成相应外设的初始化 , 最后使用DMA_Cmd(DMA1_Cha nn el1, ENABLE)使能相应外设 。
从这个例子就能够很容易的看出标准外设库这种规范化的命名规则给编写 和阅读程序带来的好处 。
3.变量定义在早期的版本中有24个变量定义 , 在Keil的安装根目录下 , 可以找到对应的定义 , 路径为:KeilARMINCSTSTM32F10xstm32f10x_type.h1 /* In cludes*/23 /* Exported types*/45 typedef signedlong s32;
67 typedef signed8short s16;
o9 type 。
29、def signedchar s8;
1011 typedef sig nedlong const sc32;
/* Read Only */1213 typedef sig nedshort const sc16;
/* Read Only */1415 typedef sig nedchar const sc8;
/* Read Only */1617 typedef volatilesigned long vs32;
1819 typedef volatilesigned short vs16;
2021 typedef volatilesig ned char vs8;
2223 typedef 。
30、 volatilesigned long const vsc32;
/* Read Only */2425 typedef volatilesigned short const vsc16;
/* Read Only */2627 typedef volatilesigned char const vsc8;
/* Read Only */2829 typedef un sig nedlong u32;
3031 typedef un sig nedshort u16;
3233 typedef un sig nedchar u8;
3435 typedef un sig nedlong const 。
31、 uc32;
/* Read Only */3637 typedef un sig nedshort const uc16;
/* Read Only */3839 typedef un sig nedchar const uc8;
/* Read Only */4041 typedef volatileunsigned long vu32;
4243 typedef volatileunsigned short vu16;
4445 typedef volatileun sig ned char vu8;
4647 typedef volatileunsigned long const vuc32 。
32、;
/* Read Only */4849 typedef volatileunsigned short const vuc16;
/* Read Only */5051 typedef volatileunsigned char const vuc8;
/* Read Only */3.0以后的版本中使用了 CMSIS数据类型 , 变量的定义有所不同 , 但是出于兼容 旧版本的目的 , 以上的数据类型仍然兼容 。
CMSIS的IO类型限定词如表5-7所示 , CMSIS和STM32固件库的数据类型对比如表 5-8所示 。
这些数据类型可以 在STM32F10xstm32f10x.h中找到具体的定义 , 此部分定义如下 。
。
33、1 /*! STM32F10x Sta ndard Peripheral Library old types (mai ntai ned for legacy purpose) */22 typedef int32_t s32;
43 typedef int16_t s16;
64 typedef int8_t s8;
85 typedef const int32_t sc32;
/*! Read Only */1011 typedef const int16_t sc16;
1212 typedef const int8_t sc8;
1413 typedef __10 in t32_t vs32;
16 。
【STM32|STM32固件库详解知识讲解】34、14 typedef __IO in t16_t vs16;
1815 typedef __IO in t8_t vs8;
2016 typedef __I in t32_t vsc32;
2217 typedef __I in t16_t vsc16;
2418 typedef __I in t8_t vsc8;
2619 typedef uin t32_t u32;
2820 typedef uin t16_t u16;
3021 typedef uin t8_t u8;
3222 typedef const3423 typedef const3624 typedef const3825 typedef。
35、__IO uin t32_t vu32;
4026 typedef __IO ui nt16_t vu16;
4227 typedef __IO uin t8_t vu8;
4428 typedef __I uin t32_t vuc32;
4629 typedef __I uin t16_t vuc16;
4830 typedef __I ui nt8_t vuc8;
/*! Read Only */*! Read On ly */*! Read On ly */*! Read On ly */*! Read Only */uin t32_t uc32;
uin t16_t uc16;
uint8_t uc 。
36、8;
/*! Read On ly */*! Read On ly */*! Read On ly */*! Read Only */*! Read Only */*! Read On ly */表5-7 CMSIS IO 类型限定词IO类限定词#defi ne描述volatile const只读访问_0volatile只写访问0volatile读和写访问表5-8固件库与CMSIS数据类型对比固件库类型CMSIS类型描述s32in t32_t易挥发只读有符号32位数据s16in t16_t易挥发只读有符号16位数据s8int8_t易挥发只读有符号8位数据sc32const in t32_t只读有 。
37、符号32位数据sc16const in t16_t只读有符号16位数据sc8const in t8_t只读有符号8位数据vs32O in t32_t易挥发读写访问有符号32位数据vs16O in t16_t易挥发读写访问有符号16位数据vs8O int8_t易挥发读写访问有符号8位数据vsc32in t32_t易挥发只读有符号32位数据vsc16in t16_t易挥发只读有符号16位数据vsc8int8_t易挥发只读有符号8位数据u32uin t32_t无符号32位数据u16uin t16_t无符号16位数据u8uin t8_t无符号8位数据uc32const uin t32_t只读无符号32 。
38、位数据uc16const uin t16_t只读无符号16位数据uc8const uin t8_t只读无符号8位数据vu32O uin t32_t易挥发读写访问无符号32位数据vu16O uin t16_t易挥发读写访问无符号16位数据vu8O uin t8_t易挥发读写访问无符号8位数据vuc32uin t32_t易挥发只读无符号32位数据vuc16uin t16_t易挥发只读无符号16位数据vuc8uin t8_t易挥发只读无符号8位数据stm32f10x.h文件中还包含了常用的布尔形变量定义 , 如:吊1 typedef en umRESET = 0, SET = !RESET FlagSt 。
39、atus, ITStatus;
22 typedef enu mDISABLE = 0, ENABLE = !DISABLE Fun ctio nalState;
43 #define IS_FUNCTIONAL_STATE(STATE) (STATE) = DISABLE) | (STATE) =ENABLE)67 typedef enu mERROR = 0, SUCCESS = !ERROR ErrorStatus;
不同版本的标准外设库的变量定义略有不同 , 如 3.4版本中就没有之前版本的 TRUE和FALSE的定义 , 用户也可以根据自己的需求按照上面的格式定义自己的 布尔形变量 。
在使用标准外设 。
40、库进行开发遇到相关的定义问题时应首先找到对应的 头文件定义 。
4.使用步骤前面几个小节已经详细介绍了标准外设库的组成结构以及部分主要文件的功能描述 , 那么如果在开发中使用标准外设库需要哪些描述呢?下面就进行简要的介绍 ,这儿介绍的使用方法是与开发环境无关的 , 在不同的开发环境中可能在操作方式上 略有不同 , 但是总体的流程都是一样的 , 下一小节将介绍在MDK ARM 开发环境下使用标准外设库的详细过程 。
首先新建一个项目并设置工具链对应的启动文件 , 可以使用标准外设库中提供的模板 , 也可以自己根据自己的需求新建 。
标准外设库中已经提供了不同工具链对应的 文件 , 位于STM32F10xstartup 目录下 。
其次按照 。
41、使用产品的具体型号选择具体的启动文件 , 加入工程 。
文件主要按照使用 产品的容量进行区分 , 根据产品容量进行选择即可 。
每个文件的具体含义可以在“stm32f10x.h ”文件中找到对应的说明 , 摘录如下:1 #if !defined (STM32F10X_LD) & !defined (STM32F10X_LD_VL)& !defi ned (STM32F10X_MD) & !defi ned (STM32F10X_MD_VL) & !defi ned (STM32F10X_HD) & !defi ned (STM32F10X_HD_VL) & !defi ned (STM32F10X_XL) & ! 。
42、defi ned (STM32F10X_CL)22 /* #define STM32F10X_LD */*! STM32F10X_LD: STM32 Low densitydevices */43 /* #define STM32F10X_LD_VL */*! STM32F10X_LD_VL: STM32 Lowden sity Value Line devices */64 /* #define STM32F10X_MD */*! STM32F10X_MD: STM32 Medium densitydevices */85 /* #define STM32F10X_MD_VL */ /*!。
43、STM32F10X_MD_VL: STM32 Mediumden sity Value Line devices */* #defi ne STM32F10X_HD */ /*!STM32F10X_HD: STM32 High den sity devices */106 /* #define STM32F10X HD VL */*! STM32F10X HD VL: STM32 Highden sity value line devices */127 /* #define STM32F10X_XL */*! STM32F10X_XL: STM32 XL-densitydevices */1 。
44、48 /* #define STM32F10X_CL */*! STM32F10X_CL: STM32 Connectivityline devices */169 #endif1810 /* Tip: To avoid modifying this file each time you need to switch betwee n these2011 devices, you can defi ne the device in your toolcha in compilerpreprocessor.2212 - Low-density devices are STM32F101xx, S 。
45、TM32F102xx and STM32F103xx microc on trollers2413 where the Flash memory density ranges between 16 and 32 Kbytes.2614 - Low-density value line devices are STM32F100xx microcontrollers where the Flash2829 memory density ranges between 16 and 32 Kbytes.3031 - Medium-de nsity devices are STM32F101xx, S 。
46、TM32F102xx and STM32F103xx microco ntrollers3232 where the Flash memory density ranges between 64 and 128 Kbytes.3433 - Medium-density value line devices are STM32F100xxmicroc on trollers where the3634 Flash memory density ranges between 64 and 128 Kbytes.3835 - High-density devices are STM32F101xx。
47、and STM32F103xx microc on trollers where4036 the Flash memory den sity ran ges betwee n 256 and 512 Kbytes.4237 - High-density value line devices are STM32F100xx microcontrollers where the4438 Flash memory density ranges between 256 and 512 Kbytes.4639 - XL-density devices are STM32F101xx and STM32F 。
48、103xxmicroc on trollers where4840 the Flash memory density ranges between 512 and 1024 Kbytes.5041 - Conn ectivity line devices are STM32F105xx and STM32F107xx microco ntrollers.5242 */“ stm32f10x.h ”是整个标准外设库的入口文件 , 这个文件包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存 储空间的地址映射等 。
为了是这个文件适用于不同系列的产品 , 程序中是 。
49、通过宏定 义来实现不同产品的匹配的 , 上面这段程序的注释中已经详细给出了每个启动文件 所对应的产品系列 , 与之对应 , 也要相应的修改这个入口文件 , 需要根据所使用的产品系列正确的注释/去掉相应的注释define 。
在这段程序的下方同样有这样的一个注释程序/*#define USE_STDPERIPH_DRIVER*/用于选择是否使用标准外设库 , 如果保留这个注释 , 则用户开发程序可以基于直接访问“stm32f10x.h ”中定义的外设寄存器 , 所有的操作均基于寄存器完成 , 目前不使用固件库的单片机开发 , 如51、AVR、MSP430等其实都是采用此种方式 , 通过在对应型号的头文件 中进行外设寄存器等方面的定义 , 从而 。
50、在程序中对相应的寄存器操作完成相应的功 能设计 。
如果去掉/*#define USE_STDPERIPH_DRIVER*/的注释 , 则是使用标准外设库进行开发 , 用户需要使用在文件“ stm32f10x_co nf.h ”中 , 选择要用的外设 , 外设同样是通过注释/去掉注释的方式来选择 。
示例程序如下:1 /* Uncomment the line below to enable peripheral header file in clusi on */234567891011121314151617 #i nclude1818 /* #include2021 /* #i nclude#in clude/ 。
51、* #i nclude/* #i nclude/* #i nclude/* #i nclude/* #i nclude/* #i ncludeIIstm32f10x adc.hstm32f10x_bkp.h*/stm32f10x can.h*/stm32f10x cec.hII*/stm32f10x crc.hstm32f10x dac.h*/*/stm32f10x_dbgmcu.h */IIstm32f10x dma.hstm32f10x exti.h */stm32f10x flash.h */2223 /* #inelude stm32f10x_fsmc.h */2424 #in elu 。
52、de stm32f10x_gpio.h2625 /* #include stm32f10x_i2c.h */2826 /* #include stm32f10x_iwdg.h */3027 /* #i nclude stm32f10x_pwr.h */3228 #in clude stm32f10x_rcc.h3429 /* #include stm32f10x_rtc.h */3630 /* #include stm32f10x_sdio.h */3831 /* #include stm32f10x_spi.h */4032 /* #include stm32f10x_tim.h */423 。
53、3 /* #include stm32f10x_usart.h */4434 /* #include stm32f10x_wwdg.h */4635 #i nclude misc.h /* High level fun ctio ns for NVIC and SysTick (add-o n to CMSIS fun ctio ns) */上面一段程序来自于例程中的 AD采集程序 , 程序使用了 AD和DMA , 因此去掉 相应的注释 , 同时几乎所有的应用都需要使用复位与时钟以及通用I/O , 因此这两项是必须的 , 而多数程序同样要使用 NVIC中断IRQ设置和SysTick时钟源设置 , 那么“ misc.h 。
54、 ”这一项也是必须的 。
上面已经针对具体的产品信号和程序功能进行了针对性的配置 , 接下来需要配置系 统所使用的时钟 , 系统时钟在“ system_stm32f10x.c ”同样通过注释的方式来配 置 , 程序如下:#if defined (STM32F10X_LD_VL) | (defined STM32F10X_MD_VL) |(defi ned STM32F10X_HD_VL)/* #defi ne SYSCLK_FREQ_HSE HSE_VALUE */#define SYSCLK_FREQ_24MHz 24000000#else/* #defi ne SYSCLK_FREQ_HSE HSE_VA 。
55、LUE */* #defi ne SYSCLK_FREQ_24MHz 24000000 */* #defi ne SYSCLK_FREQ_36MHz 36000000 */* #defi ne SYSCLK_FREQ_48MHz 48000000 */* #defi ne SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000#en dif如果这儿没有明确的定义那么 HSI时钟将会作为系统时钟 。
至此 , 已经配置了系统的主要外部参数 , 这些参数主要是通过更改相关的宏定义来 实现的 , 有些开发环境 , 例如 Keil支持在软件设置中加入全局宏定义 , 因此像芯片系列定义 , 是否使用固件库定义等也可以通过软件添加来实现 。
完成了主要参数配置以后就可以进行程序的开发了 , 标准外设库开发就可以使用标 准外设库中提供的方便的 API函数进行相应的功能设计了 。
在 422小节中已经介 绍了基于标准外设库开发的优势 , 配置完成后 , 程序中仍然可以直接更改相应寄存 器的配置 , 通过对寄存器的操作可以提高程序的效率 , 因此可以使用标准外设库和 寄存器操作两种相结合的方式 。

稿源:(未知)
【傻大方】网址:/a/2021/0816/0023746079.html
标题:STM32|STM32固件库详解知识讲解