• 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

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

  • 相关阅读:
    穷人不配拥有爱情
    配置 OSPF 的 DR 选择示例
    配置OSPF虚连接示例
    配置OSPF路由协议基本功能示例
    配置 RIP 与动态 BFD 联动特性示例(IPv4)
    配置 RIP 与单臂静态 BFD 联动特性示例(IPv4)
    配置 RIP 引入外部路由示例(IPv4)
    配置 RIP 基本功能示例(IPv4)
    可以继承和不可以继承的样式属性
    权重和权重的计算
  • 原文地址:https://www.cnblogs.com/prayer521/p/4069046.html
Copyright © 2020-2023  润新知