小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))1c语言与汇编语言器一些对时间要求特别高的时候需要嵌入一些汇编语言,其他时候使用c语言通过位定义和寄存器结构体的方式来实现对dsp寄存器进行访问和控制。2配置SCI寄存器2.1了解SCI寄存器前面我们讲过2812有两个SCI寄存器(SCIA和SCIB),可以做成两个串口(2RS232/2RS484/RS232+RS485)首先我们查看寄存器的寄存器文件以SCIA为例,第一列表示他有13个寄存器可以操作,并且都以SCI开头进行命名;第二列表示地址,即该寄存器所在的位置;后面

大家好,又见面了,我是你们的朋友全栈君。

目录

 

1 c语言与汇编语言器

2 配置SCI寄存器

2.1 了解SCI寄存器

2.2 使用位定义的方法定义寄存器

2.2.1 位域

2.2.2 声明共同体

2.2.3 结构体

2.2.4 查看寄存器的值

2.3 寄存器文件空间分配


本节内容看懂之后主要是头文件程序的解析。

 

1 c语言与汇编语言器

一些对时间要求特别高的时候需要嵌入一些汇编语言,其他时候使用c语言通过位定义和寄存器结构体的方式来实现对dsp寄存器进行访问和控制。

2 配置SCI寄存器

2.1 了解SCI寄存器

前面我们讲过2812有两个SCI寄存器(SCIA和SCIB),可以做成两个串口(2RS232/2RS484/RS232+RS485)

  • 首先我们查看寄存器的寄存器文件

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

以SCIA为例,第一列表示他有13个寄存器可以操作,并且都以SCI开头进行命名;第二列表示地址,即该寄存器所在的位置;后面的占用空间表示这个地址内的数据宽度,通过更改这些寄存器的数据就可以改变相应寄存器的功能。注意寄存器地址非连续,有缺失值。

2.2 使用位定义的方法定义寄存器

2.2.1 位域

定义:一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。

语法结构如下所示

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

注意:语法最后有分号。

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

注意:

1 位域声明顺序从右到左

2 位域的定义不能横跨字节

若例6-1,中a长度为5,b为3,则定义错误,在此情况下b要横跨两个字节

3 位域不能大于8个字节,否则与前面第二条冲突

4 可以没有域名,此时的作用是调整字节的顺序。如下所示

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

注意:保留位也需要定义。

具体位域分区如下所述:

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

2.2.2 声明共同体

作用:有时候需要对整个寄存器进行操作,这时通过声明共同体来进行操作;既可以对整体进行操作,也可以按位进行操作。

定义:

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

结构体和共同体的区别:

结构体分配空间按所有成员占据的总和来分配;

共同体的空间是共用的,如例6-3中:unit16与bit共用的是一段空间,在一个时间只有一个共同体使用。

2.2.3 结构体

SCI中包含了很多寄存器,为了方便管理,在dsp中通过结构体的方法来实现。

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

注意:

结构体当中有很多union共同体,既可以整体对寄存器进行操作,也可以对寄存器进行位操作;但unit16类型的只能进行寄存器操作。

保留项也被定义了,用rsvd代替,但没有用处。

在定义结构体之后,需要声明SciaRegsScibRegs,表示scia与scib寄存器;关键字extern代表全局变量;volatile表示寄存器的值易变,可以被外部硬件和外部代码改变,但如果没有这个关键字,则该寄存器的值只能被程序代码改变。

函数调用:

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

代码分析:

SciaRegs.SCICCR.bit.STOPBITS

首先SciaRegs.SCICCR这一段代码是结构体定义的,

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

找SCICCR的声明

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

下一位SciaRegs.SCICCR.bit,从函数声明处得知函数原来应该是SCICCR_REG,在共同体中存在的下一位bit,他是位域定义,找他的声明处

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

顺藤摸瓜也就找到了SciaRegs.SCICCR.bit.STOPBITS寄存器

union共同体,既可以整体对寄存器进行操作(.all),也可以对寄存器进行位操作(.bit);但unit16类型的只能进行寄存器操作,如下所示:

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

2.2.4 查看寄存器的值

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

2.3 寄存器文件空间分配

why:代表寄存器的变量如何与物理寄存器结合起来的?

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 使用c语言操作dsp寄存器(以SCI为例进行说明))

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143951.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • YGC和FGC是什么「建议收藏」

    YGC和FGC是什么「建议收藏」1.YGC和FGC是什么YGC:对新生代堆进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。FGC:全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次。2.什么时候执行YGC和FGCedn空间不足,执行younggcb.old空间不足,…

    2022年6月19日
    41
  • java嵌套条件运算符_java条件运算符的嵌套使用「建议收藏」

    java嵌套条件运算符_java条件运算符的嵌套使用「建议收藏」对于java条件运算符的嵌套使用你熟悉吗?下面要给大家带来的就是和这方面有关的编程题,一起来了解一下。一、题目学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示注:利用条件运算符的嵌套来完成这道题目二、思路(a>b)?a:b这是条件运算符的基本例子三、代码实现publicclassProg5{publicstaticvoidmain(Strin…

    2022年9月28日
    0
  • 使用 memory_limit 限制 PHP 进程的内存使用「建议收藏」

    使用 memory_limit 限制 PHP 进程的内存使用

    2022年2月15日
    41
  • 安卓中listview的使用步骤_安卓listview控件的用法

    安卓中listview的使用步骤_安卓listview控件的用法1)排序ListView通过适配器得到内容数据,可以对数据list先排序再提供给ListView:privateList>getData(){List>list=newArrayList>();//addData…//对list进行排序if(!list.isEmpty()){Collections.sort(list,newComparator&g…

    2022年9月28日
    0
  • java有全局变量吗_java局部变量和成员变量的区别

    java有全局变量吗_java局部变量和成员变量的区别//    java全局变量危害 //    最近为了图快捷,使用了全局变量,然后就想到了一些危害//  1.线程不安全:线程中多个全局变量,修改容易冲突,需要加锁//  2.增加耦合性:修改全局变量可能会影响其他模块//  3.难以定位修改:难以定位全局变量在哪里被修改了,加大了调用难度//  4.长期占用内存:生命

    2022年8月21日
    4
  • Android布局详解

    Android布局详解Android六大基本布局分别是:线性布局LinearLayout、相对布局RelativeLayout、帧布局FrameLayout、表格布局TableLayout、网格布局GridLayout。其中,表格布局是线性布局的子类。网格布局是android4.0后新增的布局。普通视图还是布局都继承自View,其中ViewGroup就是所有布局的父类,ViewGroup继承自View…

    2022年6月2日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号