C2000 launchpad 外设寄存器头文件 编程
TA的每日心情 | 无聊 2014-5-18 22:32 |
|---|
签到天数: 257 天 连续签到: 1 天 [LV.8]以坛为家I
版主
- 积分
- 2917


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