很简单的道理,没有写对,呵呵
PRM文件中的部分:
/* non-paged EEPROM */
EEPROM = READ_ONLY 0x0800 TO 0x0FFB;
/* RAM */
RAM = READ_WRITE 0x2000 TO 0x3FFF;
Start12.c中的;
#define _HCS12_SERIALMON
主函数:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define uchar unsigned char
#define uint unsigned int
#define Dump 0xFFFF
#define EEPROM_ADDR_BASE ((volatile uint *)0x0800)
#define ee_word_program 0x20 // 字编程
#define ee_word_erase 0x40 // 字擦除
#define ee_sector_erase 0x41 // 全部擦除
#define ee_sector_Modify 0x60 //modify with sector
void EEPROM_write_operate(int * Addr,int Data,char OpType);
int EEPROM_read_operate(int * Addr) ;
void EEPROM_init(void);
/*************************************************
EEPROM模块初始化程序
*************************************************/
void EEPROM_init(void)
{
ECLKDIV=0x4A; // 不采用8分频,因为OSCLK=4M,又为了使ECLK
// 达到190KHZ,所以EDIV=21,即ECLK=16M/8*11=190.5KHZ
ECNFG=0x00; // 禁止EEPROM相关操作的中断
while(ECLKDIV_EDIVLD == 0); // 等待时钟设置成功
EPROT_EPOPEN=1; // EEPROM没有保护,可以进行编程与擦除
EPROT_EPDIS=1; // EEPROM保护禁止
}
/*************************************************
写EEPROM程序
Addr: 要操作的EEPROM偏移地址
Data: 要操作的EEPROM数据
OpType:操作命令类型
*************************************************/
void EEPROM_write_operate(int * Addr,int Data,char OpType)
{
DisableInterrupts;
while(ESTAT_CBEIF == 0); // 等待EEPROM命令缓冲区为空
*Addr=Data; // 设置EEPROM的偏移地址
ECMD=OpType; // 指令的类型
ESTAT |= 0x80; // 清命令缓冲标志,开始执行命令
while(ESTAT_CCIF == 0); // 等待命令完成
EnableInterrupts;
}
/*************************************************
读EEPROM程序
Addr: 要操作的EEPROM偏移地址
返回值:读到的结果数据
*************************************************/
int EEPROM_read_operate(int * Addr)
{
int TempData;
DisableInterrupts;
TempData=*Addr; // 读EEPROM的偏移地址的数据
return(TempData);
DisableInterrupts;
}
uint intTempData;
uint i;
void delay1(int cnt){
int i,j;
for(i=0;i<cnt;i++){
j=0x1300;
while(j--);
}
}
/*************************************************
测试部分操作
*************************************************/
void test(void)
{
volatile uint * RamBase;
for(i=0;i<1024;)
{
EEPROM_write_operate(EEPROM_ADDR_BASE+i,Dump,ee_word_erase);
EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xABCD,ee_word_program); //在EEPROM_ADDR_BASE地址写入数据
i=i+1;
EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xef00,ee_word_program);
i=i+1;
//EEPROM_write_operate(EEPROM_ADDR_BASE+i,Dump,ee_word_erase);
//EEPROM_write_operate(EEPROM_ADDR_BASE+i,0xef00,ee_word_program); //在EEPROM_ADDR_BASE地址写入数据
//i=i+1;
intTempData=EEPROM_read_operate(EEPROM_ADDR_BASE+i-1); //读0xFC0800地址的EEPROM区数据
intTempData=~intTempData;
PORTB=intTempData;
delay1(20);
PORTB=intTempData>>4;
delay1(20);
}
//flash_erase_word(0xFA,0x8000);
//flash_write_word(0xFA,0x8000,0x1234);
}
void main(void) {
/* put your own code here */
DDRB=0xff;
EEPROM_init();
test();
EnableInterrupts;
for(;;) {
} /* wait forever */
/* please make sure that you never leave this function */
}
版主帮帮忙哈,谢谢版主!
怎么上传不了呢???
[此贴子已经被作者于2008-11-22 12:52:49编辑过]
[此贴子已经被作者于2008-11-22 15:02:14编辑过]
那个已经在Start12.c中改过了(#define _HCS12_SERIALMON),那些存储寄存器已经是和在PRM地址分配对应的了!
我后来把EEPROM的中断也开了,发现有中断产生,在EEPROM的映射地址空间也写入了!但是一旦断电之后再上电,里面的程序还是没有变,这样岂不是又要重新对EEPROM进行操作?
还有就是重新写入新的程序只是去读取上一个程序中写EEPROM中的内容时,EEPROM的映射地址空间的内容全部为0XFF,是不是因为BDM的原因?它会在烧写程序的时候对所有的存储区间进行清零?如果是这样的话,那我们怎么验证EEPROM断电数据不丢失的作用呢?
[此贴子已经被作者于2008-11-24 14:50:29编辑过]
谢谢版主,帮帮忙哈!
能不能提供一个关于EEPROM的程序给我??!
[此贴子已经被作者于2008-11-24 14:49:43编辑过]
如果是通过BDM和调试软件重新启动并连接目标板的话,那可能会将所有内存,包括EEPROM全部擦除。你可以在调试软件的界面中设置不擦除EEPROM。你可以参考这个帖子:
http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=120632&ID=120632
感谢版主!
问题解决了,感谢斑竹!!!!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |