关于EEPROM配置的问题!

[复制链接]
 楼主| 谢谢谢林达 发表于 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 | 显示全部楼层
链接发不了,给你粘贴在这里吧
  1. 下面是一个完整的MC9S12DG128 EEPROM读写程序,程序来源于网络,反馈于网络,对大家肯定有用!下面仅贴出部分主文件和主函数,完整工程可以下载附件,开发板用户可以直接操作演示程序。

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

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

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

  39. volatile word testnumber=0;
  40. /**************************************************
  41. 复杂测试操作:
  42. 1.按ESC读取原始数据
  43. 2.按UP/DOWN修改欲写入的数据
  44. 3.按OK写入新数据
  45. 4.复位单片机然后按ESC读取上次写入的数据,比对保存结果.
  46. ***************************************************/
  47. void Test_EE_WriteRead(void)
  48. {
  49.      word cnt;
  50.      
  51.      if(PTIH_PTIH7==0)       //OK
  52.      {
  53.         printp("write and read data:\n");
  54.         for(cnt=0;cnt<10;cnt+=2)         
  55.         {           
  56.            EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);   
  57.            EEP_Wt_Word(EEPROM_ADDR_BASE+cnt  ,0x1200+cnt+testnumber  ,EEP_Word_Prog);
  58.            EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+testnumber+1,EEP_Word_Prog);
  59.            u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
  60.            printp("%04x,",u16tmData);
  61.            u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
  62.            printp("%04x,",u16tmData);         
  63.         }
  64.         printp("\n");
  65.      }
  66.      else if(PTIH_PTIH6==0)  //ESC
  67.      {
  68.         printp("read data:\n");
  69.         for(cnt=0;cnt<10;cnt+=2)         
  70.         {
  71.           u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
  72.           printp("%04x,",u16tmData);
  73.           u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
  74.           printp("%04x,",u16tmData);           
  75.         }
  76.         printp("\n");  
  77.      }
  78.      else if(PTIH_PTIH2==0)  //UP
  79.      {      
  80.        printp("cnt:%04x \n",++testnumber);
  81.      }
  82.      else if(PTIH_PTIH5==0)  //DOWN
  83.      {      
  84.        printp("cnt:%04x \n",--testnumber);
  85.      }
  86. }
  87. /**************************************************
  88. 总线时钟初始化函数:16MHz=晶振频率
  89. 编写:龙丘
  90. 最后修改:2009.11.18
  91. ***************************************************/
  92. static void Set_Bus_16M(void)
  93. {   
  94.      CLKSEL=0X00;    //disengage PLL to system
  95.      PLLCTL_PLLON=1;   //turn on PLL
  96.      SYNR=1;         
  97.      REFDV=1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
  98.      _asm(nop);          //BUS CLOCK=16M
  99.      _asm(nop);
  100.      while(!(CRG**_LOCK==1));   //when pll is steady ,then use it;
  101.      CLKSEL_PLLSEL =1;          //engage PLL to system;
  102. }

  103. /**************************************************
  104. main()
  105. 编写:龙丘
  106. 最后修改:2009.11.18
  107. ***************************************************/
  108. void main(void)
  109. {  
  110.    Set_Bus_16M();
  111.    SCI_Init();
  112.    printp("started!\n");
  113.    DDRB =0xff;
  114.    PORTB=0x00;
  115.    EEPROM_init();   
  116.    DisableInterrupts;
  117.    PORTB=0xFF;
  118.    for(;;)
  119.    {  
  120.        //Simple_Test();
  121.        Test_EE_WriteRead();
  122.        Dly_ms(500);  
  123.        PORTB_BIT0=~ PORTB_BIT0;
  124.    } /* wait forever */
  125.    /* please make sure that you never leave this */
  126. }



  127. /**************************************************
  128. 延时函数:ms个毫秒
  129. 编写:龙丘
  130. 最后修改:2009.11.18
  131. ***************************************************/
  132. void Dly_ms(int ms)  //x取值1~65536;
  133. {
  134.    int ii,jj;
  135.     if (ms<1) ms=1;
  136.     for(ii=0;ii<ms;ii++)
  137.       for(jj=0;jj<1335;jj++);    //16MHz--1ms     
  138. }
  139. /**************************************************
  140. 延时函数:ms个毫秒
  141. 编写:龙丘
  142. 最后修改:2009.11.18
  143. ***************************************************/
  144. void Dly_10us(int ms)  //x取值1~65536;
  145. {
  146.    int ii,jj;
  147.     if (ms<1) ms=1;
  148.     for(ii=0;ii<ms;ii++)
  149.       for(jj=0;jj<13;jj++);    //16MHz--10us     
  150. }

  151. /*************************************************                  
  152. EEPROM模块初始化程序   
  153. 编写:龙丘
  154. 最后修改:2009.11.18         
  155. *************************************************/
  156. void EEPROM_init(void)
  157. {
  158.      ECLKDIV=0x4A;                   // 采用8分频,因为OSCLK=16M,又为了使ECLK
  159.                                      // 达到190KHZ,所以EDIV=21,即ECLK=16M/8/11=190.5KHZ
  160.      ECNFG=0x00;                     // 禁止EEPROM相关操作的中断
  161.     while(ECLKDIV_EDIVLD == 0);     // 等待时钟设置成功
  162.     EPROT_EPOPEN=1;                 // EEPROM没有保护,可以进行编程与擦除  
  163.      EPROT_EPDIS=1;                  // EEPROM保护禁止
  164. }

  165. /*************************************************               
  166. 写EEPROM程序        
  167. Addr:  要操作的EEPROM偏移地址
  168. Data:  要操作的EEPROM数据
  169. OpType:操作命令类型   
  170. 编写:龙丘                    
  171. *************************************************/
  172. void EEP_Wt_Word(word * Addr,word Data,byte OpType)
  173. {
  174.      DisableInterrupts;
  175.      while(ESTAT_CBEIF == 0);        // 等待EEPROM命令缓冲区为空
  176.     *Addr=Data;                     // 设置EEPROM的偏移地址
  177.     ECMD=OpType;                    // 指令的类型
  178.     ESTAT |= 0x80;                  // 清命令缓冲标志,开始执行命令
  179.     while(ESTAT_CCIF == 0);         // 等待命令完成
  180.     EnableInterrupts;
  181. }

  182. /*************************************************               
  183. 读EEPROM程序                  
  184. Addr:  要操作的EEPROM偏移地址
  185. 返回值:读到的结果数据   
  186. 编写:龙丘
  187. 最后修改:2009.11.18               
  188. *************************************************/
  189. word EEP_Rd_Word(word * Addr)
  190. {
  191.      word TempData;
  192.      DisableInterrupts;
  193.      TempData=*Addr;                 // 读EEPROM的偏移地址的数据
  194.     return(TempData);     
  195. }

  196. /*************************************************         
  197. 简单测试操作
  198. 编写:龙丘
  199. 最后修改:2009.11.18                    
  200. *************************************************/
  201. void Simple_Test(void)
  202. {
  203.     word cnt;   
  204.       
  205.     printp("write and read data:\n");
  206.     for(cnt=0;cnt<1024;cnt+=2)         
  207.     {           
  208.        EEP_Wt_Word(EEPROM_ADDR_BASE+cnt,0xffff,EEP_Word_Erase);   
  209.        EEP_Wt_Word(EEPROM_ADDR_BASE+cnt  ,0x1200+cnt,EEP_Word_Prog);
  210.        EEP_Wt_Word(EEPROM_ADDR_BASE+cnt+1,0x1200+cnt+1,EEP_Word_Prog);
  211.        u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt);
  212.        printp("%04x,",u16tmData);
  213.        u16tmData=EEP_Rd_Word(EEPROM_ADDR_BASE+cnt+1);
  214.        printp("%04x,",u16tmData);      
  215.        if(cnt%16==0) printp("\n");         
  216.     } }


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

我学习下!谢谢老哥!
山东电子小菜鸟 发表于 2017-8-17 08:45 | 显示全部楼层
li1874 发表于 2020-3-23 09:13 | 显示全部楼层
一点都看不懂啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

79

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部