查看: 5716|回复: 0

C2000 launchpad 外设寄存器头文件 编程

[复制链接]
  • TA的每日心情
    无聊
    2014-5-18 22:32
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-12-30 09:14:45 | 显示全部楼层 |阅读模式
    分享到:
    C 语言编程的传统方法
    #define ADCTRL1 (volatile unsigned int *)0x00007100
    ...
    void main(void)
    {
       *ADCTRL1 = 0x1234;    //write entire register
       *ADCTRL1 |= 0x4000;  //enable ADC module
    }

    优势
    -  简单、快速且易于键入
    -  变量名称与寄存器名称精确匹配 (易于记忆)
    劣势  
    -  需要生成专门的掩码以操控个别位
    -  不能很容易地在观察窗口中显示位字段
    -  在许多场合中将生成效率低下的代码


    在F2807中,C 语言编程采用结构体的方法
    void main(void)
    {
       AdcRegs.ADCTRL1.all = 0x1234;  //write entire register
       AdcRegs.ADCTRL1.bit.ADCENABLE = 1;  //enable ADC module
    }


    typedef struct _GPIO_Obj_
    {
        volatile uint32_t GPACTRL;         //!< GPIO A Control Register
        volatile uint32_t GPAQSEL1;        //!< GPIO A Qualifier Select 1 Register
        volatile uint32_t GPAQSEL2;        //!< GPIO A Qualifier Select 2 Register
        volatile uint32_t GPAMUX1;         //!< GPIO A MUX 1 Register
        volatile uint32_t GPAMUX2;         //!< GPIO A MUX 2 Register
        volatile uint32_t GPADIR;          //!< GPIO A Direction Register
        volatile uint32_t GPAPUD;          //!< GPIO A Pull Up Disable Register
        volatile uint16_t rsvd_1[2];       //!< Reserved
        volatile uint32_t GPBCTRL;         //!< GPIO B Control Register
        volatile uint32_t GPBQSEL1;        //!< GPIO B Qualifier Select 1 Register
        volatile uint16_t rsvd_2[2];       //!< Reserved
        volatile uint32_t GPBMUX1;         //!< GPIO B MUX 1 Register
        volatile uint16_t rsvd_3[2];       //!< Reserved
        volatile uint32_t GPBDIR;          //!< GPIO B Direction Register
        volatile uint32_t GPBPUD;          //!< GPIO B Pull Up Disable Register
        volatile uint16_t rsvd_4[24];      //!< Reserved
        volatile uint32_t AIOMUX1;         //!< Analog, I/O Mux 1 Register
        volatile uint16_t rsvd_5[2];       //!< Reserved
        volatile uint32_t AIODIR;          //!< Analog, I/O Direction Register
        volatile uint16_t rsvd_6[4];       //!< Reserved
        volatile uint32_t GPADAT;          //!< GPIO A Data Register
        volatile uint32_t GPASET;          //!< GPIO A Set Register
        volatile uint32_t GPACLEAR;        //!< GPIO A Clear Register
        volatile uint32_t GPATOGGLE;       //!< GPIO A Toggle Register
        volatile uint32_t GPBDAT;          //!< GPIO B Data Register
        volatile uint32_t GPBSET;          //!< GPIO B Set Register
        volatile uint32_t GPBCLEAR;        //!< GPIO B Clear Register
        volatile uint32_t GPBTOGGLE;       //!< GPIO B Toggle Register
        volatile uint16_t rsvd_7[8];       //!< Reserved
        volatile uint32_t AIODAT;          //!< Analog I/O Data Register
        volatile uint32_t AIOSET;          //!< Analog I/O Data Set Register
        volatile uint32_t AIOCLEAR;        //!< Analog I/O Clear Register
        volatile uint32_t AIOTOGGLE;       //!< Analog I/O Toggle Register
        volatile uint16_t GPIOXINTnSEL[3]; //!< XINT1-3 Source Select Registers
        volatile uint16_t rsvd_8[5];       //!< Reserved
        volatile uint32_t GPIOLPMSEL;      //!< GPIO Low Power Mode Wakeup Select Register
    } GPIO_Obj;


    优势  
    -  易于操控个别位。
    -  易于在调试窗口观察寄存器位的值
    -  可生成最高效的代码  (利用 C28x)

    劣势  
    -  结构名称会难以记忆  (编辑器自动完成功能实施挽救)
    -  需要键入的内容更多 (同样,编辑器自动完成功能实施挽
    救)

    结构体定义规则
    F2802x 头文件定义了:
     所有的外设结构体
     所有的寄存器名称
     所有的位字段名称
     所有的寄存器地址
    PeripheralName.RegisterName.all  // 访问整个 16 位或 32 位寄存器
    PeripheralName.RegisterName.half.LSW  // 访问 32 位寄存器的 16 个低位
    PeripheralName.RegisterName.half.MSW  // 访问 32 位寄存器的 16 个高位
    PeripheralName.RegisterName.bit.FieldName  // 访问寄存器的指定位字段
    注:    [1] “PeripheralName” 由 TI 指定并载于 F2802x 标头文件。
    它们由大写字母和小写字母组合而成  (如:CpuTimer0Regs)。
    [2] “RegisterName” 与数据表中使用的名称相同。
    它们始终用大写字母表示  (如:TCR、TIM、TPR,... )
    [3] “FieldName”与数据表中使用的名称相同。
    它们始终用大写字母表示  (如:POL、TOG、TSS,...)

    F2802x 头文件包
     包含了使用结构体法所需的一切资源
     定义了所有的外设寄存器位和寄存器地址
    头文件包包括:
     \DSP2802x_headers\include   .h files
     \DSP2802x_headers\cmd       linker .cmd files
     \DSP2802x_headers\gel          .gel files for CCS
     \DSP2802x_examples            „2802x examples
     \doc                                        documentation

    外设结构 体头(.h)文件
     包含每个外设寄存器的位字段结构体定义
    C 语言源文件 (例如:Adc.c)
    #include “DSP2802x_Device.h”
    Void InitAdc(void)
    {
        /* Reset the ADC module */
         AdcRegs.ADCTRL1.bit.RESET = 1;
        /* configure the ADC register */
         AdcRegs.ADCTRL1.all = 0x00E4;
    };

    DSP2802x_Adc.h
    // ADC Individual Register Bit Definitions:
    struct ADCCTL1_BITS { // bits description
    Uint16 TEMPCONV:1; // 0 Temperature sensor connection
    Uint16 VREFLOCONV:1; // 1 VSSA connection
    Uint16 INTPULSEPOS:1; // 2 INT pulse generation control
    Uint16 ADCREFSEL:1; // 3 Internal/external reference select
    Uint16 rsvd1:1; // 4 reserved
    Uint16 ADCREFPWD:1; // 5 Reference buffers powerdown
    Uint16 ADCBGPWD:1; // 6 ADC bandgap powerdown
    Uint16 ADCPWDN:1; // 7 ADC powerdown
    Uint16 ADCBSYCHN:5; // 12:8 ADC busy on a channel
    Uint16 ADCBSY:1; // 13 ADC busy signal
    Uint16 ADCENABLE:1; // 14 ADC enable
    Uint16 RESET:1; // 15 ADC master reset
    };
    // Allow access to the bit fields or entire register:
    union ADCCTL1_REG {
    Uint16 all;
    struct ADCCTL1_BITS bit;
    };
    // ADC External References & Function Declarations:
    extern volatile struct ADC_REGS AdcRegs;


    具体请看C2000入门培训PDF ,下载地址:
    http://pan.baidu.com/share/link?shareid=175952&uk=168446269
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-5 03:21 , Processed in 0.121860 second(s), 15 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.