一、使用位定义的方法定义寄存器
1. 位域的定义与位域变量的说明
Struct 位域结构名
{
类型说明符 位域名1: 位域长度;
类型说明符 位域名2: 位域长度;
.......
类型说明符 位域名n: 位域长度;
};
说明:
1)位域的定义必须按从右向左的顺序,也就是说从最低位开始定义
2)一个位域必须存储在同一个字节中,不能跨两个字节。如果一个字节的剩余空间不够存放另一个位域时,
应该从另一个字节开始存放该域,如下例
3)位域的长度不能超过一个字节,也就是说一个位域不能超过8位
4)位域可以无位域名,这时,它只用作填充或者调整位置。无名的位域不能使用,如下例
Struct bs
{
int a: 4;
int : 0; // 空域
int b: 5; // 从下一个字节开始存放该域
int c: 3;
};
Struct bs
{
int a: 5;
int : 3; // 无名的位域无法使用
int b: 6;
int c: 2;
};
用位域方式定义SCICCR
Struct SCICCR_BITS
{
Uint16 SCICHAR: 3; // 2 : 0 字符长度控制位
Uint16 ADDRIDLE_MODE: 1; // 3 多处理器模式控制位
Uint16 LOOPBACKENA: 1; // 4 回送测试模式使能位
Uint16 PARITYENA: 1; // 5 极性使能位
Uint16 PARITY: 1; // 6 奇偶极性选择位
Uint16 STOPBITS: 1; // 7 停止位个数
Uint16 rsvd1: 8; // 15:8 保留位
};
struct SCICCR_BITS bit;
bit.SCICHAR = 7; // 设置SCICHAR为111
二、声明共同体
SCICCR的共同体定义
union SCICCR_REG
{
Uint16 all;
struct SCICCR_BITS bit;
};
union SCICCR_REG SCICCR;
SCICCR.all = 0x007F;
SCICCR.bit.SCICHAR = 5;
三、创建结构体文件
从表6-1可以看到SCIA模块有很多寄存器,因此需要创建一个结构体,用来包含SCI模块的所有寄存器
SCI寄存器的结构体文件struct SCI_REGS
{
union SCICCR_REG SCICCR;
union SCICTL1_REG SCICTL1;
Uint16 SCIHBAUD;
Uint16 SCILBAUD;
union SCICTL2_REG SCICTL2;
union SCIRXST_REG SCIRXST;
Uint16 SCIRXEMU;
union SCIRXBUF_REG SCIRXBUF;
Uint16 rsvd1;
Uint16 SCITXBUF;
union SCIFFTX_REG SCIFFTX;
union SCIFFRX_REG SCIFFRX;
union SCIFFCT_REG SCIFFCT;
Uint16 rsvd2;
Uint16 rsvd3;
union SCIPRI_REG SCIPRI;
};
extern volatile struct SCI_REGS SciaRegs;
extern volatile struct SCI_REGS ScibRegs;
定义为union形式的成员既可以实现对寄存器整体的操作,也可以实现对寄存器位的操作
定义为Uint16形式的成员只能直接对寄存器进行操作
对SCICCR按位进行操作
SciaRegs.SCICCR.bit.STOPBITS = 0;
SciaRegs.SCICCR.bit.PARITYENA = 0;
SciaRegs.SCICCR.bit.LOOPBKENA = 0;
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0;
SciaRegs.SCICCR.bit.SCICHAR = 7;
对SCICCR整体进行操作
SciaRegs.SCICCR.all = 0x0007;
对SCIHBAUD和SCILBAUD进行操作
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = 0xF3;
四、寄存器文件的空间分配
1. 使用DATA_SECTION方法将寄存器文件分配到数据空间
编程方式如下:
# pragma DATA_SECTION(symbol, "symbol name");
将变量分配到数据段# pragma DATA_SECTION(SciaRegs, "SciaRegsFile");
volatile struct SCI_REGS SciaRegsFile;
# pragma DATA_SECTION(ScibRegs, "ScibRegsFile");
volatile struct SCI_REGS ScibRegsFile;
2. 将数据段映射到寄存器对应的存储空间
MEMORY
{
...
PAGE1:
SCI_A : origin = 0x007050,length = 0x00010;
SCI_B : origin = 0x007750,length = 0x00010;
...
}
SECTIONS
{
...
SciaRegsFile :> SCI_A, PAGE = 1;
ScibRegsFile :> SCI_B, PAGE = 1;
...
}