stm32标准外设库详解
STM32L4库学习总结

STM32L4库学习总结ST为开发者提供了非常方便的开发库。
到目前为止,有标准外设库(STD库)、HAL库、LL库三种。
前两者都是常用的库,后面的LL库是ST最近才添加,随HAL源码包一起提供,目前支持的芯片也偏少。
一般来说STD库和LL库是不兼容的。
标准外设库(Standard Peripherals Library)是对STM32芯片的一个完整的封装,包括所有标准器件外设的器件驱动器。
这应该是目前使用最多的ST库。
几乎全部使用C语言实现。
但是,标准外设库也是针对某一系列芯片而言的,没有可移植性。
标准外设库仍然接近于寄存器操作,主要就是将一些基本的寄存器操作封装成了C函数。
开发者需要关注所使用的外设是在哪个总线之上,具体寄存器的配置等底层信息。
不支持从STM32L0、L4和F7以后的芯片。
HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。
HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。
该库提供了一整套一致的中间件组件,如RTOS,USB,TCP / IP和图形等。
HAL库是基于一个非限制性的BSD许可协议(Berkeley Software Distribution)而发布的开源代码。
ST制作的中间件堆栈(USB主机和设备库,STemWin)带有允许轻松重用的许可模式,只要是在ST公司的MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。
至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。
可以说HAL库就是用来取代之前的标准外设库的。
相比标准外设库,STM32Cube HAL库表现出更高的抽象整合水平,HAL API集中关注各外设的公共函数功能,这样便于定义一套通用的用户友好的API函数接口,从而可以轻松实现从一个STM32产品移植到另一个不同的STM32系列产品。
STM32 LL 库使用指南说明书

STM32 LL库使用指南---By Fengzi熟悉STM32的都知道ST官方提供了非常方便好用的库函数供用户使用,多数人都使用过STM32标准外设库,STM32Cube库(即HAL库),这个LL库是什么鬼,却从来没听说过。
好吧,我承认这个名字是我自己XJB取的。
目录一、初识LL 库 (1)二、怎么使用LL库 (3)三、新建STM32LL库工程模板 (5)四、第一个程序——点亮LED (8)五、添加其他程序功能 (10)………………………………………………………………………………………………………………………………………………….一、初识LL 库最近论坛发的STM32L476RG Nucleo开发板到手了,准备学习玩耍,当然第一步就是下载资料,于是我下载STM32L4Cube 1.1.0版本,打开逐个查看,好像和以前一样的,没什么特别嘛,于是准备开始开发。
等等,好像还真发现了有点不一样:熟悉HAL库的都知道,该库的文件几乎都是以stm32xxx_hal_xxx.h/.c命名的,为了和以前的标准库有个区分,上图中那些是什么鬼前辈说,遇到问题赶紧查手册,于是我果断打开STM32L4Cube库的说明手册(UM1884):原来这个东西叫做Low Layer APIs,作为英文渣渣表示实在不习惯洋里洋气的高大上名字,于是擅自把他叫做【STM32LL库】了(不服的你咬我啊)。
从这里看好像是说这个东东比HAL库更接近硬件,到底什么鬼,还不清楚。
但是以前好像没见过这个东西啊,就算是STM32L4Cube的1.0.0版本中都没有。
看看Cube发行历史:原来LL库是在1.1.0版本才加上的,大概意思就是:1.LL APIs是寄存器级的编程,嗯,也就是说我们常说的直接操作寄存器吧。
2.LL APIs适用于xxx等一大堆外设3.LL APIs函数全部定义为static inline函数,放在对应的头文件中,用户使用需要包含相关头文件4.参考这两个文档看看LL库文件在Cube库中的位置,有20多个文件,全部以stm32l4xx_ll_xxx.h命名:STM32Cube_FW_L4_V1.1.0\Drivers\STM32L4xx_HAL_Driver\IncSTM32L4是面向低功耗市场的,同时不失高性能,功耗和性能往往是两个矛盾的东西,ST在硬件设计上想了各种办法来实现兼顾低功耗高性能(例如各种低功耗模式,LP外设等),而在软件层面,程序也讲求效率,LL库全是直接操作寄存器,直接操作寄存器往往效率较高,而且函数定义为内联函数,调用函数时不是堆栈调用,而是直接把函数的代码嵌入到调用的地方,利于提高代码相率,我想这也是ST在STM32L4系列中推出这个直接操作寄存器的LL库的原因之一吧。
STM32F4xx标准外设固件库

一、标准固件库简介本文下载的是STM32F4xx_DSP_StdPeriph_Lib_V1.5.0,其文件夹如下图所示:其中Project文件夹为各个开发环境(MDK-ARM、EWARM、TrueSTUDIO)的模板工程,Utilities文件夹为官方评估板的标准固件库应用例程,而真正的标准固件库在Libraries文件夹中。
在Libraries文件夹中:CMSIS文件夹主要包含于内核相关的文件;STM32F4xx_StdPeriph_Driver文件夹为STM32F4xx处理器外设相关的底层驱动。
以下为固件库移植时CMSIS文件夹中的重要源文件:core_cm4.h :内核功能的定义,比如NVIC相关寄存器的结构体和Systick配置。
在CMSIS/Include中core_cmFunc.h :内核核心功能接口头文件。
在CMSIS/Include中core_cmInstr.h :包含一些内核核心专用指令。
在CMSIS/Include中core_cmSimd.h :包含与编译器相关的处理。
在CMSIS/Include中stm32f4xx.h :包含了stm32f4的寄存器结构体的定义(类似于c51的reg52.h)。
在CMSIS\Device\ST\STM32F4xx\Include中system_stm32f4xx.h :system_stm32f4xx.c的头文件。
在CMSIS\Device\ST\STM32F4xx\Include中system_stm32f4xx.c :stm32f4的系统时钟配置。
在CMSIS\Device\ST\STM32F4xx\Source\Templates中startup_stm32f40_41xxx.s:启动文件:设定SP的初始值;设置PC的初始值;设置中断向量表的地址;配置时钟;设置堆栈;调用main。
这个启动文件先调用system_stm32f4xx.c里面的systeminit()在调用main()之前。
STM32 3.5库文件中文说明

STM32库文件1.1.1 STM32标准外设库概述STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。
因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API (application programming 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、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
stm32f4标准库

stm32f4标准库STM32F4标准库是针对STMicroelectronics公司的STM32F4系列单片机所提供的一套标准外设驱动库。
该库提供了丰富的外设驱动函数,可以方便地进行STM32F4系列单片机的开发。
本文将介绍STM32F4标准库的基本概念、使用方法以及常见问题解决方案,帮助开发者更好地理解和应用STM32F4标准库。
首先,我们来了解一下STM32F4标准库的基本概念。
STM32F4标准库是基于CMSIS(Cortex Microcontroller Software Interface Standard)规范开发的,它为STM32F4系列单片机的外设提供了一套统一的接口。
通过使用标准库,开发者可以直接调用库中提供的函数来操作单片机的外设,而不需要关心外设寄存器的具体操作细节,大大简化了开发流程。
接下来,我们将介绍STM32F4标准库的使用方法。
首先,开发者需要在工程中引入STM32F4标准库的头文件,并将库文件添加到工程中进行链接。
然后,可以通过调用库中提供的函数来初始化和操作单片机的外设,完成相应的功能。
需要注意的是,开发者在使用标准库时,应该了解每个函数的功能和参数含义,并根据实际需求进行调用和配置。
除了基本的使用方法,我们还将介绍一些常见问题的解决方案。
在使用STM32F4标准库的过程中,开发者可能会遇到一些常见的问题,比如外设初始化失败、功能无法正常使用等。
针对这些问题,我们将给出相应的解决方案,并介绍一些调试技巧,帮助开发者快速定位和解决问题。
总之,STM32F4标准库是STM32F4系列单片机开发中非常重要的一部分,它为开发者提供了方便、高效的外设操作接口,极大地简化了开发流程。
通过本文的介绍,相信开发者可以更好地理解和应用STM32F4标准库,提高开发效率,加快产品上市时间。
希望本文能够对开发者有所帮助,如果您在使用STM32F4标准库的过程中遇到了问题,可以参考本文提供的解决方案,或者查阅官方文档进行深入学习。
STM32F4标准外设固件库文件关系图

1、文件夹介绍网上下载STM32F4xx_DSP_StdPeriph_Lib_V1.4.0,其中Libraries文件夹下面就是固件库相关程序文件。
包括CMSIS和STM32F4xx_StdPeriph_Driver 文件夹CMSISCMSIS文件夹存放的是符合CMSIS规范的一些文件。
STM32F4xx_StdPeriph_Driver存放的是STM32F4xx标准外设固件库源码文件和对应的头文件。
1)main主程序中引用:stm32f4xx.h 头文件。
stm32f4xx.h 是 STM32F4 片上外设访问层头文件。
非常重要。
2)stm32f4xx.h中引用:<stdint.h> 、system_stm32f4xx.h、core_cm4.h、stm32f4xx_conf.h3)system_stm32f4xx.h 是片上外设接入层系统头文件。
主要是申明设置系统及总线时钟相关的函数。
4)core_cm4.h 文件,这个就是 CMSIS 核心文件,提供进入 M4 内核接口,这是 ARM 公司提供,对所有CM4 内核的芯片都一样。
5)stm32f4xx_conf.h 是外设驱动配置文件。
包括misc.h、stm32f4xx_rcc.h和各种外设头文件stm32f4xx_ppp.h6)misc.c 和 misc.h 是定义中断优先级分组以及 Systick 定时器相关的函数。
7)stm32f3xx_rcc.c 和 stm32f4xx_rcc.h 是与 RCC 相关的一些操作函数,作用主要是一些时钟的配置和使能。
在任何一个 STM32 工程 RCC 相关的源文件和头文件是必须添加的。
8)对于文件 stm32f4xx_ppp.c 和 stm32f4xx_ppp.h,这就是 stm32F4 标准外设固件库对应的源文件和头文件。
包括一些常用外设 GPIO,ADC,USART 等。
9)文件 Application.c 实际就是说是应用层代码。
STM32固件库详解

STM32固件库详解1.1 基于标准外设库的软件开发1.1.2 使用标准外设库开发的优势简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。
标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。
对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
1.1.3 STM32F10XXX标准外设库结构与文件描述1. 标准外设库的文件结构在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。
STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的3.5版本,开发环境中自带的标准外设库为2.0.3版本,本书中以比较稳定而且较新的V3.4版本为基础介绍标准外设库的结构。
可以从ST的官方网站下载到各种版本的标准外设库,首先看一下3.4版本标准外设库的文件结构,如图5-3所示。
3.0以上版本的文件结构大致相同,每个版本可能略有调整。
标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M 处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M 上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。
STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。
Project文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。
STM32F10xxx标准外设库移植技术研究

文 件 夹 “ sr 中 添加 的文 件 是 上 面 2 中提 到 的 物 U e” )
理 文 件 夹 “ e” 的 “t 21 x ic 、 man ” Usr 中 s m3 f0 t ” “ i. 文 . C
件 夹 “ tr p 中添 加 的 文件 是 2 中提 到 的物 理 文 Sat ” U )
个 “ E DMEtt文本 文件 . 文 本文 件放 在 “ . R A . ” x 该 Us
e” r 目录 下 ( 文 本 文 件 可 作 为 编 程 日志使 用 ) 此 。在 “ VMD 文件 夹下 建立 “ i ” “ B ” R K” Ls 、O J 两个 文件 夹 。 t 将 标 准 外 设 “ T 2 1x Sd eih Li V3 S M3 F 0 t r b P p .
S M3 F 0 x T 2 1x x标 准外设 库 的流 程 。
1 下 载库 包 。 )
S M 3 F 0 tP r h Lb V31 可 从 ht: T 2 1x Sd ei i p .. 0 t / p/
“ OC 五个 逻 辑 目录 . 个逻 辑 目录可 通 过 最右 边 D ” 每
用 驱 动 程序 ;Lba e”文 件 夹 包 含 了标 准 外 设库 “ irr s i 驱 动 头 文 件 和 源 文 件 以 及 内 核 文 件 。 在 进 行 S M3 F 0 x T 2 1x x标 准 外 设 库 移 植 时 主 要 是 使 用 “ i L.
bais 文件 夹 中的 内容 。 rr ” e
“rjcke io rjc…”在 保 存 工程 文 件 Poetnw Uvs n poet . \ i
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
stm32标准外设库使用详解分类:stm32 2011-07-17 10:57 2233人阅读评论(11) 收藏举报转载请注明出处:/lbl1234下载代码stm32标准外设库是stm32全系列芯片的外设驱动,有了它可以大大加速我们开发stm32。
首先从st公司的网站下载最新的stm32标准外设库,写本文时最新的版本是V3.5.0。
解压该zip文件,得到如下文件夹和文件STM32F10x_StdPeriph_Lib_V3.5.0\_htmrescLibrariesProjectUtilitiesRelease_Notes.htmlstm32f10x_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\docsrcincludeoutput\obj\list整理库代码由于Libraries下的CMSIS文件夹中很多代码是和编译器及芯片相关的,导致文件夹多且深度大,不利于工程维护,实际上一个项目往往是用固定的编译器和芯片,因此有必要对库进行整理。
在src下建立libstm32目录1. 把Libraries\STM32F10x_StdPeriph_Driver\下的内容拷贝到libstm32目录下2. 在libstm32目录下建立cmsis文件夹,把Libraries\CMSIS\CM3\CoreSupport\下的core_cm3.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芯片)。
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[cpp]view plaincopyprint?1.<span style="font-size:18px;">#ifndef _LED_H_2.#define _LED_H_3.4.#include <stdint.h>5.6.#define LED_0 07.#define LED_1 18.#define LED_2 29.10.void led_init(void);11.void led_on(uint32_t n);12.void led_off(uint32_t n);13.14.#endif15.16.</span>1.<span style="font-size:18px;">#include "stm32f10x.h"2.#include "led.h"3.4.void led_init(void)5.{6. GPIO_InitTypeDef GPIO_InitStructure;7.8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;12. GPIO_Init(GPIOC, &GPIO_InitStructure);13.}14.15.void led_on(uint32_t n)16.{17. switch (n)18. {19. case LED_0:20. GPIO_SetBits(GPIOC, GPIO_Pin_6);21. break;22. case LED_1:23. GPIO_SetBits(GPIOC, GPIO_Pin_7);24. break;25. case LED_2:26. GPIO_SetBits(GPIOC, GPIO_Pin_8);27. break;28. default:29. break;30. }31.}32.33.void led_off(uint32_t n)34.{35. switch (n)36. {37. case LED_0:38. GPIO_ResetBits(GPIOC, GPIO_Pin_6);39. break;40. case LED_1:41. GPIO_ResetBits(GPIOC, GPIO_Pin_7);42. break;43. case LED_2:44. GPIO_ResetBits(GPIOC, GPIO_Pin_8);45. break;46. default:47. break;48. }49.}</span>1.<span style="font-size:18px;">#include "led.h"2.3.static void delay(uint32_t ms)4.{5. uint32_t count = 8000;6. while (ms--)7. {8. while (count--);9. count = 8000;10. }11.}12.13.int main(void)14.{15. led_init();16.17. for (;;)18. {19. led_on(LED_0);20. led_off(LED_1);21. led_off(LED_2);22. delay(1000);23.24. led_off(LED_0);25. led_on(LED_1);26. led_off(LED_2);27. delay(1000);28.29. led_off(LED_0);30. led_off(LED_1);31. led_on(LED_2);32. delay(1000);33. }34.}35.</span>这一步大家可以根据自己手上的仿真器做不同选择。