使用C语言操作DSP的寄存器
2015-06-15 20:03
573 查看
一、使用位定义的方法定义寄存器
1. 位域的定义与位域变量的说明
说明:
1)位域的定义必须按从右向左的顺序,也就是说从最低位开始定义
2)一个位域必须存储在同一个字节中,不能跨两个字节。如果一个字节的剩余空间不够存放另一个位域时,
应该从另一个字节开始存放该域,如下例
3)位域的长度不能超过一个字节,也就是说一个位域不能超过8位
4)位域可以无位域名,这时,它只用作填充或者调整位置。无名的位域不能使用,如下例
用位域方式定义SCICCR
二、声明共同体
SCICCR的共同体定义
三、创建结构体文件
从表6-1可以看到SCIA模块有很多寄存器,因此需要创建一个结构体,用来包含SCI模块的所有寄存器
SCI寄存器的结构体文件
定义为union形式的成员既可以实现对寄存器整体的操作,也可以实现对寄存器位的操作
定义为Uint16形式的成员只能直接对寄存器进行操作
对SCICCR按位进行操作
四、寄存器文件的空间分配
1. 使用DATA_SECTION方法将寄存器文件分配到数据空间
编程方式如下:
2. 将数据段映射到寄存器对应的存储空间
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; ... }
相关文章推荐
- 位图加载
- C++11.1 章 泛型算法---能够作用在不同类型的容器和元素上的算法
- 《爱编程,爱c++-十七期-类》
- C/C++ 在程序里执行SQL脚本
- 擅长排列的小明(C++next_permutation)
- 【学习笔记】【C语言】函数
- 如何用C++与QT来写一个简单的程序
- c++ 生成DLL
- VC++2010断点无法设置问题
- C语言发发展历史
- C语言初学者编程规范十条
- (3)风色从零单排《C++ Primer》 重要的基本类型
- C and C++ Calling Convention
- VC++如何在程序中用代码注册和卸载ocx控件(代码)
- C++入门教程
- 重载重写重定义-易混淆概念-C++编译器处理方式
- 重载重写重定义-易混淆概念-C++编译器处理方式
- shared_ptr详解
- C++第6,7,8章
- 双缓存