CCS开发环境已经为我们封装好了很多片内外设寄存器的结构体,我们仅仅须要包括对应的官方的头文件就能够使用了,那么它的内部详细是怎样实现的呢?

以下来一个典型的样例:

1.使用结构体和联合体

A.用struct定义位域的作用:

DSP2833x_Sci.h中有一段:

struct  SCICCR_BITS {        // bit    description
Uint16 SCICHAR:3; // 2:0 Character length control
Uint16 ADDRIDLE_MODE:1; // 3 ADDR/IDLE Mode control
Uint16 LOOPBKENA:1; // 4 Loop Back enable
Uint16 PARITYENA:1; // 5 Parity enable
Uint16 PARITY:1; // 6 Even or Odd Parity
Uint16 STOPBITS:1; // 7 Number of Stop Bits
Uint16 rsvd1:8; // 15:8 reserved 保留
}; union SCICCR_REG {
Uint16 all;
struct SCICCR_BITS bit;
};

Uint16 SCICHAR:3 表示定义SCICHAR,它占一个字节中的3位;

注意:必须以4字节对齐!观察上面的SCICCR_BITS的定义也会发现前面定义了3+1+1+1+1+1=8位=1字节

假设出现一项占5位呢?如:

Uint16 SCICHAR1:4
Uint16 SCICHAR2:5

显然不能像上面这样写,应该写成:

Uint16 SCICHAR1:4
Uint16 NULL :0 //这种话,以下的变量就会从第二个字节開始存放
Uint16 SCICHAR2:5

B.再来看union的作用

union SCICCR_REG{
Uint16 all;
struct SCICCR_BITS bit;
}

这样定义有什么效果?

当我想操作SCICCR_BITS中的每一位时,仅仅需定义union SCICCR_REG reg就可以

我们能够总体操作,如:reg.all = 0x0011;

我们能够操作当中一位:reg.bit.PARITY = 0;

还记得c语言中union中的共享同一个内存空间地址么?

2.使用cmd文件进行数据段与存储器空间映射

既然官方已经帮我们做好了上面的一切,上面的东西肯定能够直接使用,那么为什么能够直接使用呢?

定义一个上面的变量就能够訪问到真正硬件上的寄存器了吗?肯定不行!

我们须要将上面的变量和实际硬件的寄存器存储空间绑定,怎么绑定,通过cmd文件。

以下是官方DSP2833x_GlobalVariableDefs.c中的一段代码:

//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("ScicRegsFile")
#else
#pragma DATA_SECTION(ScicRegs,"ScicRegsFile");
#endif
volatile struct SCI_REGS ScicRegs;

官方定义了ScicRegs来操作串口SCI-C的相关的寄存器,可是肯定没法直接使用,还没有做绑定;

使用#pragma DATA_SECTION能够将变量与数据段绑定,变量和数据段是自定义的,仅仅须要将他们绑定就可以;

这样绑定显然还不行,还须要通过cmd文件数据段映射到硬件的寄存器地址空间中去!

查看DSP2833x_Headers_nonBIOS.cmd文件我们发现当中有这样几行:

MEMORY
{
PAGE 0: /* Program Memory */ PAGE 1: /* Data Memory */ ADC : origin = 0x007100, length = 0x000020 /* ADC registers */
SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */
SCIC : origin = 0x007770, length = 0x000010 /* SCI-C registers */
I2CA : origin = 0x007900, length = 0x000040 /* I2C-A registers */
} SECTIONS
{
AdcRegsFile : > ADC, PAGE = 1
ScibRegsFile : > SCIB, PAGE = 1
ScicRegsFile : > SCIC, PAGE = 1
I2caRegsFile : > I2CA, PAGE = 1
}

MEMORY代表内存空间,PAGE0是程序空间, PAGE1是数据空间;

(还记得第一课的介绍么?28335採样的哈佛总线结构,程序与数据分开了~)

SECTIONS代表须要映射的段;

通过上面的映射后,操作ScicRegs就能够实际操作串口了,目的也就达到了;

