/****************************************************************************************
 * KF8A系列单片机	KF8A100EON_DEMO	开发板演示程序
 * 标    题: Flash实验
 * 项目名: 08- Flash_WR_Test
 * 开发环境：ChipON IDE
 * 版          本     ：V1.0 (2019/07/23)
 * 作 者: 上海芯旺微电子有限公司
 * 功能简述：测试flash的读写操作，自写区域为
 * 如程序所示，对相应的地址进行操作，操作结果通过断电 使用PRO读取。
 * 程序会占用不确定的FLASH地址，因此你需要确定用于自写的块或确保当前使用地址为非程序区
 * 当前芯片的可自写范围：800H~1FDFH，
 * 实现方法在该项目目录中建立occupancy.txt的文件，添加地址占用描述使编译器跳过该段区域的实现
 * 			格式：
 *			一行一条记录，一条记录由3部分组成标识、起始地址、结束地址。
 *			文件可以包含任意多条记录
 *			标识用于标记占用数据段RAM还是代码段CODE，可以是code或者是data。
 *			起始地址结束地址使用十六进制表示。
 *			占用包含起始和结束地址。
 *
 *			例如
 *			data 0x180 0x190
 *			code 0x800 0x810
 * 硬件说明：
 * 跳线接法：单片机供电选择为3.3V或5V
 ****************************************************************************************/
#include<KF8A100EON.h>
#include "include.h"

//定义到指定Flash区域，使用PRO读出为B0扩展指令
const unsigned int __at(0x1E58) test=0x1234;

void Sys_Init(void)
{
	OSCCTL = 0x70;		//时钟配置为内部16M
	TR0=0;
	TR1=0;
	TR2=0;
	TR3=0;
	P0=0;
	P1=0;
	P2=0;
	P3=0;
}

//主函数
void main()
{
	unsigned char i;
	unsigned int temp=0;

	Sys_Init();

	//--- 准备待写入的数据0x0000 0x1111 0x2222...0xFFFF  0x1110  0x2221  0x3332 ...0xFFFE 0x110F
		for (i = 0; i < FLASH_BUFFER_MAX; i++)
		{
			FLASH_BUFFER[i] = temp;
			temp += 0x1111;
		}

	//---setp 1 		写入到0x1E60 和0x1E80的FLASH空间 (页的首地址)
		FLASH_WRITE_FUN(0x1E60,FLASH_BUFFER_MAX);
		FLASH_WRITE_FUN(0x1E80,FLASH_BUFFER_MAX);
	//--- setp 2 		读取 0x1E71，并写入到0x1EB5
		// 读取所需到缓存
		temp=FLASH_READ_ONE(0x1E71);
		// 非需要段的任意数据填充
		for (i = 0; i < 16; i++)
		{
			FLASH_BUFFER[i] = 0x0000;
		}
		//应该擦除0x1EA0页的数据 以便后续以0x1EB0开始的块写，如果确定该页为0xFFFF，可以跳过
		FLASH_WRITE_FUN(0x1EA0,16);
		// 修改要写入的值
		FLASH_BUFFER[5]=temp;
		FLASH_BUFFER[6]=0xFF33; //验证 用 0x1FB6
		// 执行0x0F98块的写入
		FLASH_WRITE_FUN(0x1EB0,16);


	//--- setp 3	将OX0F69中的数据修改为0X55AA
	#if 1	// 0 或  1
		FLASH_WRITE_ONE(0x1E69,0x55AA);
	#else
		FLASH_READ_FUN(0x1E60,FLASH_BUFFER_MAX);	//缓存必须满足操作对应大小，不满足整页时，后续数据被删空
		FLASH_BUFFER[9]=0x55AA;
		FLASH_WRITE_FUN(0x1E60,FLASH_BUFFER_MAX);
	#endif

	while(1)
	{

	}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{

}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}
