头文件由芯片的头文件和每个种类外设的头文件。
芯片头文件的文件名为“STM32F10X.h”。其中包含基本类型变量的定义和STM32F10X类的实现。
基本类型变量包含一些常用的整型变量:
typedef unsigned long UINT32;
typedef signed long INT32;
typedef unsigned short UINT16;
typedef signed short INT16;
typedef unsigned char UINT8;
typedef signed char INT8;
这些定义将作为基本变量取代2.0.3版中stm32f10x_type.h中的所有类型,另外stm32f10x_type.h中的FlagStatus,ITStatus,bool等enum变脸都以C++的内置类型bool代替,其中SET用true,RESET用false代替。依次以自己的习惯类推。
STM32F10X类使用了如下结构,目的是和C语言相似,以方便那些还看不惯的C++代码的人,看到struct而感到亲近。另外除他们的默认属性以外,struct和class实现一个类是完全一样的。struct默认声明为 public,而class默认为private。由于这是芯片级的类,我觉得设计为public应该要好一些。
struct STM32F10X
{
。。。。。。
};
类STM32F10X中的所有变量和方法都是静态的,因为这些方法只能生成一个1实例,就没有必要去生成实例。当然芯片本身就是“静态”的,不可能new一个STM32F10X类就在软件里虚拟一个STM32芯片了。
外设头文件包含芯片外设的寄存器定义和具体操作方法。这些外设的定义原则上是基于2.0.3版本不变。当然也有变动的,比如nvic文件夹,由原来的nvic和SCB两个struct变为nvic类。这样更改的目的是有助于一方面C++类的实现,另一方面在操作类方法时可以最大可能的和原来的C语言版本兼容(直接操作寄存器除外)。
要使用任意外设需要包含STM32F10X类和相应的外设类才能编译通过。
所谓单外设就是STM32F10X芯片中拥有这种外设的数量只有一个,比如RCC。这种外设的定义方法如下:
STM32_RCC &RCC = STM32F10X::RCC();
说明一下在原来定义RCC类是本来使用的是STM32F10X_RCC的,感觉为了定义类要写这么长很累,所以就写成STM32_RCC了。创建一个实例时都使用引用来初始化变量,它只RCC寄存器所在物理内存的别名。这很符合实际的物理意义。由于RCC()方法是一个静态方法,编译器会阻止使用new来实现一个RCC。
所谓多外设就是STM32F10X芯片中拥有这种外设的数量不止一个,不如GPIO。这种外设的定义方法如下:
STM32_GPIO &GPIOA = STM32F10X::GPIO(STM32F10X::GPIOA);
其中STM32F10X::GPIO(GPIOType type)方法中的GPIOType为enum类型,这样编译器会阻止这样的定义:
STM32_GPIO &GPIOA = STM32F10X::GPIO(0);
以整形代替GPIOType的错误。GPIOType是在STM32F10X中声明的enum类型,目的是为了说明这是STM32的GPIO,不是别的芯片的GPIO。
用户1535029 2013-7-23 16:29