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

来源:互联网 发布:云计算安全关键技术 编辑:程序博客网 时间:2024/05/16 06:11
一、使用位定义的方法定义寄存器

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;  ...}











0 0
原创粉丝点击