DSP

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

2019-07-13 11:22发布

一、使用位定义的方法定义寄存器 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; ... }