關於CC2530存儲器映射的討論

   接觸了一個月的zigbee,發現對cc2530的存儲器映射還不是很熟悉,所以寫這篇文章來和各位高手討論一下,一下大家能指正我一些理解上的錯誤。本文以CC2530的F256爲例,即有256kb的flash存儲器和8K的sram存儲器

    一、CC2530裏的四種存儲空間(結構上劃分的存儲空間,並不是實際的存儲器,是一種理論上的概念)
      1.  CODE   程序存儲器   用處存放程序代碼和一些常量
           有16根地址總線,所以CODE的尋址範圍是 0000H~FFFFH 共64KB

      2.  DATA    數據存儲器   用於存放程序運行過程中的數據
           有8根地址總線,所以DATA的尋址空間爲 00H~FFH 共256 byte.低128位可以直接尋址,高128位只能間接尋址。

      3.  XDATA  外部數據存儲器(只能間接尋址,訪問速度比較慢) DMA是再XDATA上尋址的,這一點很重要
           有16根地址總線,所以 XDATA 的尋址空間爲 0000H ~ FFFFH 共64K

      4.  SFR  特殊功能寄存器  就是那些T1CTL, EA, P0 等配置寄存器存儲的地方 共128K。因爲CC2530的配置寄存器比較多,所以一些多餘的寄存器就放到了XREG 裏面。XREG的大小爲1K XREG的訪問速度比 SFR慢。

以上4中存儲空間只是4種不同尋址方式的概念,並不代表物理上具體的存儲設備。例如 FLASH 或者 EEPROM都可以作爲物理的存儲媒介映射到CODE上,DRAM或者SRAM都可以作爲存儲媒介映射到DATA中。CODE和DATA是存儲空間的概念,FLASH、SRAM、EEPROM等是具體的物理存儲設備,這兩個概念不要混淆。這好比,電腦需要RAM和ROM,這個ROM可以是西部數據的硬盤,也可以使三星的硬盤,也可以是不同材料的固態硬盤。一個是存儲空間,另一個是具體的物理存儲設備。

   二、關於CODE存儲器的映射
      大家肯定會有疑問:既然CODE的尋址範圍只有64KB,那CC2530F256怎麼有256KB的flash呢?
   正是爲了解決尋址空間不足的問題,CC2530才提出了映射的概念。(當然,映射的另一重要目的是爲了DMA)
CC2530把FLASH存儲器分成了幾個bank,每個bank的大小是32KB,即對於F256來講,它有8個bank分別是bank0~bank7(不同芯片,bank數目不同)。通過FMAP.MAP[2:0] 控制,把不同的編號的bank映射到CODE上,解決了尋址空間受限制的問題。上圖..
CODE_1.png 
    從圖中可以看出,bank0是rootbank,就是程序開始執行的地方,這個common area始終都是對應FLASH存儲器的0000H~7FFFH,   上面的另一半可以映射bank0~7. 我以前一直疑惑,爲什麼common area已經有bank0了,上面怎麼還可以有bank0,從user guide裏看,這樣是可以的,就比如CC2530F32,只有一個bank0,它也只能這麼映射了吧。

   三、關於XDATA存儲器的映射
關於XDATA的映射,可以這麼說:一切都是爲了DMA!!  爲了讓DMA能訪問所有的存儲區域,所以把所有的存儲器都映射到了XDATA上。上圖:
XDATA.png 
   從圖中可以看出,XDATA中包含了所有存儲器的映射,包括256kb的FLASH存儲器,8K 的SRAM存儲器,還有 SFR , XREG, INFORMATION FAGE。這裏看出來,其實CC2530的DATA,和 XDATA,都是用SRAM作爲物理存儲媒介的,但是它們的尋址方式不一樣,所以訪問DATA,比訪問XDATA要快。至於SFR,XREG,INFORMATION PAGE,我不知道它們用了什麼物理存儲媒介,但是它們都被映射到XDATA上,可以被DMA訪問。
    這裏要搞清楚一個概念,映射到XDATA上,不代表就只能用XDATA的尋址方式訪問。比如SFR,它雖然被映射到了XDATA上,只能說明,DMA可以通過訪問XDATA來操作SFR,但是CPU還是可以通過單週期訪問SRF.打個比方,我們平時坐的公交車上都有一把逃生應急錘,在緊急情況下可以敲破窗子逃生。我們平時不會使用錘子敲碎窗子進出車廂,我們平時有車門可以走。但是在特殊情況下(比如DMA要操作某個存儲器中的數據時),我們可以用特殊的方法(從XDATA上的映射來得到我們想要的數據)。

   四、關於從SRAM啓動代碼
上圖   CODE_2.png 
這種情況下,CC2530把SRAM存儲器整個都映射到了CODE的bank area,可以從SRAM中執行代碼。不要理解錯了,這裏只是說可以從SRAM中運行代碼,不代表程序從SRAM中啓動。程序還是會從 CODE的rootbank的0000H開始執行,只不過我們可以通過程序控制,讓程序跳到 8000H之後,執行我們SRAM中想要的代碼。

以上是我的一些個人理解,如果有錯誤的地方,希望各位老師及時指出,幫我這個菜鳥更正錯誤.... 謝謝了
還有,本人語文水平欠佳.... 請見諒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章