6. 存储器结构

6. 存储器结构

6.1 存储器空间

CH559寻址空间分为程序存储空间、内部数据存储空间、外部数据存储空间。

图6.1 存储器结构图

Memory_structure

6.2 程序存储空间

程序存储空间共64KB,如图6.1所示,已全部用于flash-ROM,包括保存指令代码的CodeFlash区域、保存非易失数据的DataFlash区域、以及配置信息ConfigurationInformation区域。

DataFlash地址范围为F000h到F3FFH,支持单字节读(8位)、双字节写(16位)、块擦除(1K字节)操作,芯片掉电后数据保持不变,也可用作CodeFlash。

CodeFlash包括低地址区域的应用程序代码和高地址区域的引导程序代码,也可将这两块区域以及DataFlash合并用于保存单一应用程序代码。

配置信息ConfigurationInformation共16位数据,由编程器根据需要设定,参考表6.1。

表6.2flash-ROM配置信息描述

位地址位名称说明建议值
15Code_Protectflash-ROM中的代码和数据保护模式:
0-禁止编程器读出,程序保密;1-允许读出
0/1
14No_Boot_Load使能BootLoader引导代码启动模式:
0-从0000h地址的应用程序启动;
1-从F400h地址的引导程序启动
1
13En_Long_Reset使能上电复位期间的额外延时复位:
0-标准短复位;1-宽复位,额外增加87mS复位时间
0
12XT_OSC_Strong选择晶体振荡器的对外驱动能力:0-标准;1-增强0
11En_P5.7_RESET使能P5.7作为手工复位输入引脚:0-禁止;1-使能RST1
10En_P0_Pullup使能系统复位期间P0端口的内部上拉电阻:
0-复位后禁止上拉电阻;1-复位后启用上拉电阻
1
9Must_1(由编程器根据需要自动设定为1)1
8Must_0(由编程器根据需要自动设定为0)0
[7:0]All_1(由编程器根据需要自动设定为FFh)FFh

6.3 数据存储空间

内部数据存储空间共256字节,如图6.1所示,已全部用于SFR和iRAM,其中iRAM用于堆栈和快速数据暂存,可细分为工作寄存器R0-R7、位变量bdata、字节变量data、idata等。

外部数据存储空间共64KB,如图6.1所示,部分用于6KB片内扩充xRAM和xSFR,除了两块保留区域之外,剩余的4000h到FFFFh地址范围是外部总线区域。

6.4 flash-ROM寄存器

表6.4 flash-ROM操作寄存器列表

名称地址描述复位值
ROM_DATA_H8Fhflash-ROM数据寄存器高字节xxh
ROM_DATA_L8Ehflash-ROM数据寄存器低字节xxh
ROM_DATA8EhROM_DATA_L和ROM_DATA_H组成16位SFRxxxxh
ROM_STATUS86hflash-ROM状态寄存器(只读)80h
ROM_CTRL86hflash-ROM控制寄存器(只写)00h
ROM_ADDR_H85hflash-ROM地址寄存器高字节xxh
ROM_ADDR_L84hflash-ROM地址寄存器低字节xxh
ROM_ADDR84hROM_ADDR_L和ROM_ADDR_H组成16位SFRxxxxh

flash-ROM地址寄存器(ROM_ADDR):

名称访问描述复位值
[7:0]ROM_ADDR_HRWflash-ROM地址高字节xxh
[7:0]ROM_ADDR_LRWflash-ROM地址低字节,只支持偶地址xxh

flash-ROM数据寄存器(ROM_DATA):

名称访问描述复位值
[7:0]ROM_DATA_HRWflash-ROM待写数据高字节xxh
[7:0]ROM_DATA_LRWflash-ROM待写数据低字节xxh

flash-ROM控制寄存器(ROM_CTRL):

名称访问描述复位值
[7:0]ROM_CTRLW0flash-ROM控制寄存器00h

flash-ROM状态寄存器(ROM_STATUS):

