zoukankan      html  css  js  c++  java
  • DSp寄存器“是怎么和板子上的”具体地址“一一对应起来的

    转自:http://hzcjustfly.blog.163.com/blog/static/18319712920117191123928/

        最近在学习DSP,今天在开发板TMS320F2808学习例程的时候,对CMD文件感觉还不是很理解,特别是对于”寄存器名“是怎么和板子上的”具体地址“一一对应起来的,结合店家的讲解和自己理解,简单回顾一下。

         首先,查阅TI的文件,可以得到F2808存储空间的映射图如下:

                                                                

    对照CMD文件,还是比较好理解Flash和RAM的分配。

    但是在另外一个cmd文件我当时就疑惑了:

    Example_280xGpioToggle.c在程序中有一行如下:

    GpioDataRegs.GPATOGGLE.bit.GPIO26 =1; 

    这个是GPIO得数据寄存器中的GPATOGGLE寄存器,控制26号I/O口为输出,通过查阅TI文档,知道该寄存器的地址是:“GPATOGGLE   0x6FC6”,但它到底是怎么对应起来的呢?因为以前学过单片机,感觉单片机的很明确,这个却摸不着头脑。

    -----------------------------------------------------------------------------

    在文件DSP280x_GlobalVariableDefs.c中找到如下定义:

    volatile struct GPIO_DATA_REGS GpioDataRegs;

    -------------------------------------------------------------------------------

    在文件DSP280x_Gpio.h中找到结构体的定义如下:

    struct GPIO_DATA_REGS {

       union  GPADAT_REG       GPADAT;       // GPIO Data Register (GPIO0 to 31)

       union  GPADAT_REG       GPASET;       // GPIO Data Set Register (GPIO0 to 31)

       union  GPADAT_REG       GPACLEAR;     // GPIO Data Clear Register (GPIO0 to 31)

       union  GPADAT_REG       GPATOGGLE;    // GPIO Data Toggle Register (GPIO0 to 31) 

       union  GPBPUD_REG       GPBDAT;       // GPIO Data Register (GPIO32 to 63)

       union  GPBDAT_REG       GPBSET;       // GPIO Data Set Register (GPIO32 to 63)

       union  GPBDAT_REG       GPBCLEAR;     // GPIO Data Clear Register (GPIO32 to 63)

       union  GPBDAT_REG       GPBTOGGLE;    // GPIO Data Toggle Register (GPIO32 to 63)

       Uint16                  rsvd1[16];

    };

    extern volatile struct GPIO_DATA_REGS GpioDataRegs;

    ------------------------------------------------------------------------------------------

    接着找下去:

    union GPADAT_REG {

       Uint32              all;

       struct GPADAT_BITS  bit;

    };

    struct GPADAT_BITS {          // bits   description

       Uint16 GPIO0:1;            // 0      GPIO0   

       Uint16 GPIO1:1;            // 1      GPIO1 

       Uint16 GPIO2:1;            // 2      GPIO2 

       Uint16 GPIO3:1;            // 3      GPIO3    

       Uint16 GPIO4:1;            // 4      GPIO4 

       Uint16 GPIO5:1;            // 5      GPIO5 

       Uint16 GPIO6:1;            // 6      GPIO6    

       Uint16 GPIO7:1;            // 7      GPIO7 

       Uint16 GPIO8:1;            // 8      GPIO8 

       Uint16 GPIO9:1;            // 9      GPIO9    

       Uint16 GPIO10:1;           // 10     GPIO10 

       Uint16 GPIO11:1;           // 11     GPIO11       

       Uint16 GPIO12:1;           // 12     GPIO12 

       Uint16 GPIO13:1;           // 13     GPIO13 

       Uint16 GPIO14:1;           // 14     GPIO14 

       Uint16 GPIO15:1;           // 15     GPIO15 

       Uint16 GPIO16:1;           // 16     GPIO16   

       Uint16 GPIO17:1;           // 17     GPIO17 

       Uint16 GPIO18:1;           // 18     GPIO18 

       Uint16 GPIO19:1;           // 19     GPIO19   

       Uint16 GPIO20:1;           // 20     GPIO20

       Uint16 GPIO21:1;           // 21     GPIO21 

       Uint16 GPIO22:1;           // 22     GPIO22    

       Uint16 GPIO23:1;           // 23     GPIO23

       Uint16 GPIO24:1;           // 24     GPIO24 

       Uint16 GPIO25:1;           // 25     GPIO25    

       Uint16 GPIO26:1;           // 26     GPIO26 

       Uint16 GPIO27:1;           // 27     GPIO27       

       Uint16 GPIO28:1;           // 28     GPIO28 

       Uint16 GPIO29:1;           // 29     GPIO29 

       Uint16 GPIO30:1;           // 30     GPIO30 

       Uint16 GPIO31:1;           // 31     GPIO31 

    };

    在cmd文件中,定义了

    GpioDataRegs

    的地址,而DSP280x_Gpio.h的GPIO_DATA_REGS定义了GPIO_DATA_REGS与GPATOGGLE的相对位置,所以

    GPATOGGLE的绝对地址也就确定下来了。

    --------------------------------------------------------------------------------------------------------

    GpioDataRegs

    的地址又是怎么被确定的?可以翻看文件找到如下信息:

    文件DSP280x_GlobalVariableDefs.c中有:

    #ifdef __cplusplus 

    #pragma DATA_SECTION("GpioDataRegsFile") 

    #else 

    #pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");      //这里定义了寄存器的段明(要在定义和使用之前先设置好)

    #endif

    volatile struct GPIO_DATA_REGS  GpioDataRegs;       //定义结构变量;volatile struct 标识符 变量名           

    --------------------------------------------------------------------------------

    DSP280x_Headers_nonBIOS.cmd中

    MEMORY有如下信息:

    PAGE 1: 

    GPIODAT     : origin = 0x006FC0, length = 0x000020     /* GPIO data registers */

    SECTION有如下信息:

    GpioDataRegsFile  : > GPIODAT      PAGE = 1

    就是这样了,有点乱,大概记录一下吧。

  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/prayer521/p/4069046.html
Copyright © 2011-2022 走看看