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编辑过] |