最近在看CC2530的Flash部分,翻阅一些文章,将记录下来,做为笔记以免遗忘,如有错误之处请指出。

参考文章:
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

一、基础知识

我使用的TI的芯片型号为CC2530-F256,拥有256K的 **Flash**,8K **SRAM**,内核为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 结构

由于CC2530只支持64K寻址,因此,采用 **Bank**映射的方式寻址,其中,32K作为 **ROOT**,用于存放启动代码等,地址空间为 0x0000~0x7FFF;剩余32K用于映射不同的 **Bank**(0~7),地址为0x8000~0xFFFF.在查询某个 **Bank** 的数据或代码时,将该 **Bank**映射到地址空间 0x8000 ~ 0xFFFF即可。


通过ZigBee协议栈中的定义

#define HAL_FLASH_PAGE_SIZE       2048

我们可以知道每页page的大小为2K,定义每16个page为1个Bank,下图为Bank与page的关系

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

三、计算Bank的数据或代码的地址

在计算地址前,首先了解物理地址与逻辑地址的概念,及两者之间的转换公式。
1、物理地址与逻辑地址
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。

  逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

   2、物理地址与逻辑地址的转换
(1)确定虚拟地址(物理地址)的有效位

  例如:假设页面大小1KB,共32页。(页面:逻辑地址 页框:物理地址)
  由32(KB)=32×1024(B) 即等于32×1024 字节
  二进制用多少位能有效表示这么多字节呢?

答案是:15位 因为32×102    4=2^5×2^10=2^15
(2)再次确定逻辑地址页面位数 你应该知道:逻辑地址=页号+页面

  还是以上假设,那么页面大小为1KB=1024字节 同样的方法计算出表示位数:10位
  如果给你逻辑地址:0000 1111 1000 0000
  那么由:011+11100000000(相当于 页号+页面(10位))推得出页号011=3
  (3)根据页号找出对应的页框号
  由 物理地址=页框号×页块大小(页块大小是等于页面大小的)+页内位移(即页面逻辑地址)//物理地址=块的大小(即页的大小L)*块号f+页内地址d
  根据上面 物理地址=页框号×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为页数
#define HAL_FLASH_PAGE_MAP                         0x8000
#define HAL_FLASH_PAGE_PER_BANK            16
#define HAL_FLASH_PAGE_SIZE                          2048
  假如我们要读某一page中的数据,那么我们必须先把这个page所在的

bank映射到XDATA的0x8000~0xFFFF中,我们读取page值为100,偏移量为20的数据时,这个地址通过上面的表达式就很容易计算出来为20+0x8000+(100%16)2024 = 0x9FB4,注意这个地址转换成了(uint8 ),即为XDATA空间的地址。

  pg /= HAL_FLASH_PAGE_PER_BANK;计算page所在的bank,如果pg为100,则其所在bank值为100/16= 6MEMCTR = (MEMCTR & 0xF8) | pg;这句是将刚才计算所得的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...里面设置的。所以_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

CC2530之Flash笔记相关推荐

  1. (转)CC2530 ADC学习笔记

    (转自) http://blog.csdn.net/qq_15647227/article/details/53393253 CC2530 ADC学习笔记 CC2530的ADC最大支持14位(实际上为 ...

  2. HAL读写FLASH笔记

    HAL读写FLASH笔记 目录 HAL读写FLASH笔记 1. 整理数据 2. 解锁 3.擦除扇区 4.写入数据 5.上锁 代码整理 写函数 读函数 注意 效果截图 1. 整理数据 FLASH写入函数 ...

  3. CC2530关于flash的地址的问题讲解

    CC2530中有好多款的型号,其中什么F128,F256,F32都是所谓的flash的大小,很多人不知道关于flash的概念,其实需要概念吗? u盘就是典型的flash(可能表达不是很准确),可以读也 ...

  4. 【Flash笔记】Flash-8动画入门常见问题解决办法

    目录 如何制作元件 方法一 方法二 如何对齐 补间动画创建不了 形状补间咋整 怎么保存 怎么打开文件 双击打开出现如下界面↓ 开始界面 点击"创建新项目"中的"Flash ...

  5. Nor Flash笔记--看一图看懂并学会计算Flash大小

    介绍 以华邦256Mb 的W25Q256JV为例.学会看懂以及计算Flash大小 说明 上图中,整个Flash内的包含关系为 Block > Sector > Page 可知,一共有512 ...

  6. TLC Flash 笔记

    TLC flash在每个flash单元中存储三个具有不同编程延迟的位,即LSB(最低有效位).CSB(中央有效位)和MSB(最高有效位).wordline单元中相同类型(编程延迟)的位构成页面.因此, ...

  7. W5500 图片嵌入STM32 FLASH笔记(备忘)

    方法一:利用winHex软件将图片转为16进制数组存储在FALSH中 1 __root const char HDMV_HTML[]="<html>"\ 2 " ...

  8. MLC Flash 笔记

    如图所示,当第一个位(即最小有效位(LSB))被编程时,NAND闪存控制器迅速形成一个阈值电压(Vth)分布,因为它只需要形成两个Vth分布,这两个Vth分布被一个很大的电压边界所分隔.另一方面,当第 ...

  9. zigbee cc2530地址空间 layout 和flash操作

         ... 2.2.2 CPU Memory Space cpu存储空间(以下叫地址空间) XDATA memory space. The XDATA memory map is given i ...

最新文章

  1. 万维网源代码以 NFT 形式拍卖,价值或超 4.5 亿?
  2. 常见蛋白质种类_什么是优质蛋白质?鸡蛋大豆算不算
  3. Angular7教程-06-页面与数据交互
  4. JZOJ 5926. 【NOIP2018模拟10.25】naive 的图
  5. 送书福利 | 浙江大学陈华钧教授新作,全面梳理知识图谱技术体系
  6. spring boot中使用Pagehelper实现分页
  7. ValueError( Shape(4, ?, 1, 20) and () are incompatible
  8. scrapy Crawl_spider
  9. 【leetcode79】Single Number III
  10. detachedcriteria查询去重_sql的简单查询
  11. 机器学习-斯坦福:学习笔记7-最优间隔分类器问题
  12. 九九乘法表(Java)
  13. 古老的txt下传和txt上载
  14. 阿里、腾讯双双辟谣:云计算魅力彰显
  15. Python爬虫新手入门教学(三):爬取链家二手房数据
  16. 各浏览器驱动下载地址及selenium配置
  17. 尤克里里C大调下DO RE MI FA SOl LA XI的这几个音是怎么按的以及为什么这么按
  18. 检查Telerik UI以使用UWP作为PVS-Studio的入门方法
  19. linux硬盘的两个分区合并_linux多个分区合并为一个分区
  20. win10解决桌面图标变白

热门文章

  1. GDCM:gdcm::FilenameGenerator的测试程序
  2. Boost:基于boost::asio单元测试的测试程序
  3. DCMTK:测试文件是否使用DICOM Part 10格式
  4. DCMTK:类DcmUnsigned64bitVeryLong的测试程序
  5. VTK:PolyData之AlignFrames
  6. VTK:网格之FitToHeightMap
  7. VTK:IO之ImageWriter
  8. VTK:Filtering之TransformPolyData
  9. OpenCV FLANN在数据集中搜索查询图片的实例(附完整代码)
  10. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)