大家好,又见面了,我是你们的朋友全栈君。
目录
本节内容看懂之后主要是头文件程序的解析。
1 c语言与汇编语言器
一些对时间要求特别高的时候需要嵌入一些汇编语言,其他时候使用c语言通过位定义和寄存器结构体的方式来实现对dsp寄存器进行访问和控制。
2 配置SCI寄存器
2.1 了解SCI寄存器
前面我们讲过2812有两个SCI寄存器(SCIA和SCIB),可以做成两个串口(2RS232/2RS484/RS232+RS485)
- 首先我们查看寄存器的寄存器文件
以SCIA为例,第一列表示他有13个寄存器可以操作,并且都以SCI开头进行命名;第二列表示地址,即该寄存器所在的位置;后面的占用空间表示这个地址内的数据宽度,通过更改这些寄存器的数据就可以改变相应寄存器的功能。注意寄存器地址非连续,有缺失值。
2.2 使用位定义的方法定义寄存器
2.2.1 位域
定义:一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。
语法结构如下所示
注意:语法最后有分号。
注意:
1 位域声明顺序从右到左
2 位域的定义不能横跨字节
若例6-1,中a长度为5,b为3,则定义错误,在此情况下b要横跨两个字节
3 位域不能大于8个字节,否则与前面第二条冲突
4 可以没有域名,此时的作用是调整字节的顺序。如下所示
注意:保留位也需要定义。
具体位域分区如下所述:
2.2.2 声明共同体
作用:有时候需要对整个寄存器进行操作,这时通过声明共同体来进行操作;既可以对整体进行操作,也可以按位进行操作。
定义:
结构体和共同体的区别:
结构体分配空间按所有成员占据的总和来分配;
共同体的空间是共用的,如例6-3中:unit16与bit共用的是一段空间,在一个时间只有一个共同体使用。
2.2.3 结构体
SCI中包含了很多寄存器,为了方便管理,在dsp中通过结构体的方法来实现。
注意:
结构体当中有很多union共同体,既可以整体对寄存器进行操作,也可以对寄存器进行位操作;但unit16类型的只能进行寄存器操作。
保留项也被定义了,用rsvd代替,但没有用处。
在定义结构体之后,需要声明SciaRegs和ScibRegs,表示scia与scib寄存器;关键字extern代表全局变量;volatile表示寄存器的值易变,可以被外部硬件和外部代码改变,但如果没有这个关键字,则该寄存器的值只能被程序代码改变。
函数调用:
代码分析:
SciaRegs.SCICCR.bit.STOPBITS
首先SciaRegs.SCICCR这一段代码是结构体定义的,
找SCICCR的声明
下一位SciaRegs.SCICCR.bit,从函数声明处得知函数原来应该是SCICCR_REG,在共同体中存在的下一位bit,他是位域定义,找他的声明处
顺藤摸瓜也就找到了SciaRegs.SCICCR.bit.STOPBITS寄存器
union共同体,既可以整体对寄存器进行操作(.all),也可以对寄存器进行位操作(.bit);但unit16类型的只能进行寄存器操作,如下所示:
2.2.4 查看寄存器的值
2.3 寄存器文件空间分配
why:代表寄存器的变量如何与物理寄存器结合起来的?
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143951.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...