TMS320F28335项目开发记录5_28335之CCS编程基础的更多相关文章

  1. TMS320F28335项目开发记录1_CCS的使用介绍

    CCS使用介绍 一.前言 本系列文章记录本人实际项目开发时对ti的DSP28335,以及CCS开发环境等的学习与记录,相对于2812来说,28335的资料还是比較少的,只是原理是相通的,28335说白 ...

  2. TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总

    CCS与仿真器连接问题 实际使用过程中.仿真器和CCS连接可能出现这样或那样的问题,或许你的连接非常成功,没碰到过什么问题.但我的问题的确不少,可能与电脑配置有关吧,也可能与人品有关吧. 以下的自己的 ...

  3. TMS320F28335项目开发记录6_28335之cmd文件具体解释

    1.CMD文件的作用 CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间. 2.C语言生成的段 C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据 ...

  4. TMS320F28335项目开发记录9_28335中断系统

    28335中断系统 1.中断系统 在这里我们要十分清楚DSP的中断系统. C28XX一共同拥有16个中断源,当中有2个不可屏蔽的中断RESET和NMI.定时器1和定时器2分别使用中断13和14.这样还 ...

  5. TMS320F28335项目开发记录3_28335简介

    28335特性介绍 高性能静态CMOS技术         高达150MHZ(6.67ns的周期时间):1.9V / 1.8内核 ,3.3V I/O设计 高性能32位CPU         IEEE- ...

  6. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

  7. Unity3D Demo项目开发记录

    前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...

  8. Anytime项目开发记录4

    做事情列表,我在程序中命名为“正在做”. 这是一个Fragment,应用的主页面,由一个MainActivity加上DoingListFragment和PersonFragment组成.PersonF ...

  9. Anytime项目开发记录2

    注册,登陆于密码找回.这是这次记录的主要内容. 首先,我们来看类图: 因为一直在改,所以与第二篇介绍项目框架时的图会有一些不一样. 代码都是非常简单的. 由于在注册和登陆这里,需要弹出一些对话框告诉用 ...

随机推荐

  1. EasyUI - DataGrid 组建 - [ 搜索功能 ]

    效果: html代码: 使用css加载的方式,所以要在写html代码,也可以使用js操作. <div> <!--使用JS加载方式--> <table id="t ...

  2. 菜单组件——axure线框图部件库介绍

    软件类的教程,我写不出长篇大论,这里面的都是基础的操作,希望初学者,根据一个功能演示,可以自己测试其他功能菜单的效果! Axure自带的菜单组件,我几乎没有用到过,做菜单导航,我第一时间想到的还是矩形 ...

  3. cocos2d-x在win32和iOS、android下获取当前系统时间的方法

    最近在游戏里要显示当前系统时间的功能,网上一搜很多写着获取的方法,大都是如下 struct cc_timeval now; CCTime::gettimeofdayCocos2d(&now, ...

  4. [置顶] 关于本博客 http://www.imobilebbs.com

    由于时间上的关系,本博客不再和引路蜂移动软件博客同步更新,    请直接访问 http://www.imobilebbs.com 谢谢您的支持,再见   引路蜂博客

  5. MSSQL - SQL Server2008附加数据库失败 错误号:5120

    附加数据库时,显示错误,错误信息为 一种解决方法为,设置mdf文件所在文件夹的权限(有些资料说只设置mdf文件的权限就好,但我试了不管用),在文件夹上右击——属性——安全,如图所示: 选择组或用户名中 ...

  6. 在JDBC中使用PreparedStatement代替Statement,同时预防SQL注入

    本篇讲诉为何在JDBC操作数据库的过程中,要使用PreparedStatement对象来代替Statement对象. 在前面的JDBC学习中,对于Statement对象,我们已经知道是封装SQL语句并 ...

  7. php 控制页面跳转

    <?php class UserAction extends Action{ public function index(){ echo "你好!"; $m=M('user' ...

  8. Craig可能是个冲浪爱好者

    最近有个叫Dweeb的Mac管理员,在他的blog中声称发现,主管OS X和iOS等软件产品的苹果资深副总裁Craig是一个冲浪爱好者.他通过对6月10日的苹果WWDC发布会视频的研究,指出Craig ...

  9. 断剑重铸之日,席卷朗朗乾坤之时--PHP学习一月漫记

    传说中阿尔萨斯王子沉沦堕落之后,被巫妖王安置在冰冷的城堡中,静静地等待重出天日,它随身携带的宝剑也埋没与尘土之间,暗淡无光.他想起宝剑伴身,东征西战的峥嵘岁月,忆及如今身陷囹圄,一股怨念由心底升起,许 ...

  10. 转载【浅谈ThreadPool 线程池】

    浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html