关于EEPROM配置的问题!

[复制链接]
1247|6
手机看帖
扫描二维码
随时随地手机跟帖
谢谢谢林达|  楼主 | 2017-8-15 15:31 | 显示全部楼层 |阅读模式
我用的是mc9s12x系列的板子,请问各位老哥这个板子的EEPROM怎么配置呢?刚接触掉电存储这块,很蒙,关于地址的定义,很模糊,希望老哥指点一下!

相关帖子

谢谢谢林达|  楼主 | 2017-8-15 16:42 | 显示全部楼层

使用特权

评论回复
dirtwillfly| | 2017-8-16 20:19 | 显示全部楼层
你说的是内部eeprom吧?
网上就有例程的http://www.**.com/chiusir/blog/09-11/180206_1d745.html

使用特权

评论回复
dirtwillfly| | 2017-8-16 20:21 | 显示全部楼层
链接发不了,给你粘贴在这里吧
下面是一个完整的MC9S12DG128 EEPROM读写程序,程序来源于网络,反馈于网络,对大家肯定有用!下面仅贴出部分主文件和主函数,完整工程可以下载附件,开发板用户可以直接操作演示程序。

/********************************************************
龙丘MC9S12DG128 多功能开发板
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.2
最后更新:2009年8月25日

------------------------------------
Code Warrior 5.0
Target : MC9S12dg128b
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz  
------------------------------------
【程序使用说明】:
【重要修改】
在Start12.c文件最前面加入:#define _HCS12_SERIALMON
在Project.prm中:
     添加下面的代码:
       EEPROM        = READ_ONLY     0x0800 TO   0x0FFB;
     修改下面的代码:
       RAM           = READ_WRITE    0x2000 TO   0x3FFF;
      
【串口波特率】:9600,n,8,1
【按UP】    修改欲写入的数据
【按OK】    对块的读操作
【按ESC】   对块的重新写入数据

【使用步骤】:
1.插上电源和串口线,并打开串口调试工具
2.按ESC读取原始数据
3.按UP/DOWN修改欲写入的数据
4.按OK写入新数据
5.复位单片机然后按ESC读取上次写入的数据,比对保存结果.   
*****************************************************************************************/
#i nclude <hidef.h>     
#i nclude "derivative.h"
#i nclude "LQprintp.h"
#i nclude "LQEEPROM.h"

volatile word testnumber=0;
/**************************************************
复杂测试操作:
1.按ESC读取原始数据
2.按UP/DOWN修改欲写入的数据
3.按OK写入新数据
4.复位单片机然后按ESC读取上次写入的数据,比对保存结果.
***************************************************/
void Test_EE_WriteRead(void)
{
     word cnt;
     
     if(PTIH_PTIH7==0)       //OK
     {
        printp("write and read data:\n");
        for(cnt=0;cnt<10;cnt+=2)         
        {           
           EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);   
           EEP_Wt_Word(EEPROM_ADDR_BASE+cnt  ,0x1200+cnt+testnumber  ,EEP_Word_Prog);
           EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+testnumber+1,EEP_Word_Prog);
           u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
           printp("%04x,",u16tmData);
           u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
           printp("%04x,",u16tmData);         
        }
        printp("\n");
     }
     else if(PTIH_PTIH6==0)  //ESC
     {
        printp("read data:\n");
        for(cnt=0;cnt<10;cnt+=2)         
        {
          u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
          printp("%04x,",u16tmData);
          u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
          printp("%04x,",u16tmData);           
        }
        printp("\n");  
     }
     else if(PTIH_PTIH2==0)  //UP
     {      
       printp("cnt:%04x \n",++testnumber);
     }
     else if(PTIH_PTIH5==0)  //DOWN
     {      
       printp("cnt:%04x \n",--testnumber);
     }
}
/**************************************************
总线时钟初始化函数:16MHz=晶振频率
编写:龙丘
最后修改:2009.11.18
***************************************************/
static void Set_Bus_16M(void)
{   
     CLKSEL=0X00;    //disengage PLL to system
     PLLCTL_PLLON=1;   //turn on PLL
     SYNR=1;         
     REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
     _asm(nop);          //BUS CLOCK=16M
     _asm(nop);
     while(!(CRG**_LOCK==1));   //when pll is steady ,then use it;
     CLKSEL_PLLSEL =1;          //engage PLL to system;
}

