基于SC95F8523的FLASH读写操作说明

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设置为可操作才行,不然会操作失败

烧写设置如图所示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值