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

 

 

就是這樣了,有點亂,大概記錄一下吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM