寄存器能够实现对系统和外设功能的配置与控制,接下来将以TMS320F2812的外设串行通信接口SCI为例,来介绍如何使用C语言的位定义和寄存器结构体的方式来实现对SCI寄存器的访问。(TMS320F2812有两个完全一样的SCI,分别是SCIA、SCIB)
使用位定义的方法定义寄存器
“位域”就是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个区域都有一个域名,允许在程序中按域名进行操作。位域的定义必须从右往左的顺序,即从低位开始定义;一个位域必须存储在同一个字节中,不能跨两个字节;可以有空域。位域在格式方面同结构体类似:
声明共同体
使用位定义的方法定义寄存器可以方便地实现对寄存器功能位进行操作,当要对整个寄存器进行操作时,位操作就表现得比较麻烦。为此,可以对寄存器进行共同体的定义,使用户可以自行根据需求选择对寄存器的位或者整体进行操作。
创建结构体文件
一个SCI模块有多个寄存器,为了便于管理,创建一个结构体,用来包含SCI模块的所有寄存器。
寄存器文件的空间分配
前面的工作是将寄存器按照C语言中位域定义和寄存器结构体的方式组织了数据结构,当编译时,编译器会将这些变量分配到存储空间中。接下来的工作是,讲这些代表寄存器数据的变量同实实在在的物理寄存器结合起来。分为两步:
第1步:使用DATA_SECTION的方法将寄存器文件分配到数据空间中的某个数据段
# pragma DATA_SECTION (symbol, "section name");
symbol是变量名,section name是数据段名
第2步:在CMD文件中,将数据段直接映射到这个外设寄存器所占的数据空间