DSP

DSp寄存器“是怎么和板子上的”具体地址“一一对应起来的

2019-07-13 11:03发布

  转自: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     就是这样了,有点乱,大概记录一下吧。