您的位置 首页 技术

STM32外设库文件剖析(V3.5)

标准库文件3.5版本1._htmresc里面有两个logo,没用,删除。2.Release_Notes.html发行版本,可以看到各个版本的发行时间,修改内容。3.Ut…

规范库文件3.5版别

1._htmresc 里边有两个logo,没用,删去。
2.Release_Notes.html 发行版别,能够看到各个版别的发行时刻,修正内容。
3.Utilities 里边是一些测验C文件,评价运用。
4.stm32f10x_stdperiph_lib_um.chm 帮助文件。
5.Project 文件夹有个模版和一个例程。以工程方式供给。
6.Libraries 文件夹下面包含两个文件夹:
CMSIS Cortex Microcontroller Software Interface Standard
CM3
CoreSupport:core_cm3.c core_cm3.h
DeviceSupport
ST
STM32F10x:stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h startup
arm:发动文件
Documentation:Cortex Microcontroller Software Interface Standard 发行版别记载
STM32F10x_StdPeriph_Driver
依据需求和开发环境对文件进行了一些精简,精简后的内容:
CMSIS Cortex Microcontroller Software Interface Standard
CoreSupport
Core_cm3.c:
STM32从3.0库开端引入了CMSIS,CMSIS是Cortex微控制器软件接口规范(Cortex MicroController Software Interface Standard)的缩写,
这个是ARM定制的一个用于Cortex-M系列的一个规范,首要是为了供给通用api接口来拜访内核和一些片上外设,进步代码的可移植性。
CMSIS有三个层:
核内外设拜访层 Core Peripheral Access Layer(CPAL),
中间件拜访层 Middleware Access Layer(MWAL),
设备拜访层 Device Peripheral Access Layer(DPAL)。
CPAL用于拜访内核的寄存器和组件,如NVIC,调试体系等。该层是由ARM完成的。
MWAL用于对中间件的拜访,现在该层还未完成。(也不知道所谓的中间层是什么东西)。
DPAL用于界说一些硬件寄存器的地址和一些外设拜访函数,由芯片制造商完成。
CPAL层的完成便是Core_cm3.c文件,DPAL层的完成便是system_stm32f10x.c文件(好像还应该加上外设的函数库)。
接下来就来了解一下Core_cm3.c里边有什么东东:
首先是汇编要害字__ASM和__INLINE的宏界说,支撑不同的编译器。由于运用的是Keil,所以就只看第一种,__CC_ARM。
这儿边的函数调用都只契合ARM进程调用规范的,如R0到R3用作参数和回来值传递,这也是这儿边仅有用到的。
此外,在Keil中运用了__asm要害字后,编译器不会为函数增加回来指令,所以需求自己编写回来指令,也便是每个函数后边的 bx lr。
1. __ASM uint32_t __get_PSP(void):获取进程仓库指针PSP。
2. __ASM void __set_PSP(uint32_t topOfProcStack):设置PSP。
3. __ASM uint32_t __get_MSP(void):获取主仓库指针MSP。
4. __ASM void __set_MSP(uint32_t mainStackPointer):设置MSP。
5. __ASM uint32_t __REV16(uint16_t value):回转半字中字节次序,如0xABCD回转后得到0xCDAB。
6. __ASM int32_t __REVSH(int16_t value):回转字节次序,并做符号拓宽。
便是在__REV16函数得到的成果上再进行一次符号拓宽。这两个函数首要是便利进行巨细端的切换。
7. __ASM void __CLREX(void):铲除由LDREX指令形成的互斥锁。LDREX和STREX是Cortex用来完成互斥拜访,
维护临界资源的指令,LDREX履行后,只需离它最近的一条存储指令(STR,STREX)才干履行,其他的存储指令都会被驳回,
而CLREX便是用于铲除互斥拜访状况的符号。
8. __ASM uint32_t __get_BASEPRI(void):获取BASEPRI寄存器的值,
优先级号高于该寄存器的中止都会被屏蔽(优先级号越大,优先级越低),为零时不屏蔽任何中止。
9. __ASM void __set_BASEPRI(uint32_t basePri):设置BASEPRI的值。
10. __ASM uint32_t __get_PRIMASK(void):PRIMASK是一个只需一位的寄存器,置位时屏蔽绝大部分的反常中止,
只剩下NMI和HardFault能够呼应。
11. __ASM void __set_PRIMASK(uint32_t priMask):设置PRIMASK的值。
12. __ASM uint32_t __get_FAULTMASK(void):FAULTMASK也是一个只需一位的寄存器,为1时只需NMI才干呼应,
其他反常与中止悉数被屏蔽。
13. __ASM void __set_FAULTMASK(uint32_t faultMask):设置FAULTMASK的值。
14. __ASM uint32_t __get_CONTROL(void):获取CONTROL的值。寄存器CONTROL只需两位。
CONTROL[0]挑选特权等级,0为特权级,1为敌用户级。CONTROL[1]用于挑选仓库指针,0为MSP,1为PSP。
15. __ASM void __set_CONTROL(uint32_t control):设置CONTROL寄存器的值。
BASEPRI,PRIMASK,FAULTMASK,CONTROL都只能在特权方式下被修正。
C++的要害字 asm
微软胪陈:
__asm要害字发动内联汇编而且能写在任何c/c++合法句子之处.它不能独自呈现.
它有必要接汇编指令、一组被大括号包含的指令或一对空括号.术语“__asm 块”在这儿是恣意一个指令或一组指令不管是否在括号内。
以下代码片段是在括号内的一个简略的__asm块。
__asm
{
mov al, 2
mov dx, 0xD007
out al, dx
}
另一种方法是,你能够在每个汇编指令前放置__asm
__asm mov al, 2
__asm mov dx, 0xD007
__asm out al, dx
由于__asm要害字是一个句子分隔符,你也能够将汇编指令放在同一行:
__asm mov al, 2 __asm mov dx, 0xD007 __asm out al, dx
以上三个的比如发生相同的代码,可是第一种风格(把__asm块用括号括起来)有一些优势。
括号能够明晰的将C或C++代码和汇编代码分隔,而且防止了不必要的重复__asm要害字。括号也能防止含糊性。
假如你想在__asm块的同一行放置一个C或C++句子,你有必要将块用括号括起来。
没有括号,编译器不能告知汇编代码在哪里中止而C或C++代码在哪里开端。
最终,由于在括号的文字有和原始MASM相同的格局,你能轻松的从一个已有的MASM源文件里剪切和黏贴文字到文件来。
不同于C和C++的括号,包含__asm块的括号对变量的作用域并没有作用。你也能嵌套__asm块,嵌套对变量作用域也没有作用。
core_cm3.h:里边包含了一些内联函数,数据结构,这些数据结构都是中心的外设数据结构,大约包含:NVIC,SCB,ITM,CoreDebug,SysTick.
对以上设备进行设置的函数也在这个头文件里,以静态内联函数的方式呈现,例如 static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn),
其间,__INLINE 是__inline 的替代。 静态函数 static 声明。
Core_cm3.c 文件中界说的函数声明也在这个文件中。
invlude包含指令不只仅限于.h头文件,能够包含任何编译器能辨认的C/C++代码文件,包含.c,.hpp,.cpp,.hxx,.cxx等,乃至.txt,.abc等等都能够。
   预处理器发现 #include 指令后,就会寻觅后跟的文件名并把这个文件的内容包含到当时文件中。
被包含文件中的文本将替换源代码文件中的#include 指令,
就像你把被包含文件中的悉数内容键入到源文件中的这个方位相同。
DeviceSupport
stm32f10x.h:
新版的固件库V3.0以上 main等源文件中不再直接包含stm32f10x_conf.h,
而是stm32f10x.h,stm32f10x.h则界说了发动设置,以及一切寄存器宏界说,
此文件中需求留意的有:
1、device挑选
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD)
&& !defined (STM32F10X_MD_VL)&& !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL)
&& !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL)
&& !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL)
&& !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL)
&& !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
#error “Please select first the target STM32F10x device used in your application (in stm32f10x.h file)”
#endif
假如都没有界说,编译器会报错。
2、外设宏界说USE_STDPERIPH_DRIVER
#if !defined USE_STDPERIPH_DRIVER
#endif
留意stm32f10x.h文件的后边有这样的代码,大约8300行左右:
#ifdef USE_STDPERIPH_DRIVER
#include “stm32f10x_conf.h”
#endif
stm32f10x_conf.h中包含了一切外设的头文件,因而恣意源文件只需包含了stm32f10x.h,就能够在源文件调用恣意外设的函数。
3、外部时钟频率挑选
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000)
#else
#define HSE_VALUE ((uint32_t)8000000)
#endif
#endif
留意STM32F10X_CL,STM32F10X_CL是stm32f105 和stm32f107 互联型的device,
用到此器材外部要选用25MHz的晶体,此处默许的外部8MHz的晶体
4.stm32f10x.h包含了这些头文件,include”stm32f10x.h”,就不必包含下面这些了。
#include “core_cm3.h”
#include “system_stm32f10x.h”
#include
system_stm32f10x.c:
这个文件中包含体系上电复位之后时钟设置要调用的函数:
SystemInit()体系初始化,体系上电复位,main()在发动其它分支程序曾经调用的函数。
SetSysClock(),被SystemInit()函数调用,设置体系时钟频率,依据宏界说挑选体系运转的时钟频率。
SetSysClockTo24
SetSysClockTo36
SetSysClockTo48
SetSysClockTo56
SetSysClockTo72
SetSysClockToHSE
system_stm32f10x.h 源文件函数声明的头文件。
startup文件夹包含各个系列的发动代码,用户应该依据自己的芯片类型来挑选发动代码。
STM32F10x_StdPeriph_Driver
inc:头文件没什么好说的了,一个头文件对用一个源文件,包含函数,数据结构的的一些声明
src:这一层便是Device Peripheral Access Layer(DPAL)了,看看姓名就知道是关于哪个设备的,没什么
说的。仅有有一个破例便是misc.c文件,STM32 V3.5版别的库函数中没有本来版别中独自关于NVIC(中止向量嵌套)的外设驱动,
把NVIC的外设驱动放在了misc.c中,实际上是替代本来的stm32f10x_nvic.c.

3.5 版别的库文件中少了stm32f10x_it.c文件,需求自己增加。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/268354.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部