STM32外设库文件分析(V3.5)
被大括号包含的指令或一对空括号.术语“__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 ((uint
STM32外设库文件V3 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)