日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CC2530之Flash笔记

發(fā)布時(shí)間:2024/9/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CC2530之Flash笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近在看CC2530的Flash部分,翻閱一些文章,將記錄下來,做為筆記以免遺忘,如有錯(cuò)誤之處請指出。

參考文章:
http://www.cfanz.cn/?c=article&a=read&id=173767
http://www.xuebuyuan.com/1035130.html
http://blog.csdn.net/crystal736/article/details/8727111
https://wenku.baidu.com/view/b640309043323968001c925d.html
http://www.xuexila.com/diannao/rumen/607222.html
http://www.cnblogs.com/felixfang/p/3420462.html

一、基礎(chǔ)知識

我使用的TI的芯片型號為CC2530-F256,擁有256K的 **Flash**,8K **SRAM**,內(nèi)核為8051,只支持64K訪問空間,以下為一些基本概念。

1.CODE. A read-only memory space for program memory. This memory
space addresses 64 KB.
2.DATA. A read/write data memory space that can be directly or indirectly accessed by a single-cycle CPU instruction. This memory space addresses 256 bytes. The lower 128 bytes of the DATA memory space can be addressed either directly or indirectly, the upper 128 bytes only indirectly.
3.XDATA. A read/write data memory space, access to which usually requires 4–5 CPU instruction cycles.This memory space addresses 64 KB. Access to XDATA memory is also slower than DATA access, as the CODE and XDATA memory spaces share a common bus on the CPU core, and instruction
prefetch from CODE can thus not be performed in parallel with XDATA
accesses.
4.SFR. A read/write register memory space which can be directly accessed by a single CPU instruction.This memory space consists of 128 bytes. For SFR registers whose address is divisible by eight, each bit is also individually addressable.

在此處我們只需要記住 **DATA**和 **XDATA** 存在 **SRAM** 上,而 **CODE**存在 **Flash**上即可。

二、CC2530中的 Flash 結(jié)構(gòu)

由于CC2530只支持64K尋址,因此,采用 **Bank**映射的方式尋址,其中,32K作為 **ROOT**,用于存放啟動代碼等,地址空間為 0x0000~0x7FFF;剩余32K用于映射不同的 **Bank**(0~7),地址為0x8000~0xFFFF.在查詢某個(gè) **Bank** 的數(shù)據(jù)或代碼時(shí),將該 **Bank**映射到地址空間 0x8000 ~ 0xFFFF即可。


通過ZigBee協(xié)議棧中的定義

#define HAL_FLASH_PAGE_SIZE 2048

我們可以知道每頁page的大小為2K,定義每16個(gè)page為1個(gè)Bank,下圖為Bank與page的關(guān)系

Bank地址:
Bank0: 0x00000 ~ 0x07FFFF
Bank1: 0x18000 ~ 0x1FFFFF
Bank2: 0x28000 ~ 0x2FFFFF
Bank3: 0x38000 ~ 0x3FFFFF
Bank4: 0x48000 ~ 0x4FFFFF
Bank5: 0x58000 ~ 0x5FFFFF
Bank6: 0x68000 ~ 0x6FFFFF
Bank7: 0x78000 ~ 0x7FFFFF

三、計(jì)算Bank的數(shù)據(jù)或代碼的地址

在計(jì)算地址前,首先了解物理地址與邏輯地址的概念,及兩者之間的轉(zhuǎn)換公式。 1、物理地址與邏輯地址 物理地址:加載到內(nèi)存地址寄存器中的地址,內(nèi)存單元的真正地址。在前端總線上傳輸?shù)膬?nèi)存地址都是物理內(nèi)存地址,編號從0開始一直到可用物理內(nèi)存的最高端。這些數(shù)字被北橋(Nortbridge chip)映射到實(shí)際的內(nèi)存條上。物理地址是明確的、最終用在總線上的編號,不必轉(zhuǎn)換,不必分頁,也沒有特權(quán)級檢查(no translation, no paging, no privilege checks)。

  邏輯地址:CPU所生成的地址。邏輯地址是內(nèi)部和編程使用的、并不唯一。例如,你在進(jìn)行C語言指針編程中,可以讀取指針變量本身值(&操作),實(shí)際上這個(gè)值就是邏輯地址,它是相對于你當(dāng)前進(jìn)程數(shù)據(jù)段的地址(偏移地址),不和絕對物理地址相干。

