文章目录
1、FLASH ROM
1.1、概述
Flash ROM叫APROM,SC9F8523有32Kbyte的flashROM。地址为(00)0000H~7FFFH,00为拓展地址,有IAPADE寄存器设定。
1.2、特性
64个扇区(Sector),每个sector为512bytes,烧录时目标地址所属的Sector都会被烧录器强制擦除,再写入数据;进行写操作FLASH时,必须先擦除,再写入数据。Sector分区示意图如下图所示
1.3、IAP–In Application Programming
烧写时可以通过Code Option将32的FLASH设置为允许IAP操作的范围:0K、1K、2K或32K,对FLASH进行IAP写操作时,必须对目标地址所属的Sector进行扇区擦除操作,一个Sector 512 bytes
2、IAP操作相关寄存器
2.1、IAPKEY—数据保护寄存器
写入一个大于0x40的值n,含义如下
- 打开IAP功能
- n个系统时钟后如果接收不到IAP写入命令,则IAP功能被重新关闭
2.2、IAPADL—IAP写入地址低位寄存器
- IAP写入地址低8位
2.3、IAPADH—IAP地址写入高位寄存器
- IAP写入地址高八位
2.4、IAPADE—IAP扩展地址寄存器
- 0x00:MOVC和IAP都针对Flash ROM进行
- 0x01:针对Unique ID区域进行读操作,不允许进行擦写操作,否则引起异常
2.5、IAPDAT—IAP数据寄存器
IAPDAT:IAP写入的数据
2.6、IAPCTL—IAP控制寄存器
-
位5:SERASE–扇区擦除控制位
0:无操作
1:置"1"后再配置CMD[1:0] = 10;则进入flash rom扇区擦除操作
-
位4:PRG–编程控制位
0:无操作
1:置"1"后再配置CMD[1:0] = 10;则进入flash rom扇区写操作
-
位2:BTLD–BootLoader控制位
0:Reset后程序从主程序区(main)开始运行
1:Reset后程序从BootLoader区开始运行
-
位1~0:CMD[1:0] --IAP命令使能控制位
10:执行写入扇区或扇区擦除操作命令
其他:保留
3、IAP操作参考代码
3.1、扇区擦除
#include "flash.h"
#define IapROM 0x00 //0x00:选择ROM区操作 0x02:选择Unique ID唯一ID
#define FLASH_PAGE_HEAD_ADDRESS 0x7E00 //FLSAH最后一个扇区的起始地址
static void IAPEraseSector(unsigned int Addr, unsigned char IAPArea)
{
EA = 0; //关闭总中断
IAPADE = IAPArea; //IAPArea=0x00:选择Flash ROM区操作
IAPADH = (Addr >> 8); //写入地址的高8位
IAPADL = Addr; //写入地址的低8位
IAPKEY = 0xF0; //0xF0个时钟后,接受不到IAP指令,则关闭IAP功能
IAPCTL = 0x20; //置起扇区擦除位
IAPCTL |= 0x02; //执行写操作,CMD[1:0] = 10
_nop_(); //等待至少8个nop()
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EA = 1; //开启总中断
}
void FlashErase()
{
IAPEraseSector(FLASH_PAGE_HEAD_ADDRESS + 0, IapROM);
}
3.1、写数据
#include "flash.h"
#define IapROM 0x00 //0x00:选择ROM区操作 0x02:选择Unique ID唯一ID
#define FLASH_PAGE_HEAD_ADDRESS 0x7E00 //FLSAH最后一个扇区的起始地址
static void IAPWrite(unsigned int Addr, unsigned char Value, unsigned char IAPArea)
{
EA = 0; //关闭总中断
IAPADE = IAPArea; //IAPArea=0x00:选择Flash ROM区操作
IAPDAT = Value; //写入数据Data
IAPADH = (Addr >> 8); //写入地址的高8位
IAPADL = Addr; //写入地址的低8位
IAPKEY = 0xF0; //0xF0个时钟后,接受不到IAP指令,则关闭IAP功能
IAPCTL = 0x10; //置起IAP写入操作
IAPCTL |= 0x02; //执行写操作,CMD[1:0] = 10
_nop_(); //等待至少8个nop()
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
EA = 1; //开启总中断
}
void FlashWriteByte(uint8 adr, uint8 dat)
{
IAPWrite(FLASH_PAGE_HEAD_ADDRESS + adr, dat, IapROM);
}
3.1、读数据
#include "flash.h"
#define IapROM 0x00 //0x00:选择ROM区操作 0x02:选择Unique ID唯一ID
static unsigned char IAPRead(unsigned int Addr, unsigned char IAPArea)
{
unsigned char ReadValue = 0x00;
EA = 0; //关闭总中断
IAPADE = IAPArea; //IAPArea=0x00:选择Flash ROM区操作
ReadValue = *((unsigned char code *)(Addr)); //读取的数据
EA = 1; //开启总中断
return ReadValue;
}
uint8 FlashReadByte(uint8 adr)
{
return IAPRead(FLASH_PAGE_HEAD_ADDRESS + adr, IapROM);
}
4、注意事项
4.1、flash操作权限
IAP操作flash时,需要将FLASH设置为可操作才行,不然会操作失败
烧写设置如图所示: