您的位置:首页 > 编程语言 > C语言/C++

使用C语言操作DSP的寄存器

2015-06-15 20:03 573 查看
一、使用位定义的方法定义寄存器
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;
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: