6. 存储器结构
6.1 存储器空间
CH559寻址空间分为程序存储空间、内部数据存储空间、外部数据存储空间。
图6.1 存储器结构图

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配置信息描述
| 位地址 | 位名称 | 说明 | 建议值 |
|---|---|---|---|
| 15 | Code_Protect | flash-ROM中的代码和数据保护模式: 0-禁止编程器读出,程序保密;1-允许读出 | 0/1 |
| 14 | No_Boot_Load | 使能BootLoader引导代码启动模式: 0-从0000h地址的应用程序启动; 1-从F400h地址的引导程序启动 | 1 |
| 13 | En_Long_Reset | 使能上电复位期间的额外延时复位: 0-标准短复位;1-宽复位,额外增加87mS复位时间 | 0 |
| 12 | XT_OSC_Strong | 选择晶体振荡器的对外驱动能力:0-标准;1-增强 | 0 |
| 11 | En_P5.7_RESET | 使能P5.7作为手工复位输入引脚:0-禁止;1-使能RST | 1 |
| 10 | En_P0_Pullup | 使能系统复位期间P0端口的内部上拉电阻: 0-复位后禁止上拉电阻;1-复位后启用上拉电阻 | 1 |
| 9 | Must_1 | (由编程器根据需要自动设定为1) | 1 |
| 8 | Must_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_H | 8Fh | flash-ROM数据寄存器高字节 | xxh |
| ROM_DATA_L | 8Eh | flash-ROM数据寄存器低字节 | xxh |
| ROM_DATA | 8Eh | ROM_DATA_L和ROM_DATA_H组成16位SFR | xxxxh |
| ROM_STATUS | 86h | flash-ROM状态寄存器(只读) | 80h |
| ROM_CTRL | 86h | flash-ROM控制寄存器(只写) | 00h |
| ROM_ADDR_H | 85h | flash-ROM地址寄存器高字节 | xxh |
| ROM_ADDR_L | 84h | flash-ROM地址寄存器低字节 | xxh |
| ROM_ADDR | 84h | ROM_ADDR_L和ROM_ADDR_H组成16位SFR | xxxxh |
flash-ROM地址寄存器(ROM_ADDR):
| 位 | 名称 | 访问 | 描述 | 复位值 |
|---|---|---|---|---|
| [7:0] | ROM_ADDR_H | RW | flash-ROM地址高字节 | xxh |
| [7:0] | ROM_ADDR_L | RW | flash-ROM地址低字节,只支持偶地址 | xxh |
flash-ROM数据寄存器(ROM_DATA):
| 位 | 名称 | 访问 | 描述 | 复位值 |
|---|---|---|---|---|
| [7:0] | ROM_DATA_H | RW | flash-ROM待写数据高字节 | xxh |
| [7:0] | ROM_DATA_L | RW | flash-ROM待写数据低字节 | xxh |
flash-ROM控制寄存器(ROM_CTRL):
| 位 | 名称 | 访问 | 描述 | 复位值 |
|---|---|---|---|---|
| [7:0] | ROM_CTRL | W0 | flash-ROM控制寄存器 | 00h |
flash-ROM状态寄存器(ROM_STATUS):
| 位 | 名称 | 访问 | 描述 | 复位值 |
|---|---|---|---|---|
| 7 | 保留 | R0 | 保留 | 1 |
| 6 | bROM_ADDR_OK | R0 | flash-ROM操作地址有效状态位: 该位为0表示参数无效;为1表示地址有效 | 0 |
| [5:2] | 保留 | R0 | 保留 | 0000b |
| 1 | bROM_CMD_ERR | R0 | flash-ROM操作命令错误状态位: 该位为0表示命令有效;为1表示是未知命令 | 0 |
| 0 | bROM_CMD_TOUT | R0 | flash-ROM操作结果状态位: 该位为0表示操作成功;为1表示操作超时 | 0 |
6.5 flash-ROM操作步骤
-
擦除flash-ROM,将目标块中全部数据位变为1:
- 使能安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
- 设置全局配置寄存器GLOBAL_CFG开启写使能(bCODE_WE或bDATA_WE对应code或data);
- 设置地址寄存器ROM_ADDR,写入16位目标地址,实际仅高6位有效;
- 设置操作控制寄存器ROM_CTRL为0A6h,执行块擦除操作,操作期间程序自动暂停运行;
- 操作完成后程序恢复运行,此时查询状态寄存器ROM_STATUS可以查看此次操作状态;如果要擦除多个块,则循环(3)、(4)、(5)步骤;
- 再次进入安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
- 设置全局配置寄存器GLOBAL_CFG开启写保护(bCODE_WE=0,bDATA_WE=0)。
-
写flash-ROM,将目标双字节中部分数据位从1变为0:
- 使能安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
- 设置全局配置寄存器GLOBAL_CFG开启写使能(bCODE_WE或bDATA_WE对应code或data);
- 设置地址寄存器ROM_ADDR,写入16位目标地址,实际仅高15位有效;
- 设置数据寄存器ROM_DATA,写入16位要写入的数据,步骤(3)、(4)顺序可对调;
- 设置操作控制寄存器ROM_CTRL为09Ah,执行写操作,操作期间程序自动暂停运行;
- 操作完成后程序恢复运行,此时查询状态寄存器ROM_STATUS可以查看此次操作状态;如果要写多个数据,则循环(3)、(4)、(5)、(6)步骤;
- 再次进入安全模式,SAFE_MOD=55h;SAFE_MOD=0AAh;
- 设置全局配置寄存器GLOBAL_CFG开启写保护(bCODE_WE=0,bDATA_WE=0)。
-
读flash-ROM:
- 直接使用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 | 引脚描述 |
|---|---|---|
| RST | P5.7 | 编程状态下的复位控制引脚,高电平允许进入编程状态 |
| SCS | P1.4 | 编程状态下的片选输入引脚,默认高电平,低电平有效 |
| SCK | P1.7 | 编程状态下的时钟输入引脚 |
| MOSI | P1.5 | 编程状态下的数据输入引脚 |
| MISO | P1.6 | 编程状态下的数据输出引脚 |
6.7 芯片唯一ID号
每只单片机出厂时都具有唯一ID号,即芯片身份识别号。该ID数据及其校验和共8个字节,存储于专用只读存储器的偏移地址为20h的区域中,可以在E_DIS为1关闭全局中断的期间通过类似读CodeFlash的方式获取,具体操作请参考C语言例子程序GETID.C。
表6.7.1 芯片ID地址表
| 偏移地址 | ID数据描述 |
|---|---|
| 20h, 21h | ID首字数据,依次是ID号的最低字节、次低字节 |
| 22h, 23h | ID次字数据,依次是ID号的次高字节、高字节 |
| 24h, 25h | ID末字数据,依次是48位ID号的次最高字节、最高字节 |
| 26h, 27h | ID首字、次字、末字数据的16位累加和,用于ID校验 |
ID号可以配合下载工具用于对目标程序进行加密,一般的应用,只需使用到ID号前32位。