名称访问描述复位值
7保留R0保留1
6bROM_ADDR_OKR0flash-ROM操作地址有效状态位:
该位为0表示参数无效;为1表示地址有效
0
[5:2]保留R0保留0000b
1bROM_CMD_ERRR0flash-ROM操作命令错误状态位:
该位为0表示命令有效;为1表示是未知命令
0
0bROM_CMD_TOUTR0flash-ROM操作结果状态位:
该位为0表示操作成功;为1表示操作超时
0

6.5 flash-ROM操作步骤

  1. 擦除flash-ROM,将目标块中全部数据位变为1:

    1. 使能安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
    2. 设置全局配置寄存器GLOBAL_CFG开启写使能(bCODE_WE或bDATA_WE对应code或data);
    3. 设置地址寄存器ROM_ADDR,写入16位目标地址,实际仅高6位有效;
    4. 设置操作控制寄存器ROM_CTRL为0A6h,执行块擦除操作,操作期间程序自动暂停运行;
    5. 操作完成后程序恢复运行,此时查询状态寄存器ROM_STATUS可以查看此次操作状态;如果要擦除多个块,则循环(3)、(4)、(5)步骤;
    6. 再次进入安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
    7. 设置全局配置寄存器GLOBAL_CFG开启写保护(bCODE_WE=0,bDATA_WE=0)。
  2. 写flash-ROM,将目标双字节中部分数据位从1变为0:

    1. 使能安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
    2. 设置全局配置寄存器GLOBAL_CFG开启写使能(bCODE_WE或bDATA_WE对应code或data);
    3. 设置地址寄存器ROM_ADDR,写入16位目标地址,实际仅高15位有效;
    4. 设置数据寄存器ROM_DATA,写入16位要写入的数据,步骤(3)、(4)顺序可对调;
    5. 设置操作控制寄存器ROM_CTRL为09Ah,执行写操作,操作期间程序自动暂停运行;
    6. 操作完成后程序恢复运行,此时查询状态寄存器ROM_STATUS可以查看此次操作状态;如果要写多个数据,则循环(3)、(4)、(5)、(6)步骤;
    7. 再次进入安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
    8. 设置全局配置寄存器GLOBAL_CFG开启写保护(bCODE_WE=0,bDATA_WE=0)。
  3. 读flash-ROM:

    1. 直接使用MOVC指令,或通过指向程序存储空间的指针,读取目标地址的code或data。

6.6 在板编程和ISP下载

当配置信息Code_Protect=1时,CH559芯片flash-ROM中的代码和数据可以由外部的编程器通过同步串行接口读写;当配置信息Code_Protect=0时,flash-ROM中的代码和数据被保护,无法读出,但是可以被擦除,擦除后重新上电则解除代码保护。

当CH559芯片被预置了BootLoader引导程序后,CH559可以支持USB或者异步串口等多种ISP下载方式加载应用程序;但在没有引导程序的情况下,CH559只能由外部专用编程器写入引导程序或者应用程序。为了支持在板编程,电路中需要预留CH559与编程器之间的5根连接引脚。

表6.6.1 与编程器之间的连接引脚

引脚GPIO引脚描述
RSTP5.7编程状态下的复位控制引脚,高电平允许进入编程状态
SCSP1.4编程状态下的片选输入引脚,默认高电平,低电平有效
SCKP1.7编程状态下的时钟输入引脚
MOSIP1.5编程状态下的数据输入引脚
MISOP1.6编程状态下的数据输出引脚

6.7 芯片唯一ID号

每只单片机出厂时都具有唯一ID号,即芯片身份识别号。该ID数据及其校验和共8个字节,存储于专用只读存储器的偏移地址为20h的区域中,可以在E_DIS为1关闭全局中断的期间通过类似读CodeFlash的方式获取,具体操作请参考C语言例子程序GETID.C。

表6.7.1 芯片ID地址表

偏移地址ID数据描述
20h, 21hID首字数据,依次是ID号的最低字节、次低字节
22h, 23hID次字数据,依次是ID号的次高字节、高字节
24h, 25hID末字数据,依次是48位ID号的次最高字节、最高字节
26h, 27hID首字、次字、末字数据的16位累加和,用于ID校验

ID号可以配合下载工具用于对目标程序进行加密,一般的应用,只需使用到ID号前32位。