Board logo

标题: 请教QY4中用FLASH仿真EEPROM的程序。 [打印本页]

作者: 迦陵频伽    时间: 2007-3-3 20:40     标题: 请教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
不知道是什么原因,哪位可否指导一下啊。多谢啊。


作者: 迦陵频伽    时间: 2007-3-4 13:40

怎么没人回答啊。没人遇到我这样的情况吗?斑竹大人呢?
作者: strongchen    时间: 2007-3-5 09:32

CTRLBYT已经在这里赋了初值:

#define CTRLBYT (*(volatile unsigned char*) (0x88))//存放控制位的RAM地址
作者: 迦陵频伽    时间: 2007-3-5 12:25

flash擦除和编写的程序是不是只能硬件仿真啊。
作者: 迦陵频伽    时间: 2007-3-5 12:30

还有,请问一下,我想用MUTILINK来对芯片进行烧写和仿真。有没有相应的QY4的外围电路可以参考啊。
作者: strongchen    时间: 2007-3-5 14:18

FLASH操作只能在硬件上进行。而且因为其操作有时间的要求,一般也不能打断其进程进行仿真和调试。你说的QY4外围电路指的是什么?实际上它只需要电源就可以工作了。它于MULTILINK的接口电路可以在数据手册中找到。
作者: 迦陵频伽    时间: 2007-3-5 15:17

不需要外部晶振吗?
作者: strongchen    时间: 2007-3-5 15:40

QY4有内部振荡器。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0