查看: 4442|回复: 2

mdk sam4s头文件包的结构的初步分析

[复制链接]
  • TA的每日心情
    无聊
    2014-12-25 15:47
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-1-11 19:59:09 | 显示全部楼层 |阅读模式
    分享到:
    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文件夹不变


    1.jpg
    2.jpg
    3.jpg
    4.jpg
    4.jpg
    6.jpg
    7.jpg
    8.jpg
    9.jpg
    10.jpg

    SAM4S MDK头文件初步分析.pdf

    1.63 MB, 下载次数: 58

    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2014-12-25 15:47
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-1-11 20:02:09 | 显示全部楼层
    自己顶一下,图片排版怎么全错了,到底该怎么排啊,是个问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-2-14 09:02
  • 签到天数: 656 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-1-11 20:25:50 | 显示全部楼层
    ldlylry 发表于 2013-1-11 20:02
    自己顶一下,图片排版怎么全错了,到底该怎么排啊,是个问题

    这里有对图片进行操作的教程
    https://www.cirmall.com/bbs/thread-4421-1-1.html
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-20 09:29 , Processed in 0.141931 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.