目录

CC2530 存储架构

在理解CC2530的51内核存储结构上面吃力了。先提出疑问,在swru191f-CC253xSystem-on-ChipSolutionfor2.4-GHz IEEE 802.15.4andZigBee® Application .pdf上面介绍如下的存储空间,但是确找不到对应的sram和256kb的flash 映射空间。

8051 CPU 架构

在CC2530的Dtasheet上面详细介绍了8051 CPU的存储架构

swru191f-CC253xSystem-on-ChipSolutionfor2.4-GHz IEEE 802.15.4andZigBee® Application .pdf->2 8051 CPU->2.2 Memory。

对于8051的CPU存储空间,区分以下4类;

对于以上CODE和DATA存储空间需要特别注意

XDATA

CODE

疑问

看到这里,如果说8kb的sram可以同时支持映射在如上图的CODE中间区域和XDATA起始区域。256kb的flash又映射到哪里了?

原来这里还需要回头看看系统架构。

8051 CPU CORE和物理存储器之间还有一个MEMMORY ARBITER存储仲裁者。而该控制器会通过寄存器控制选型将256kb的flash再以32kb为单位做选择性映射。

如上的MEMCTRFMAP其实支持把Flash映射到 XDATACODE,理顺是改区域的用途,例如存储代码和常量只需要映射到CODE。做Nv就需要到XDATA区域。

我们快速验证hal_flash.c 作为nv中的实际pg 和偏移地址到 xbank的映射的配置。

//hal_falsh.c HalFlashRead Line.70
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 *pData = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) +
                 ((pg % HAL_FLASH_PAGE_PER_BANK) * HAL_FLASH_PAGE_SIZE);
  uint8 memctr = MEMCTR;  // Save to restore.
  // Calculate and map the containing flash bank into XDATA.
  MEMCTR = (MEMCTR & 0xF8) | pg;
  while (cnt--)  {
    *buf++ = *pData++;
  }
  MEMCTR = memctr;
}

从Hex文件找出变量的NV值

对于如下的registered 变量我们如何找出他对应hex的存储位置。

osal_nv_item_init(MXJ_NV,1,NULL);  //初始化NV条目
if(osal_nv_read(MXJ_NV,0,1,&registered)!=SUCCESS)

在线Debug,找到如上osal_nv_read->HalFlashRead pg=121 offset= 848;

address=121*2048+848;