CC2530的Flash

CC2530F256内部集成一个增强型8051单片机,拥有8 KB SRAM256 KB内部Flash存储器内部Flash主要用来保存程序代码和常量数据。由于传统8051代码存储空间寻址范围只有64 KB,CC2530把内部256 KBFlash分成8个bank,每一个bank大小是32 KB,通过寄存器FMA P.MAP[2:0]选择不同的bank映射到代码存储空间,解决了寻址空间受限的问题。
    对于OTA客户端,启动代码位于bank0的0x0000~0x0800地址区域,大小为2 KB。其余的254 KB的Flash空间,用来存储当前固件和其他信息。值得注意的是,0x0888~0x088B区域存放了CRC校验信息,0x088C~0x0897区域存放了PREAMBLE,包括镜像大小、制造商ID、镜像类型和镜像版本号信息。另外,bank7最后的14 KB空间(0x7C800~0x7FFFF)用作非易失性(None Volatile,NV)变量区(12 KB)和特定信息保留区(2 KB)。
    OTA系统升级方案有两种,分别是片内Flash升级和片外Flash升级。考虑到一般程序固件大小都超过128KB和以后程序功能升级的扩展性,本文采用片外Flash的方案。采用的片外Flash(M25PE20)容量为256 KB,通过SPI总线与CC2530之间传输数据。

先说一下z-stack中对flash的布局。z-stack将256KBflash的最末八个字节作为zigbee中的IEEE地址,当然在这八个字节之后还有16个字节lock bits,这些flash的lock所需要用的,每2kb1page)的flash有1bit的lock位,那么256kb的flash有128个2kb,1page)的flash有1bit的lock位,那么256kb的flash有128个2kb

1 Bank=16pages=32k

地址:0x8000-0xFFFF

每个2530独特的信息:0x7800-7FFF(2k)

特点:                              注意事项                                                                                   写流程                                         计算FADDR(专用的寄存器)                    擦除FLASH方法                        code sampe

1.  32-bit programmable            写FLASH时时钟不能停,不能改                           设置地址(FADDRH/L)                     cc2530F256:256k                                           关中断                                       #include <iocc2530.h>

2.页擦除(page)                                                                                                   置位 FCTL.WRITE=1                                                                                                  设置擦除面FADDR                    unsigned char erase_page_num = 3;

3.支持DMA写                         不可以进入低功耗模式                                              写FWDATA,查询FCTL.FULL            FADDR=addr>>2(4字节为1字)                         FADDR=addr>>(11-1)               EA=0;  while(FCTL&0x80);

4.、芯片擦除 20ms               时钟不要低于16M(使用stack没有问题)               FCTL》FULL变低后重复写                   FADDRH=(uint8)(FADDR>>8)                   设置FCTL.ERASE                      FADDRH = earse_page_num<<1;

5.写字(4byte)20us            LBF:低位优先                                                    检查超时,或者FLASH锁定                      FADDRL=(uint8)(FADDR)                              等待结束                                   FCTL |=0x01;  while (FCTL &0x80);   EA =!;

原文地址:https://www.cnblogs.com/F-beifeng/p/9714082.html