找回密码
 立即注册
查看: 266|回复: 2

我这个范例那stc15的单字节写入那个范例改的.

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-10 00:06:03
已绑定手机

132

主题

1573

回帖

2053

积分

金牌会员

积分
2053
发表于 2024-10-23 02:02:09 | 显示全部楼层 |阅读模式
还是不能写入,

不懂是哪里改错了.
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 内部EEPROM举例--------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  9. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  10. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  11. /*---------------------------------------------------------------------*/
  12. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  13. //若无特别说明,工作频率一般为11.0592MHz
  14. #include "stc8g.h"
  15. #include "intrins.h"
  16. #include <stdio.h>
  17. #define MAIN_Fosc 11059200UL
  18. #define BRT         (65536 - MAIN_Fosc / 115200 / 4)
  19. typedef unsigned char u8;                //BYTE
  20. typedef unsigned int u16;                //WORD
  21. #define IAP_ADDRESS 0x0000                //测试地址
  22. void Delay(u8 n);
  23. void IapIdle();
  24. u8 IapReadByte(u16 addr);
  25. void IapProgramByte(u16 addr, u8 dat);
  26. void IapEraseSector(u16 addr);
  27. void PWM_init(void);
  28.   void UartInit()
  29. {
  30.     SCON = 0x5a;
  31.     TL1 = BRT;
  32.     TH1 = BRT >> 8;
  33.         TR1=1;
  34.     AUXR = 0x40;
  35. }
  36. void main()
  37. {
  38.     u16 i;
  39.         P_SW2=0x80;
  40.     P1M0 = 0x00;    P1M1 = 0x00;    P3M0 = 0x00;    P3M1 = 0x00;    P5M0 = 0x00;    P5M1 = 0x00;
  41.         UartInit();
  42.         PWM_init();
  43.         CCAP2H=IAP_ADDRESS;
  44.         IapReadByte(IAP_ADDRESS);
  45.        
  46.         printf("dz=%u\r",IAP_ADDRESS);
  47.        
  48.                 //    P3 = 0xfe;                      //1111,1110 系统OK
  49.                      Delay(10);                      //延时
  50.     IapEraseSector(IAP_ADDRESS);    //扇区擦除
  51.     for (i=0; i<500; i++)           //检测是否擦除成功(全FF检测)
  52.     {
  53.         if (IapReadByte(IAP_ADDRESS+i) != 0xff)
  54.             goto Error;             //如果出错,则退出
  55.     }
  56.                 //    P3 = 0xfc;                      //1111,1100 擦除成功
  57.                     Delay(10);                      //延时
  58.     for (i=0; i<500; i++)           //编程512字节
  59.     {
  60.         IapProgramByte(IAP_ADDRESS+i, (u8)i);
  61.     }
  62.                 //    P3 = 0xf8;                      //1111,1000 编程完成
  63.                     Delay(10);                      //延时
  64.     for (i=0; i<500; i++)           //校验512字节
  65.     {
  66.         if (IapReadByte(IAP_ADDRESS+i) != (u8)i)
  67.             goto Error;             //如果校验错误,则退出
  68.     }
  69.                 //    P3 = 0xf0;                      //1111,0000 测试完成
  70.     while (1);
  71. Error:
  72.                 //    P3 &= 0x7f;                     //0xxx,xxxx IAP操作失败
  73.     while (1);
  74. }
  75. /*----------------------------
  76. 软件延时
  77. ----------------------------*/
  78. void Delay(u8 n)
  79. {
  80.     u16 x;
  81.     while (n--)
  82.     {
  83.         x = 0;
  84.         while (++x);
  85.     }
  86. }
  87. /*----------------------------
  88. 关闭IAP
  89. ----------------------------*/
  90. void IapIdle()
  91. {
  92.     IAP_CONTR = 0;                  //关闭IAP功能
  93.     IAP_CMD = 0;                    //清除命令寄存器
  94.     IAP_TRIG = 0;                   //清除触发寄存器
  95.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  96.     IAP_ADDRL = 0;
  97. }
  98. /*----------------------------
  99. 从ISP/IAP/EEPROM区域读取一字节
  100. ----------------------------*/
  101. u8 IapReadByte(u16 addr)
  102. {
  103.     u8 dat;                       //数据缓冲区
  104.     IAP_CONTR = 0x80;         //使能IAP
  105.     IAP_TPS = 12;                               //设置等待参数12MHz
  106.        
  107.     IAP_CMD = 1;             //设置IAP命令
  108.     IAP_ADDRL = addr;               //设置IAP低地址
  109.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  110.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  111.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  112.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  113.     dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
  114.     IapIdle();                      //关闭IAP功能
  115.     return dat;                     //返回
  116. }
  117. /*----------------------------
  118. 写一字节数据到ISP/IAP/EEPROM区域
  119. ----------------------------*/
  120. void IapProgramByte(u16 addr, u8 dat)
  121. {
  122.     IAP_CONTR = 0x80;         //使能IAP
  123.     IAP_TPS = 12;                               //设置等待参数12MHz       
  124.     IAP_CMD = 2;          //设置IAP命令
  125.     IAP_ADDRL = addr;               //设置IAP低地址
  126.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  127.     IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  128.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  129.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  130.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  131.     IapIdle();
  132. }
  133. /*----------------------------
  134. 扇区擦除
  135. ----------------------------*/
  136. void IapEraseSector(u16 addr)
  137. {
  138.     IAP_CONTR = 0x80;         //使能IAP
  139.     IAP_TPS = 12;                               //设置等待参数12MHz       
  140.     IAP_CMD = 3;            //设置IAP命令
  141.     IAP_ADDRL = addr;               //设置IAP低地址
  142.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  143.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  144.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  145.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  146.     IapIdle();
  147. }
  148. //// 初始化PWM功能 P55 pwm
  149. void PWM_init(void)
  150. {
  151.     P_SW1=0x20;
  152.     CCON = 0x00;
  153.     CMOD = 0x08;
  154.     CL = 0x00;
  155.     CH = 0x00;
  156.     CCAPM2 = 0x42;
  157.     PCA_PWM2 = 0x00;
  158.     CCAP2L = 0x00;                  
  159.     CCAP2H = 0x00;
  160.         CR=1;       
  161. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:387
  • 最近打卡:2025-05-09 08:36:53

40

主题

195

回帖

619

积分

高级会员

积分
619
发表于 2024-10-24 15:32:09 | 显示全部楼层
看你的代码头文件用的是STC8G.H,估计你用的是STC8G的芯片。

关于EEPROM的读写请参考<AIapp-ISP>中的->AI8G->范例程序 就行了。不用改,直接用就行。

111.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2025-05-10 00:06:03
已绑定手机

132

主题

1573

回帖

2053

积分

金牌会员

积分
2053
发表于 2024-10-24 16:07:36 | 显示全部楼层
康辉*** 发表于 2024-10-24 15:32
看你的代码头文件用的是STC8G.H,估计你用的是STC8G的芯片。

关于EEPROM的读写请参考中的->AI8G->范例程序 ...

这个是我改的.
里面的
需要使用eeprom单字节读写操作.
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-10 01:11 , Processed in 0.121234 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表