/**************************************************
main()
编写:龙丘
最后修改:2009.11.18
***************************************************/
void main(void)
{  
   Set_Bus_16M();
   SCI_Init();
   printp("started!\n");
   DDRB =0xff;
   PORTB=0x00;
   EEPROM_init();   
   DisableInterrupts;
   PORTB=0xFF;
   for(;;)
   {  
       //Simple_Test();
       Test_EE_WriteRead();
       Dly_ms(500);  
       PORTB_BIT0=~ PORTB_BIT0;
   } /* wait forever */
   /* please make sure that you never leave this */
}



/**************************************************
延时函数:ms个毫秒
编写:龙丘
最后修改:2009.11.18
***************************************************/
void Dly_ms(int ms)  //x取值1~65536;
{
   int ii,jj;
    if (ms<1) ms=1;
    for(ii=0;ii<ms;ii++)
      for(jj=0;jj<1335;jj++);    //16MHz--1ms     
}
/**************************************************
延时函数:ms个毫秒
编写:龙丘
最后修改:2009.11.18
***************************************************/
void Dly_10us(int ms)  //x取值1~65536;
{
   int ii,jj;
    if (ms<1) ms=1;
    for(ii=0;ii<ms;ii++)
      for(jj=0;jj<13;jj++);    //16MHz--10us     
}

/*************************************************                  
EEPROM模块初始化程序   
编写:龙丘
最后修改:2009.11.18         
*************************************************/
void EEPROM_init(void)
{
     ECLKDIV=0x4A;                   // 采用8分频,因为OSCLK=16M,又为了使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 EEP_Wt_Word(word * Addr,word Data,byte OpType)
{
     DisableInterrupts;
     while(ESTAT_CBEIF == 0);        // 等待EEPROM命令缓冲区为空
    *Addr=Data;                     // 设置EEPROM的偏移地址
    ECMD=OpType;                    // 指令的类型
    ESTAT |= 0x80;                  // 清命令缓冲标志,开始执行命令
    while(ESTAT_CCIF == 0);         // 等待命令完成
    EnableInterrupts;
}

/*************************************************               
读EEPROM程序                  
Addr:  要操作的EEPROM偏移地址
返回值:读到的结果数据   
编写:龙丘
最后修改:2009.11.18               
*************************************************/
word EEP_Rd_Word(word * Addr)
{
     word TempData;
     DisableInterrupts;
     TempData=*Addr;                 // 读EEPROM的偏移地址的数据
    return(TempData);     
}

/*************************************************         
简单测试操作
编写:龙丘
最后修改:2009.11.18                    
*************************************************/
void Simple_Test(void)
{
    word cnt;   
      
    printp("write and read data:\n");
    for(cnt=0;cnt<1024;cnt+=2)         
    {           
       EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);   
       EEP_Wt_Word(EEPROM_ADDR_BASE+cnt  ,0x1200+cnt,EEP_Word_Prog);
       EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+1,EEP_Word_Prog);
       u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
       printp("%04x,",u16tmData);
       u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
       printp("%04x,",u16tmData);      
       if(cnt%16==0) printp("\n");         
    } }


使用特权

评论回复
谢谢谢林达|  楼主 | 2017-8-17 08:16 | 显示全部楼层
dirtwillfly 发表于 2017-8-16 20:21
链接发不了,给你粘贴在这里吧

我学习下!谢谢老哥!

使用特权

评论回复

使用特权

评论回复
li1874| | 2020-3-23 09:13 | 显示全部楼层
一点都看不懂啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

79

帖子

0

粉丝