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. Study notes for B-tree and R-tree

    B-tree B-tree is a tree data structure that keeps data sorted and allows searches, sequential access ...

  2. 遍历关联数组 index by varchar2

    --字符串序列要这样 declare     type t   is table of number(3) index by varchar2(3);    hash_t t;      l_row ...

  3. sharepoint具体错误提示

    sharepoint页面发生错误时,默认不会显示具体错误信息,只显示“未知错误”提示.需要修改配置站点的webconfig文件,才能显示出具体错误提示.具体方法如下: 将safeMode中的CallS ...

  4. Qt for Android 部署流程分析

    原地址:http://blog.csdn.net/foruok/article/details/17796017 今天为了测试使用 Qt Creator 3.0.0 开发的纯 C 工程,利用了 Win ...

  5. high volume logging

    logging 是现在系统中必不可少的组件了.市面上已经有很多很多非常成熟的日志产品,log*系列就是一个典型代表.对于erlang系统来说,也有很多,比如error_logger, disk_log ...

  6. [置顶] js中如何复制一个对象,如何获取所有属性和属性对应的值

    在js中如何复制一个对象,例如如下一个js对象. 如果知道这个对象的所有属性自然就可以重新new一个,然后对每个属性赋值,就可以做到,但如果不知道呢?如何创建一个内容相同 的对象呢? var obj= ...

  7. zipkin分布式链路追踪系统

    基于zipkin分布式链路追踪系统预研第一篇   分布式服务追踪系统起源于Google的论文“Dapper, a Large-Scale Distributed Systems Tracing Inf ...

  8. spring mvc3中的addFlashAttribute方法

    spring mvc3中的addFlashAttribute方法  

  9. Complete Guide for Spring Boot Actuator

    You are here to learn about Spring Boot Actuator for collecting metrics about your production grade ...

  10. boost.asio系列——buffer

    创建buffer 在io操作中,对数据的读写大都是在一个缓冲区上进行的,在asio框架中,可以通过asio::buffer函数创建一个缓冲区来提供数据的读写.buffer函数本身并不申请内存,只是提供 ...