CC2530儲存空間——Code,cc2530儲存code
硬體平台:CC2530-F256
開發環境:IAR 8051(版本 8.10)
參考:
1、《CC2530 User's Guide.pdf》(swru191c)
2、《IAR C/C++ Compiler Reference Guide.pdf》
3、《IAR Linker and Library Tools.pdf》
一、CC2530代碼空間介紹
CC2530-F256有著256K的Flash,其代碼儲存空間2-2(來自CC2530User‘s Guide)所示,但是51單片機只支援64K的訪問空間。
於是CC2530便採用Bank映射的方式,地址空間0x0000-0x7FFF,作為ROOT,用於存放啟動代碼等,地址空間0x8000-0xFFFF用於映射不同的Bank(0~7),4(來自IARC/C++ Compiler Reference Guide)所示,需要訪問某個Bank的資料或代碼時,將該Bank映射到地址空間0x8000-0xFFFF。
映射不同Bank時,需使用FMAP寄存器。
註:
CC2530 ROM的不同地址:
物理地址:0x00000~0x3FFFF
Bank地址:
Bank0:0x00000~0x07FFF
Bank1:0x18000~0x1FFFF
Bank2:0x28000~0x2FFFF
Bank3:0x38000~0x3FFFF
Bank4:0x48000~0x4FFFF
Bank5:0x58000~0x5FFFF
Bank6:0x68000~0x6FFFF
Bank7:0x78000~0x7FFFF
二、CC2530儲存空間使用
IAR中CC2530的有兩種代碼模式,Near和Banked。其中Banked模式是ZStack使用的模式,ZStack的ROM使用大約在100多KB。其中Near是普通的51單片機模式,只支援64KB的存取範圍。
在目錄8051\src\lib中有一個iar_banked_code_support.s51檔案用於程式運行時自動切換Bank。
測試代碼如下:
__code const char code0_buf[10000]@0x48000 = {0, 1};#pragma location="BANK4"void demo1_code(){TRACE("FMAP: %02x\r\n", FMAP);TRACE("%02x %02x\r\n", code0_buf[0], code0_buf[1]);}__code const char code1_buf[10000]@0x58000 = {2, 3};#pragma location="BANK5"void demo2_code(){TRACE("FMAP: %02x\r\n", FMAP);TRACE("%02x %02x\r\n", code1_buf[0], code1_buf[1]);}
其中BANK5,BANK4是串連設定檔”lnk51ew_CC2530F256_banked.xcl“定義的segment。運行結果如下:
串口列印的調試資訊如下:
error code:-2147024882(儲存空間不足,不可以完成此操作)
那麼你修改了 合適的虛擬記憶體沒有, 在“電腦”右鍵 “屬性”===》進階設定=====》進階===》效能 進階。 一般修改為你的記憶體1.5倍就OK了,或者再大一些。 出現代碼錯誤:2147024882,也有可能是軟體出錯問題,建議更新你最近玩什麼遊戲與安裝了什麼軟體,進行升級補丁,更新最高版本。
CC2530怎寫延時函數
1.首先CC2530是增強51,代碼空間比較大,我們知道51的16位定址空間只有64K,對256K的CC2530而言,需要用代碼分塊頁機制(code banking)把代碼空間分成8個BANK(每個32K),才能定址所有的代碼空間,函數放在不同的BANK中,切換的過程是需要消耗時間的,這個過程對我們編程是不可見的,由編譯器在編譯的時候添加到程式中。
2.如果程式沒有關閉中斷,中斷也可能打斷延時函數,這樣也可能使延時不正確。
3.以上兩點就是你為什麼用以前51的思路來寫延時函數不準確的原因,如果想要得到比較精確的延時,可以用定時器來做,如果使用了Z-Stack,可以使用的時鐘有T1/3/4。