首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教QY4中用FLASH仿真EEPROM的程序。

请教QY4中用FLASH仿真EEPROM的程序。

请教一下,我想用FLASH实现EEPROM的功能,我看到网上有参考程序,但是我发现实际调试的时候有很多问题,哪怕在make的时候通过了,在debug的时候还是不行。下面是我修改后的程序,有些问题想象大家请教。
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include /* include peripheral declarations */

#define FBUS 3200000 //总线速度 3.2M
#define ERARNGE() {asm jsr 0x2806;} //跳到0x2806执行
#define PGRRNGE() {asm jsr 0x2809;} //跳到0x2809执行
#define CTRLBYT (*(volatile unsigned char*) (0x88))//存放控制位的RAM地址
#define CPUSPD (*(volatile unsigned char*) (0x89)) //存总线速度的RAM地址
//LADDRH,LADDRL存储FLASH编程末尾地址的RAM地址
#define LADDRH (*(volatile unsigned char*) (0x8A))
#define LADDRL (*(volatile unsigned char*) (0x8B))
#define OSC_CONST FBUS/250000 //总线速度(单位:0.25MHz)
#define FLASH_TEST_ADDRESS 0xFD40 //存放数据的FLASH页的首地址
#define RECEIVE_LENGTH 2 //编程数据的长度
unsigned char My_Receive[RECEIVE_LENGTH]@0x8C; //存储编程数据的RAM区


void MCU_init(void); /* Device initialization function declaration */

void ProgramRange(unsigned int *_ini, unsigned char _num) //FLASH编程函数
{
unsigned int _first;
_first = *_ini; //要编程的起始地址
CPUSPD = OSC_CONST; //总线速度
LADDRH = ((_first + _num -1) & 0xFF00) >> 8;
LADDRL = ((_first + _num -1) & 0x00FF); //要编程的末尾地址
asm LDHX _first; //将要编程的地址装入H,X寄存器
PGRRNGE(); //调用编程函数
return;
}

void EraseRow(unsigned int _row) //FLASH擦除函数
{
unsigned int _address;
_address = _row; //要擦除的起始地址
CPUSPD = OSC_CONST; //总线速度
CTRLBYT &= 0xBF; //控制字,页擦除
asm ldhx _address; //将要擦除的地址装入H,X寄存器
ERARNGE(); //调用擦除函数
return;
}


void main(void) {
unsigned int address;
unsigned char *ptr;
/* Uncomment this function call after using Device Initialization
to use the generated code */
/* MCU_init(); */

EnableInterrupts; /* enable interrupts */

address = FLASH_TEST_ADDRESS;
CTRLBYT=0xf0;
EraseRow(address); //擦除地址从FLASH_TEST_ADDRESS开始的一页
My_Receive[0] = 0x18; //要写入FLASH中的数据
My_Receive[1] = 0x08; //要写入FLASH中的数据
//从FLASH_TEST_ADDRESS开始写入RECEIVE_LENGTH个字节
ProgramRange (&address, RECEIVE_LENGTH);
EnableInterrupts; /* enable interrupts */
for(;;)
{
ptr=(unsigned char *) (0xFD40); //把FLASH中刚写入的值读出来
}



/* please make sure that you never leave this function */
}

我发现CTRLBYT没有赋初始值,所以在执行CTRLBYT &= 0xBF;这句的时候有问题,我就随便给了CTRLBYT一个初始值0XF0,不知道有没有问题,此外程序执行到 ERARNGE(); //调用擦除函数// 这一句的时候就出现错误显示Error: At location 2806 -
Error: Attempt to execute from unimplemented (--) ROM
不知道是什么原因,哪位可否指导一下啊。多谢啊。

怎么没人回答啊。没人遇到我这样的情况吗?斑竹大人呢?
CTRLBYT已经在这里赋了初值:

#define CTRLBYT (*(volatile unsigned char*) (0x88))//存放控制位的RAM地址
海纳百川  有容乃大
flash擦除和编写的程序是不是只能硬件仿真啊。
还有,请问一下,我想用MUTILINK来对芯片进行烧写和仿真。有没有相应的QY4的外围电路可以参考啊。
FLASH操作只能在硬件上进行。而且因为其操作有时间的要求,一般也不能打断其进程进行仿真和调试。你说的QY4外围电路指的是什么?实际上它只需要电源就可以工作了。它于MULTILINK的接口电路可以在数据手册中找到。
海纳百川  有容乃大
不需要外部晶振吗?
QY4有内部振荡器。
海纳百川  有容乃大
返回列表