28335不單單是個CPU,還有非常多的外設功能模塊,像是ADC、SCI、PWM、CAN什么的。這些模塊的的功能是有專門的硬件控制器來完成的,在運行時不會占用CPU資源,只是在配置和進行數據交互時才會用到CPU指令。就像你使用SCI只需設置好波特率和相關的中斷,然后做好數據的收發,數據的串並/並串轉換、fifo的控制、並行幀監測這都是由硬件模塊完成。
以上為GPIO三個寄存器的硬件地址分配情況,而DSP2833x_Headers_nonBIOS.cmd這個文件里面有這樣的地址空間定義:
而在源文件里面,則是GPIO_CTRL_REGS、GPIO_DATA_REGS、GPIO_INT_REGS分別表示這三個寄存器組,DSP2833x_Gpio.h文件里面聲明了這三個寄存器組全局結構,然后是DSP2833x_GlobalVariableDefs.c為這三個結構體定義自定義數據段GpioCtrlRegsFile 、GpioDataRegsFile、GpioIntRegsFile,在DSP2833x_Headers_nonBIOS.cmd文件里面將這三個數據段映射到定義好的三個數據空間GPIOCTRL、GPIODAT、GPIOINT里面,就如上圖所示。
這里可以根據變量名來一一對應這些寄存器,結構體里面的這些聯合體類型都是2個16位長度的。 里面的兩個rsvd變量是為保證寄存器地址完全對齊而設置的,這說明為寄存器分配的地址上面並不是每一位的空間都是有利用的,這點直接對着文檔看地址分配很容易忽略,雖然這個沒什么重要性。另外體現的信息,不同的寄存器所用的結構體是不同的,這也是針對寄存器的具體物理結構所做的設置。
CPU跟這些模塊的接口就是這些模塊的寄存器,模塊的配置和訪問操作都是通過讀寫相關寄存器來完成的。這些寄存器的物理存儲空間是直接並入數據地址空間的,所以不需要另外的讀寫指令來操作這些寄存器。
28335里面又把這些模塊的寄存器分為4組,分配在不同的地址空間下。上圖可以看出4個寄存器組的地址分配情況。中間的Reserved陰影塊應該是留給后續版本升級的地址空間,隔開了組號0跟1、2、3。組1、2、3其實是在連續的地址上的,這些組除了所包含的模塊不同之外,其總線結構也是稍有不同的。
28335里面又把這些模塊的寄存器分為4組,分配在不同的地址空間下。上圖可以看出4個寄存器組的地址分配情況。中間的Reserved陰影塊應該是留給后續版本升級的地址空間,隔開了組號0跟1、2、3。組1、2、3其實是在連續的地址上的,這些組除了所包含的模塊不同之外,其總線結構也是稍有不同的。
上表是Peripheral Frame 0的寄存器分配排列信息,各個不同模塊的寄存器占用的空間各有不同,在地址空間上連續排列。
一個模塊包含着多個不同功能的寄存器,寄存器的不同位代表着不同的信息。每個寄存器都分配了的物理地址。在CCS的C語言開發系統中,在代碼源文件里面用結構體描述外設模塊的寄存器結構,然后用cmd文件為其一一分配物理地址,這樣就完成了寄存器的映射。
下面就以GPIO模塊寄存器為例來展示下這種映射的細節好了。
以上為GPIO三個寄存器的硬件地址分配情況,而DSP2833x_Headers_nonBIOS.cmd這個文件里面有這樣的地址空間定義:
origin表示起始地址,length表示長度,再結合名字,很容易就可以推出這正好是GPIO的三個寄存器組的物理地址空間。
而在源文件里面,則是GPIO_CTRL_REGS、GPIO_DATA_REGS、GPIO_INT_REGS分別表示這三個寄存器組,DSP2833x_Gpio.h文件里面聲明了這三個寄存器組全局結構,然后是DSP2833x_GlobalVariableDefs.c為這三個結構體定義自定義數據段GpioCtrlRegsFile 、GpioDataRegsFile、GpioIntRegsFile,在DSP2833x_Headers_nonBIOS.cmd文件里面將這三個數據段映射到定義好的三個數據空間GPIOCTRL、GPIODAT、GPIOINT里面,就如上圖所示。
物理地址的映射就是這些,那寄存器結構就是簡單的在這些結構體的成員里面做文章了:
這里可以根據變量名來一一對應這些寄存器,結構體里面的這些聯合體類型都是2個16位長度的。 里面的兩個rsvd變量是為保證寄存器地址完全對齊而設置的,這說明為寄存器分配的地址上面並不是每一位的空間都是有利用的,這點直接對着文檔看地址分配很容易忽略,雖然這個沒什么重要性。另外體現的信息,不同的寄存器所用的結構體是不同的,這也是針對寄存器的具體物理結構所做的設置。
GPACTRL寄存器的數據結構類型是GPACTRL_REG,使用聯合體就是既可以用32位的all也可以用結構體GPACTRL_BITS bit里面的四個8為數據來訪問這個寄存器。跟GPACTRL的物理邏輯結構一對照就知道為什么要用這種數據結構來定義GPACTRL寄存器了。
28335的外設功能很多,整個寄存器體系結構跟映射關系還是很復雜的,但是找准一個模塊慢慢研究,其他的寄存器模塊也就觸類旁通了。
