ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:187.09KB ,
资源ID:5932921      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5932921.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(stm32固件库详解doc.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

stm32固件库详解doc.docx

1、stm32固件库详解doc1.1 基于标准外设库的软件开发1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application progra

2、mming interface 应用编程界面)驱动,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到定时器,再到CAN、I

3、2C、SPI、UART和ADC等等的所有标准外设。对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库

4、的结构。可以从ST的官方网站下载到各种版本的标准外设库,首先看一下3.4版本标准外设库的文件结构,如图 53所示。3.0以上版本的文件结构大致相同,每个版本可能略有调整。图 53 STM32F10XXX V3.4标准外设库文件结构表 54中介绍了每个文件夹所包含的主要内容。表 54 STM32F10XXX V3.4标准外设库文件夹描述STM32F10x_StdPeriph_Lib_V3.4.0_htmresc本文件夹包含了所有的html页面资源LibrariesCMSIS见表 56STM32F10x_StdPeriph_Driverinc标准外设库驱动头文件src标准外设库驱动源文件Proje

5、ctExamples标准外设库驱动的完整例程TemplateMDK-ARMKEIL RVMDK的项目模板示例RIDERaisonance RIDE的项目模板示例EWARMIAR EWARM的项目模板示例UtilitiesSTM3210-EVAL本文件夹包含了用于STM3210B-EVAL和STM3210E-EVAL评估板的专用驱动标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移

6、植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,很多驱动函数同样可以作为学习的重要参考。STM32F10xxx标准外设库体系结构如图 54所示。图中很好的展示了各层以及具体文件之间的联系,各文件的具体功

7、能说明如表 55所示。图 54 STM32F10xxx标准外设库体系结构表 55 文件功能说明文件名功能描述具体功能说明core_cm3.hcore_cm3.cCortex-M3内核及其设备文件访问Cortex-M3内核及其设备:NVIC,SysTick等访问Cortex-M3的CPU寄存器和内核外设的函数stm32f10x.h微控制器专用头文件这个文件包含了STM32F10x全系列所有外设寄存器的定义(寄存器的基地址和布局)、位定义、中断向量表、存储空间的地址映射等system_stm32f10x.hsystem_stm32f10x.c微控制器专用系统文件函数SystemInit,用来初始化

8、微控制器函数Sysem_ExtMemCtl,用来配置外部存储器控制器。它位于文件startup_stm32f10x_xx.s /.c,在跳转到main前调用SystemFrequncy,该值代表系统时钟频率startup_stm32f10x_Xd.s编译器启动代码微控制器专用的中断处理程序列表(与头文件一致)弱定义(Weak)的中断处理程序默认函数(可以被用户代码覆盖) 该文件是与编译器相关的stm32f10x_conf.h固件库配置文件通过更改包含的外设头文件来选择固件库所使用的外设,在新建程序和进行功能变更之前应当首先修改对应的配置。stm32f10x_it.hstm32f10x_it.c

9、外设中断函数文件用户可以相应的加入自己的中断程序的代码,对于指向同一个中断向量的多个不同中断请求,用户可以通过判断外设的中断标志位来确定准确的中断源,执行相应的中断服务函数。stm32f10x_ppp.hstm32f10x_ppp.c外设驱动函数文件包括了相关外设的初始化配置和部分功能应用函数,这部分是进行编程功能实现的重要组成部分。Application.c用户文件用户程序文件,通过标准外设库提供的接口进行相应的外设配置和功能设计。2. 基于CMSIS标准的软件架构根据调查研究,软件开发已经被嵌入式行业公认为最主要的开发成本。对于ARM公司来说,一个ARM内核往往会授权给多个厂家,生产种类繁

10、多的产品,如果没有一个通用的软件接口标准,那么当开发者在使用不同厂家的芯片时将极大的增加了软件开发成本,因此,ARM与Atmel、IAR、Keil、hami-nary Micro、Micrium、NXP、SEGGER和ST等诸多芯片和软件厂商合作,将所有Cortex芯片厂商产品的软件接口标准化,制定了CMSIS标准。此举意在降低软件开发成本,尤其针对新设备项目开发,或者将已有软件移植到其他芯片厂商提供的基于Cortex处理器的微控制器的情况。有了该标准,芯片厂商就能够将他们的资源专注于产品外设特性的差异化,并且消除对微控制器进行编程时需要维持的不同的、互相不兼容的标准的需求,从而达到降低开发成

11、本的目的。如图 55所示,基于CMSIS标准的软件架构主要分为以下4层:用户应用层、操作系统及中间件接口层、CMSIS层、硬件寄存器层。其中CMSIS层起着承上启下的作用:一方面该层对硬件寄存器层进行统一实现,屏蔽了不同厂商对Cortex-M系列微处理器核内外设寄存器的不同定义;另一方面又向上层的操作系统及中间件接口层和应用层提供接口,简化了应用程序开发难度,使开发人员能够在完全透明的情况下进行应用程序开发。也正是如此,CMSIS层的实现相对复杂。图 55 CMSIS标准的软件架构层主要分为以下3 个部分:(1) 核内外设访问层(CPAL,Core Peripheral Access Laye

12、r):该层由ARM 负责实现。包括对寄存器名称、地址的定义,对核寄存器、NVIC、调试子系统的访问接口定义以及对特殊用途寄存器的访问接口(例如:CONTROL,xPSR)定义。由于对特殊寄存器的访问以内联方式定义,所以针对不同的编译器ARM 统一用来屏蔽差异。该层定义的接口函数均是可重入的。(2) 片上外设访问层(DPAL, Device Peripheral Access Layer):该层由芯片厂商负责实现。该层的实现与CPAL 类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用CPAL 层提供的接口函数同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请求。(3) 外

13、设访问函数(AFP, Access Functions for Peripherals):该层也由芯片厂商负责实现,主要是提供访问片上外设的访问函数,这一部分是可选的。对一个Cortex-M 微控制系统而言,CMSIS 通过以上三个部分实现了:l 定义了访问外设寄存器和异常向量的通用方法;l 定义了核内外设的寄存器名称和核异常向量的名称;l 为RTOS 核定义了与设备独立的接口,包括Debug 通道。这样芯片厂商就能专注于对其产品的外设特性进行差异化,并且消除他们对微控制器进行编程时需要维持的不同的、互相不兼容的标准需求,以达到低成本开发的目的。CMSIS中的具体文件结构如表 56所示。表 5

14、6 CMSIS文件夹结构CMSISCoreDocumentationCMSIS文档CM3StartuparmMDK ARM编译器启动文件startup_stm32f10x_hd.s: 大容量产品启动文件startup_stm32f10x_md.s: 中容量产品启动文件startup_stm32f10x_ld.s: 小容量产品启动文件gcc_ride7GCC编译器启动文件iarIAR编译器启动文件TrueSTUDIOTrueSTUDIO编译器启动文件本文件夹包含STMF10xxx CMSIS文件:微控制器外设访问层和内核设备访问层:core_cm3.h:CMSIS的Cortex-M3内核设备访问

15、层头文件core_cm3.c:CMSIS的Cortex-M3内核设备访问层源文件stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件system_stm32f10x.h:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层头文件system_stm32f10x.c:CMSIS的Cortex-M3 STM32f10xxx微控制器外设访问层源文件在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库(StdPeriph_Lib):(1) 使用外设驱动:这时应用程序开发基于外设驱动的API(应用编程接口)。用户只需要

16、配置文件”stm32f10x_conf.h”,并使用相应的文件”stm32f10x_ppp.h/.c”即可。(2) 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件。这两种方法的优缺点在“使用标准外设库开发的优势”小节中已经有了具体的介绍,这里仍要说明的是,使用使用标准外设库进行开发可以极大的减小软件开发的工作量,也是目前嵌入式系统开发的一个趋势。标准外设库(StdPeriph_Lib)支持STM32F10xxx系列全部成员:大容量,中容量和小容量产品。从表 56中也可以看出,启动文件已经对不同的系列进行了划分,实际开发中根据使用的STM32产品具体型号,用户可以通过文件”st

17、m32f10x.h”中的预处理define或者通过开发环境中的全局设置来配置标准外设库(StdPeriph_Lib),一个define对应一个产品系列。下面列出支持的产品系列STM32F10x_LD:STM32小容量产品STM32F10x_MD:STM32中容量产品STM32F10x_HD:STM32大容量产品在库文件中这些define的具体作用范围是:l 文件“stm3210f.h”中的中断IRQ定义l 启动文件中的向量表,小容量,中容量,大容量产品各有一个启动文件l 外设存储器映像和寄存器物理地址l 产品设置:外部晶振(HSE)的值等l 系统配置函数因此通过宏定义这种方式,可以使标准外设库

18、适用于不同系列的产品,同时也方便与不同产品之间的软件移植,极大的方便了软件的开发。1.1.4 STM32F10XXX标准外设库的使用标准外设库中包含了众多的变量定义和功能函数,如果不能了解他们的命名规范和使用规律将会给编程带来很大的麻烦,本节将主要叙述标准外设库中的相关规范,通过这些规范的学习可以更加灵活的使用固件库,同时也将极大增强程序的规范性和易读性,同时标准外设库中的这种规范也值得我们在进行其他相关的开发时使用和借鉴。1. 缩写定义 标准外设库中的主要外设均采用了缩写的形式,通过这些缩写可以很容易的辨认对应的外设。缩写外设/单元ADC模数转换器BKP备份寄存器CAN控制器局域网模块CEC

19、CRCCRC计算单元DAC数模转换器DBGMCU调试支持DMA直接内存存取控制器EXTI外部中断事件控制器FLASH闪存存储器FSMC灵活的静态存储器控制器GPIO通用输入输出I2CI2C接口IWDG独立看门狗PWR电源/功耗控制RCC复位与时钟控制器RTC实时时钟SDIOSDIO接口SPI串行外设接口TIM定时器USART通用同步/异步收发器WWDG窗口看门狗2. 命名规则标准外设库遵从以下命名规则PPP表示任一外设缩写,例如:ADC。源程序文件和头文件命名都以“stm32f10x_”作为开头,例如:stm32f10x_conf.h。常量仅被应用于一个文件的,定义于该文件中;被应用于多个文件

20、的,在对应头文件中定义。所有常量都由英文字母大写书写。寄存器作为常量处理。他们的命名都由英文字母大写书写。在大多数情况下,他们采用与缩写规范一致。外设函数的命名以该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:SPI_SendData。在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。对于函数命名,总的来说有以下规则:l 名为PPP_Init的函数,其功能是根据PPP_InitTypeDef中指定的参数,初始化外设PPP,例如TIM_Init.l 名为PPP_DeInit的函数,其功能为复位外设PPP的所有寄存器至缺省值,例如TIM_DeInit

21、.l 名为PPP_Init的函数,其功能为通过设置PPP_InitTypeDef 结构中的各种参数来定义外设的功能,例如:USART_Init .l 名为PPP_Cmd的函数,其功能为使能或者失能外设PPP,例如: SPI_Cmd.l 名为PPP_ITConfig的函数,其功能为使能或者失能来自外设PPP某中断源,例如: RCC_ITConfig.l 名为PPP_DMAConfig的函数,其功能为使能或者失能外设PPP的DMA接口,例如:TIM1_DMAConfig.l 用以配置外设功能的函数,总是以字符串“Config”结尾,例如GPIO_PinRemapConfig.l 名为PPP_Get

22、FlagStatus的函数,其功能为检查外设PPP某标志位被设置与否,例如:I2C_GetFlagStatus.l 名为PPP_ClearFlag的函数,其功能为清除外设PPP标志位,例如:I2C_ClearFlag.l 名为PPP_GetITStatus的函数,其功能为判断来自外设PPP的中断发生与否,例如:I2C_GetITStatus.l 名为PPP_ClearITPendingBit的函数,其功能为清除外设PPP中断待处理标志位,例如: I2C_ClearITPendingBit.这样的命名方式非常便于程序的编写和阅读,以标准外设库中的示例函数为例,下面摘录了STM32F10x_Std

23、Periph_ExamplesADC3ADCs_DMAmian.c中的一段程序。cpp view plaincopyprint?1. DMA_InitTypeDefDMA_InitStructure;2. /*DMA1channel1configuration-*/3. DMA_DeInit(DMA1_Channel1);4. DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;5. DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADC1ConvertedValue;6. DMA_I

24、nitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;7. DMA_InitStructure.DMA_BufferSize=1;8. DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;9. DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Disable;10. DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;11. DMA_InitStructur

25、e.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;12. DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;13. DMA_InitStructure.DMA_Priority=DMA_Priority_High;14. DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;15. DMA_Init(DMA1_Channel1,&DMA_InitStructure);16. /*EnableDMA1channel1*/17. DMA_Cmd(DMA1_Channel1,ENAB

26、LE);DMA_InitType Def DMA_InitStructure;/* DMA1 channel1 configuration -*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_B

27、ufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mo

28、de = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);这段程序完成了DMA1通道的配置,首先定义了DMA_InitType DMA_InitStructure,接着配置DMA_InitType的各种参数,各参数的命名

29、方式也均使用约定的命名方式,从命名就能够很容易的看出各参数所指代的具体功能。功能参数配置完成后,使用DMA_Init(DMA1_Channel1, &DMA_InitStructure);完成相应外设的初始化,最后使用DMA_Cmd(DMA1_Channel1, ENABLE)使能相应外设。从这个例子就能够很容易的看出标准外设库这种规范化的命名规则给编写和阅读程序带来的好处。3. 变量定义在早期的版本中有24个变量定义,在Keil的安装根目录下,可以找到对应的定义,路径为:KeilARMINCSTSTM32F10xstm32f10x_type.hcpp view plaincopyprint?

30、1. /*Includes-*/2. /*Exportedtypes-*/3. typedefsignedlongs32;4. typedefsignedshorts16;5. typedefsignedchars8;6. typedefsignedlongconstsc32;/*ReadOnly*/7. typedefsignedshortconstsc16;/*ReadOnly*/8. typedefsignedcharconstsc8;/*ReadOnly*/9. typedefvolatilesignedlongvs32;10. typedefvolatilesignedshortvs16;11. typedefvolatilesignedcharvs8;12. typedefvolatilesignedlongcon

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1