回答

收藏

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

FPGA/DSP FPGA/DSP 6401 人阅读 | 0 人回复 | 2012-12-30

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
这个世界成功人的总是少数,我们都只是平凡的人,我们需要有一种平凡且进取的心态去生活,不要期望有多少付出就一定有多少回报,相信没有付出就没有回报就可以了。
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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