CC2530學習筆記1——Flash儲存器對映的討論
轉載自https://blog.csdn.net/bailyzheng/article/details/7541422
接觸了一個月的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上,解決了定址空間受限制的問題。上圖..
從圖中可以看出,bank0是rootbank,就是程式開始執行的地方,這個common area始終都是對應FLASH儲存器的0000H~7FFFH, 上面的另一半可以對映bank0~7. 我以前一直疑惑,為什麼common area已經有bank0了,上面怎麼還可以有bank0,從user guide裡看,這樣是可以的,就比如CC2530F32,只有一個bank0,它也只能這麼映射了吧。
三、關於XDATA儲存器的對映
關於XDATA的對映,可以這麼說:一切都是為了DMA!! 為了讓DMA能訪問所有的儲存區域,所以把所有的儲存器都對映到了XDATA上。上圖:
從圖中可以看出,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啟動程式碼
上圖
這種情況下,CC2530把SRAM儲存器整個都對映到了CODE的bank area,可以從SRAM中執行程式碼。不要理解錯了,這裡只是說可以從SRAM中執行程式碼,不代表程式從SRAM中啟動。程式還是會從 CODE的rootbank的0000H開始執行,只不過我們可以通過程式控制,讓程式跳到 8000H之後,執行我們SRAM中想要的程式碼。
以上是我的一些個人理解,如果有錯誤的地方,希望各位老師及時指出,幫我這個菜鳥更正錯誤.... 謝謝了
還有,本人語文水平欠佳.... 請見諒