轉自: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
就是這樣了,有點亂,大概記錄一下吧。