zoukankan      html  css  js  c++  java
  • TMS320F28335项目开发记录5_28335之CCS编程基础

        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就能够实际操作串口了,目的也就达到了;


  • 相关阅读:
    day02_07 创建新目录
    day02_04 字典
    day02_02 列表切割
    day03_01 文件操作
    MS的TREE 控件使用
    使用自定义用户控件的一些经验
    Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]
    正则表达式基础学习[1]
    自定义控件无法在VS.net编辑中显示
    错误的递归
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4349468.html
Copyright © 2011-2022 走看看