2、物理地址與邏輯地址的轉(zhuǎn)換 (1)確定虛擬地址(物理地址)的有效位

  例如:假設(shè)頁面大小1KB,共32頁。(頁面:邏輯地址 頁框:物理地址)
  由32(KB)=32×1024(B) 即等于32×1024 字節(jié)
  二進(jìn)制用多少位能有效表示這么多字節(jié)呢?

答案是:15位 因?yàn)?2×102 4=2^5×2^10=2^15 (2)再次確定邏輯地址頁面位數(shù) 你應(yīng)該知道:邏輯地址=頁號+頁面

  還是以上假設(shè),那么頁面大小為1KB=1024字節(jié) 同樣的方法計(jì)算出表示位數(shù):10位
  如果給你邏輯地址:0000 1111 1000 0000
  那么由:011+11100000000(相當(dāng)于 頁號+頁面(10位))推得出頁號011=3
  (3)根據(jù)頁號找出對應(yīng)的頁框號
  由 物理地址=頁框號×頁塊大小(頁塊大小是等于頁面大小的)+頁內(nèi)位移(即頁面邏輯地址)//物理地址=塊的大小(即頁的大小L)*塊號f+頁內(nèi)地址d
  根據(jù)上面 物理地址=頁框號×1024B + 1110000000 ( 這里的相加是指位置上而言)
  例如:110+110=110110(即高地址+低地址)

有了以上的知識,我們來看一看CC2530的Flash的讀寫是怎樣通過邏輯地址找到物理地址的 void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt){..............// Calculate the offset into the containing flash bank as it gets mapped into XDATA.uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) +((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE);.............} ptr為物理地址,offset為偏移量, pg為頁數(shù) #define HAL_FLASH_PAGE_MAP 0x8000 #define HAL_FLASH_PAGE_PER_BANK 16 #define HAL_FLASH_PAGE_SIZE 2048 假如我們要讀某一page中的數(shù)據(jù),那么我們必須先把這個(gè)page所在的

bank映射到XDATA的0x8000~0xFFFF中,我們讀取page值為100,偏移量為20的數(shù)據(jù)時(shí),這個(gè)地址通過上面的表達(dá)式就很容易計(jì)算出來為20+0x8000+(100%16)2024 = 0x9FB4,注意這個(gè)地址轉(zhuǎn)換成了(uint8 ),即為XDATA空間的地址。

pg /= HAL_FLASH_PAGE_PER_BANK;計(jì)算page所在的bank,如果pg為100,則其所在bank值為100/16= 6MEMCTR = (MEMCTR & 0xF8) | pg;這句是將剛才計(jì)算所得的bank映射到XDATA的0x8000~0xFFFF中去,MEMCTR的低三位為XDATA的bank選擇位

四、其他地址

1、IEEE

-D_IEEE_ADDRESS_SPACE_START=(((_NR_OF_BANKS+1)*_FIRST_BANK_ADDR)-0x18)
-D_IEEE_ADDRESS_SPACE_END=(_IEEE_ADDRESS_SPACE_START+7)
-Z(CODE)IEEE_ADDRESS_SPACE=_IEEE_ADDRESS_SPACE_START-_IEEE_ADDRESS_SPACE_END
注:0x18 = 24 = 16 +8;
_IEEE_ADDRESS_SPACE_START容易算出來,_NR_OF_BANKS值為0x07,_FIRST_BANK_ADDR值為0x8000,這些值是在options...里面設(shè)置的。所以_IEEE_ADDRESS_SPACE_START的值為0x40000 - 0x18 = 0x3FFE8,_IEEE_ADDRESS_SPACE_END值就為0x3FFE8+7 = 0x3FFEF。
(備注:每2kb(1page)的flash有1bit的lock位)

2、NV Z-STACK將flash的最末處的12KB(6page)用來作為Nv存儲的,具體看:

-D_ZIGNV_ADDRESS_SPACE_START=(((_NR_OF_BANKS+1)*_FIRST_BANK_ADDR)-0x3800)
-D_ZIGNV_ADDRESS_SPACE_END=(_ZIGNV_ADDRESS_SPACE_START+0x2FFF)
-Z(CODE)ZIGNV_ADDRESS_SPACE=_ZIGNV_ADDRESS_SPACE_START-_ZIGNV_ADDRESS_SPACE_END

總結(jié)

以上是生活随笔為你收集整理的CC2530之Flash笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。