|
一、概述
绝对地址定位,对于控制类(或叫嵌入式)编程人员来说,是必须使用的方法。不同的编译器有不同的定位方法。
相信控制类编程人员都使用过51机,一个较普遍的编译器Keil,它对绝对地址是这样操作的:
1、先定义地址:
#define MOSI P1_1 (P1_1已在头文件中定义了地址)
#define CLK P1_0
2、向绝对地址送数据:
……
MOSI=1;
这样就完成对绝对地址的操作。
一个用着非常好的编译器IAR,也是直接定义地址而后使用的:
1、定义地址:
#define USART1 ((USART_TypeDef *) USART1_BASE)
USART1_BASE是在其它地方已经定义了的绝对地址,USART_TypeDef是一个结构体,用于操作USART1_BASE基地址下的几个寄存器。
2、使用直接地址:
……
USART1->DR =0x5a;
在CCS中,当然也可以同以上方法使用,然而,TI不建议这样用,它评论使用#define宏的观点是:
优点:
--简单、快速、容易;
--变量名与寄存器名相匹配,容易记忆
缺点:
--位域不容易存取,必须使用位掩膜去操纵;
--在CCS的监视窗口中不容易看到位域;
--宏不能发挥CCS中的自动完成特性;
--宏在重复外设的重用上体现不出优势
TI的观点是对是错笔者评论不了。对直接地址的控制效率,不仅与编译器有关,也与CPU的结构有关。
二、位域和寄存器文件结构
CCS使用位域和寄存器文件来代替#define宏,实现对寄存器的操作的。
---寄存器文件结构:
寄存器文件是外设寄存器的集合,这些寄存器在C/C++中作为结构的成员互相成组,称作寄存器文件结构。这些寄存器文件结构在编译时,在存储器中直接对应于外设寄存器。在编译时,这种对应关系有利于CPU的数据指针对寄存器的操作。
--位域定义:
对于每一寄存器结构,位域可以分配一个名字和宽度,编译器可以单个控制寄存器内定义的位域。
下面将以SCI外设为例,说明寄存器文件结构。
例1,以#define宏定义的寄存器控制方法
#define SCICCRA (volatile Uint16 *)0x7050 // 0x7050 SCI-A 通讯控制寄存器
#define SCICTL1A (volatile Uint16 *)0x7051 // 0x7051 SCI-A 控制寄存器1
#define SCIHBAUDA (volatile Uint16 *)0x7052 // 0x7052 SCI-A 波特率寄存器,高位
#define SCILBAUDA (volatile Uint16 *)0x7053 // 0x7053 SCI-A 波特率寄存器,低位
#define SCICTL2A (volatile Uint16 *)0x7054 // 0x7054 SCI-A 控制寄存器2
#define SCIRXSTA (volatile Uint16 *)0x7055 // 0x7055 SCI-A 接收状态寄存器
#define SCIRXEMUA (volatile Uint16 *)0x7056 // 0x7056 SCI-A 接收数据仿真缓冲器
#define SCIRXBUFA (volatile Uint16 *)0x7057 // 0x7057 SCI-A 接收数据缓冲器
#define SCITXBUFA (volatile Uint16 *)0x7059 // 0x7059 SCI-A 发送数据缓冲器
#define SCIFFTXA (volatile Uint16 *)0x705A // 0x705A SCI-A 发送FIFO
#define SCIFFRXA (volatile Uint16 *)0x705B // 0x705B SCI-A 接收FIFO
#define SCIFFCTA (volatile Uint16 *)0x705C // 0x705C SCI-A 控制FIFO
#define SCIPRIA (volatile Uint16 *)0x705F // 0x705F SCI-A 优先控制
#define SCICCRB (volatile Uint16 *)0x7750 // 0x7750 SCI-B 通讯控制
#define SCICTL1B (volatile Uint16 *)0x7751 // 0x7751 SCI-B 控制寄存器1
#define SCIHBAUDB (volatile Uint16 *)0x7752 // 0x7752 SCI-B 波特率寄存器,高位
#define SCILBAUDB (volatile Uint16 *)0x7753 // 0x7753 SCI-B 波特率寄存器,低位
#define SCICTL2B (volatile Uint16 *)0x7754 // 0x7754 SCI-B 控制寄存器2
#define SCIRXSTB (volatile Uint16 *)0x7755 // 0x7755 SCI-B 接收状态寄存器
#define SCIRXEMUB (volatile Uint16 *)0x7756 // 0x7756 SCI-B 接收数据仿真缓冲器
#define SCIRXBUFB (volatile Uint16 *)0x7757 // 0x7757 SCI-B 接收数据缓冲器
#define SCITXBUFB (volatile Uint16 *)0x7759 // 0x7759 SCI-B 发送数据缓冲器
#define SCIFFTXB (volatile Uint16 *)0x775A // 0x775A SCI-B 发送FIFO
#define SCIFFRXB (volatile Uint16 *)0x775B // 0x775B SCI-B 接收FIFO
#define SCIFFCTB (volatile Uint16 *)0x775C // 0x775C SCI-B 控制FIFO
#define SCIPRIB (volatile Uint16 *)0x775F // 0x775F SCI-B优先控制
|
|