使用C语言操作SCI寄存器与CMD文件的编写_第1页
使用C语言操作SCI寄存器与CMD文件的编写_第2页
使用C语言操作SCI寄存器与CMD文件的编写_第3页
使用C语言操作SCI寄存器与CMD文件的编写_第4页
使用C语言操作SCI寄存器与CMD文件的编写_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、使用C语言操作SCI寄存器与CMD文件的编写 姓名: 金鸽 专业:电子与通信工程 学号:201422172172 导师: 齐林 1 寄存器的C语言访问 DSP的寄存器能够实现对系统和外设功能的配置和控制,因此在DSP的开发过程中,对于寄存器的操作是极为重要的,也是很频繁的,也就是说对寄存器的操作是否方便会直接影响到DSP的开发是否方便。F2812为大家提供了位定义和寄存器结构体的方式,能够很方便地实现对DSP内部急促你的访问和控制。2 SCI寄存器 F2812的SCI模块具有相同的串行通信接口SCIA和SCIB,也就是说体现到硬件上的话,F2812支持两个串口。SCIA和SCIB就像双胞胎一样

2、,具有相同的寄存器文件,如下表所示为SCIA寄存器。从表中可看到,外设SCIA的每一个寄存器都占据1字节,即16位宽度。从其地址分布来看,SCIA的寄存器地址0x00007050到0x0000705F,中间缺少了0x00007058,0x0000705D,0x0000705E.上表中列出的寄存器位于F2812存储器空间的外设帧2内,是在物理上实实在在存在的存储器单元上。实际上,这些寄存器就是定义了具体功能的存储器单元,系统会根据这些存储单元中具体的配置来进行工作。3 使用位域定义的方法定义寄存器 位域,就是把一个字节中得二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允

3、许在程序中按域名进行操作。位域的定义与位域变量的说明同结构体定义何其成员说明类似,其语法格式为:Struct位域结构名类型说明符 位域名1:位域长度类型说明符 位域名1:位域长度.类型说明符 位域名1:位域长度;其中,类型说明符就是基本的数据类型,可以是int、char型等。位域名可以任意取,能够反映其位域的功能就好,位域长度是指这个位域是由多少个位组成的。说明:      1)位域的定义必须按从右向左的顺序,也就是说从最低位开始 定义。      2)一个位域必须存储在同一个字节中,不能跨两个字节。如果一个字节的剩余空间不够存放另一

4、个位域时, 应该从另一个字节开始存放该域,如下例。      3)位域的长度不能超过一个字节,也就是说一个位域不能超过8位。      4)位域可以无位域名,这时,它只用作填充或者调整位置。无名的位域不能使用,如下例。cpp view plaincopy1. Struct bs  2.   3.  int a: 4;  4.  int : 0;   /

5、60;空域  5.  int b: 5;  / 从下一个字节开始存放该域  6.  int c: 3;  7. ;  8.   9. Struct bs  10.   11.  int a: 5;  12.  int : 3;   / 无名

6、的位域无法使用  13.  int b: 6;     14.  int c: 2;  15. ;  而通信控制寄存器SCICCR的具体定义为:SCIA模块所有的寄存器都是8位的,当一个寄存器被访问时,寄存器数据位于低8位,高8位为0.SCICCR的D0D2为字符长度控制位SCICHAR,占据了3位。D3为SCI多处理器模式控制位ADDRIDL_MODE,占据1位。D4为SCI回送从测试模式使能位LOOP_BKENA,占据1位

7、。D5为SCI极性使能位PARITYENA,占据1位。D6为SCI奇偶极性使能位PARITY,占据1位。D7位SCI结束位的个数STOPBITS,也占据1位。D8D15为保留,共8位。下面就是用位于方式定义SCICCR。cpp view plaincopy1. Struct SCICCR_BITS  2.   3.   Uint16  SCICHAR:  3;         /

8、0; 2 : 0      字符长度控制位     4.   Uint16  ADDRIDLE_MODE:  1;   /  3          多处理器模式控制位  5.   Uint16 

9、60;LOOPBACKENA:  1;     /  4          回送测试模式使能位  6.   Uint16  PARITYENA:  1;       /  5     

10、60;    极性使能位  7.   Uint16  PARITY:  1;          /  6          奇偶极性选择位  8.   Uint16  STOPBITS: &

11、#160;1;        /  7          停止位个数  9.   Uint16  rsvd1:  8;           /  15:8   

12、    保留位  10. ;  11.   12. struct SCICCR_BITS bit;          13. bit.SCICHAR = 7;               / 

13、0;设置SCICHAR为111  4 声明共同体使用位定义的方法定义寄存器可以方便地实现对寄存器功能位进行操作,但是有时候如果需要对整个寄存器进行操作,那么位操作是不是就显得有些麻烦了呢,所以很有必要引入能够对寄存器整体进行操作的方式,想要进行位操作的时候就用位操作的方式。SCICCR的共同体定义:cpp view plaincopy1. union SCICCR_REG  2.   3.   Uint16 all;  4.   struct&#

14、160;SCICCR_BITS bit;  5. ;  6.   7. union SCICCR_REG SCICCR;  8. SCICCR.all = 0x007F;  9. SCICCR.bit.SCICHAR = 5;  5 创建结构体文件 有上面的表可以看到SCIA模块有很多寄存器,因此需要创建一个结构体,用来包含SCI模块的所有寄存器。SCI寄存器的结构体文件cpp view plai

15、ncopystruct SCI_REGS      union SCICCR_REG    SCICCR;    union SCICTL1_REG   SCICTL1;    Uint16              S

16、CIHBAUD;    Uint16              SCILBAUD;  1.   union SCICTL2_REG   SCICTL2;  2.   union SCIRXST_REG   SCIRXST;  3. 

17、0; Uint16              SCIRXEMU;  4.   union SCIRXBUF_REG  SCIRXBUF;  5.   Uint16 rsvd1;  6.   Uint16       &#

18、160;      SCITXBUF;  7.   union SCIFFTX_REG   SCIFFTX;  8.   union SCIFFRX_REG   SCIFFRX;  9.   union SCIFFCT_REG   SCIFFCT;  10.  

19、0;Uint16 rsvd2;  11.   Uint16 rsvd3;  12.   union SCIPRI_REG    SCIPRI;  13. ;  14.   15. extern volatile struct SCI_REGS SciaRegs;  16. extern volatile st

20、ruct SCI_REGS ScibRegs;  定义为union形式的成员既可以实现对寄存器整体的操作,也可以实现对寄存器位的操作。定义为Uint16形式的成员只能直接对寄存器进行操作对SCICCR按位进行操作cpp view plaincopySciaRegs.SCICCR.bit.STOPBITS = 0;  SciaRegs.SCICCR.bit.PARITYENA = 0;  SciaRegs.SCICCR.bit.LOOPBKENA =

21、0;0;  SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0;  SciaRegs.SCICCR.bit.SCICHAR = 7;  对SCICCR整体进行操作cpp view plaincopySciaRegs.SCICCR.all = 0x0007;  对SCIHBAUD和SCILBAUD进行操作cpp view plaincopySciaRegs.SCIHBAUD = 0; 

22、 SciaRegs.SCILBAUD = 0xF3;  6 寄存器文件的空间分配(CMD文件的产生) 值得注意的是,之前所做的工作只是将F2812的寄存器按照C语言中位域定义和寄存器结构体的方式组织了数据结构,当编译时,编译器会把这些变量分配到存储空间中,但是很显然还有一个问题需要解决,就是如何将这些代表寄存器数据的变量同实实在在的物理寄存器结合起来。 这个工作需要两步来完成:第一步使用DATA_SECTION的方法将寄存器文件分配到数据空间中得某个数据段;第二步在CMD文件中,将这个数据段直接映射到这个外设寄存器所占的存储空间。通过这两部,就

23、可以将寄存器文件同物理寄存器相结合起来了。1. 使用DATA_SECTION方法将寄存器文件分配到数据空间编程方式如下:cpp view plaincopy# pragma DATA_SECTION(symbol, "symbol name");      将变量分配到数据段cpp view plaincopy# pragma DATA_SECTION(SciaRegs, "SciaRegsFile");  volatile struct SCI_REGS SciaRegsFile;   # pragma DATA_SECTION(ScibRegs, "ScibRegsFile");  volatile struct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论