在mdk下,sam4s头文件包的结构如下:
在SAM4S文件夹下,包含3个文件夹和8个头文件; 第一个文件夹component里面包含的是各片上外设模块的头文件,以结构体定义
第二个文件夹instance里面包含的同样是各片上外设模块的头文件,以宏定义直接指定寄存器地址
第三个文件夹pio是各型号芯片引脚的定义
外面的8个文件分为3组
第一组是各个型号芯片的一些定义,如中断向量,外设ID,各外设寄存器基地址,以及要包含文件头。 第二组是sam4s.h一个总的包含文件 第三组是系统时钟初始化的头文件。 使用头文件的方法: 使用与不使用sam4s.h,打开该文件,代码如下: #ifndef _SAM4S_ #define _SAM4S_ #if defined __SAM4S8A__ #include "sam4s8a.h" #elif defined __SAM4S8B__ #include "sam4s8b.h" #elif defined __SAM4S8C__ #include "sam4s8c.h" #elif defined __SAM4S16A__ #include "sam4s16a.h" #elif defined __SAM4S16B__ #include "sam4s16b.h" #elif defined __SAM4S16C__ #include "sam4s16c.h" #else #error Library does not support the specified device. #endif #endif /* _SAM4S_ */ 这里都是一些条件包含的语句,如果使用,这个文件,需要预习定义自己使用器件的符号,可以在编译器的预定义里面设置或修改文件;
或将文件修改为: #ifndef _SAM4S_ #define _SAM4S_ #define __SAM4S16C__ #if defined __SAM4S8A__ #include "sam4s8a.h" #elif defined __SAM4S8B__ #include "sam4s8b.h" #elif defined __SAM4S8C__ #include "sam4s8c.h" #elif defined __SAM4S16A__ #include "sam4s16a.h" #elif defined __SAM4S16B__ #include "sam4s16b.h" #elif defined __SAM4S16C__ #include "sam4s16c.h" #else #error Library does not support the specified device. #endif #endif /* _SAM4S_ */ 如果不使用该头文件,可以直接在模块中包含对应文件的头文件即可,比如 #include "sam4s8c.h" 使用结构与寄存器直接访问的选择 从前面的分析可以看出,即可以通过结构体的方式访问外设寄存器,也可以通过直接访问来来实现,下面分别举例说明: 访问PIOC端口设置输出寄存器,直接访问的方法如下: REG_PIOC_SODR=0xFF 在instance_pioc.h里有它宏定义
结构体的访问方法如下: PIOC->PIO_SODR=0xFF 在SAM4S16C.h(这里我使用的是SAM4S16C这个芯片,如果你的芯片不同,做相应的修改,见前面的说明),有PIOC的宏定义,在这里可以看出其是一个Pio常量类型的指针
可以在component_pio.h里找到Pio的定义: typedef struct { WoReg PIO_PER; /**< \brief (Pio Offset: 0x0000) PIOEnable Register */ WoReg PIO_PDR; /**< \brief (Pio Offset: 0x0004) PIODisable Register */ ........................................ ........................................ } Pio; 两种访问方法可以同时使用,也可以只使用一种。如果只使用其中一种,显然没必要包含这么多的头文件,鄙人是个追求简洁的人,选择使用结构体的方法来访问寄存器,同时也不使用SAM4S.h,而是直接使用更具体的SAM4S16C.h文件,这里需要对SAM4S16C.h文件做修改,就是把下面的内容都注释掉;这样做还有一个好处,官方的驱动包里面的函数一般也是结构体的方法,应该稍作修改就能使用.
然后把别的没用到的头文件都删除掉,最终的文件结构图如下: 注意:component文件夹不变
|