找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3499|回复: 7
打印 上一主题 下一主题
收起左侧

IAP15F2K61S2单片机内部没有EEPROM的读写问题

[复制链接]
跳转到指定楼层
楼主
     据手册说明 ,该单片机芯片内部无EEPROM,用户可将用户程序区的FLASH当做EEPROM用,试了好多扇区地址的读写和擦除,都是把程序直接干掉了,下次开机啥也没有了。是这个芯片就无法存储掉电保持数据还是说明书我没看懂?
  另外,本身板子用的是stc15f2k32s2,为了仿真换了IAP的芯片,结果仿真没法用,按照提示也添加了STC MCU选型数据库,和驱动到KEIL目录,仿真口设置也是相应的串口4,9600波特率。就是死活不能仿真,请教高手前辈了!

iap15.JPG (25.36 KB, 下载次数: 103)

手册EEPROM说明

手册EEPROM说明

fangzhen.JPG (14.44 KB, 下载次数: 167)

仿真出错提示

仿真出错提示
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:900273 发表于 2021-5-25 15:27 | 只看该作者

eeprom部分擦除,读写程序

本帖最后由 bj1024 于 2021-5-25 16:50 编辑

#include "pbdata.h"
#define CMD_IDLE    0               //空闲模式
#define CMD_READ    1               //IAP字节读命令
#define CMD_PROGRAM 2               //IAP字节编程命令
#define CMD_ERASE   3               //IAP扇区擦除命令
//extern uchar ADDR;

//uint addr_s;


//sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字节 sTC15f内有定义
//sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字节
//sfr IAP_CMD     =   0xC5;           //IAP命令寄存器
//sfr IAP_TRIG    =   0xC6;           //IAP命令触发寄存器
//sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器
//根据不同的频率选择不同的等待时间
//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
//#define ENABLE_IAP 0x82           //if SYSCLK<20MHz
#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz


/*----------------------------
IAP扇区擦除命令
----------------------------*/

void  eeprom_init(uint addr)     //IAP扇区擦除命令
{
       IAP_CONTR= ENABLE_IAP;    //使能IAP
       IAP_CMD= CMD_ERASE;       //使能IAP命令
       IAP_ADDRL= addr;          //设置IAP低地址
       IAP_ADDRH= addr >> 8;     //设置IAP高地址
       IAP_TRIG= 0x5a;           //写触发命令0x5a
       IAP_TRIG= 0xa5;           //写触发命令0xa5
       _nop_();                  //等待写ISP/IAP/EEPROM数据完成
       eeprom_offiap();          //关闭IAP功能
}

/*----------------------------
关闭IAP
----------------------------*/


void  eeprom_offiap(void)
{
    IAP_CONTR = 0;                  //关闭IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除触发寄存器
    IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
uchar eeprom_read(uint addr)
        
{
    uchar dat;                       //数据缓冲区
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
    eeprom_offiap();                //关闭IAP功能
    return dat;                     //返回

}

/*----------------------------
从ISP/IAP/EEPROM区域写一字节
----------------------------*/


void  eeprom_writ(uchar addr,uchar dat)
{
       IAP_CONTR= ENABLE_IAP;     //使能IAP
       IAP_CMD= CMD_PROGRAM;      //设置IAP命令
       IAP_ADDRL= addr;           //设置IAP低地址
       IAP_ADDRH= addr >> 8;      //设置IPA高地址
       IAP_DATA= dat;             //写ISP/IAP/EEPROM数据
       IAP_TRIG= 0x5a;            //写触发命令0x5a
       IAP_TRIG= 0xa5;            //写触发命令0xa5
       _nop_();                   //等待写ISP/IAP/EEPROM数据完成
       eeprom_offiap();           //关闭IAP功能

}
回复

使用道具 举报

板凳
ID:213173 发表于 2021-5-25 21:07 | 只看该作者
IAP15没有EEPROM专用区,但可以把用户程序区的多余FLASH当做EEPROM用。下载程序前根据代码长度的下一个扇区,确定用作EEPROM的地址,以下图为例,EEPROM的首地址选0x0800,就不会发生擦除用户程序。

回复

使用道具 举报

地板
ID:796531 发表于 2021-5-25 21:26 | 只看该作者
应该是你地址搞错了,要从程序没有使用的空间地址来写, 建议从最后几个扇区来写,譬如最后一个122扇区F200H开始写

无标题.jpg (29.99 KB, 下载次数: 112)

无标题.jpg
回复

使用道具 举报

5#
ID:900273 发表于 2021-5-26 08:34 | 只看该作者
paladina 发表于 2021-5-25 21:26
应该是你地址搞错了,要从程序没有使用的空间地址来写, 建议从最后几个扇区来写,譬如最后一个122扇区F200 ...

我昨天折腾了一下午还是没整明白,地址从F000H开始也不成,不过仿真整出来了。一会儿发出来!
回复

使用道具 举报

6#
ID:189235 发表于 2021-5-26 08:38 | 只看该作者

建议先把例程跑通,多看官方操作
回复

使用道具 举报

7#
ID:900273 发表于 2021-5-26 08:45 | 只看该作者
bj1024 发表于 2021-5-26 08:34
我昨天折腾了一下午还是没整明白,地址从F000H开始也不成,不过仿真整出来了。一会儿发出来!

    严格按照官方介绍执行操作,用USB转串口下载程序正常,证明硬件连接是没有问题的,包括不会犯弄错COM端口的错误,但是用keil进行仿真时提示"connection to target system lost ! please restet your arget system and try again"和“ error:target dll has been cancelled. debugger aborted !"
————————————————
版权声明:本文为CSDN博主「weifengdq」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weifengdq/article/details/23036531





    程序下载软件上的频率选低点5.5296M,或6M就一切OK了,选其他如11.0592MHz会报错。据说是因为USB转换芯片的原因,没时间深究这个问题了。有功夫时再回头补习功课。这个仿真问题 困扰了我好久,所以分享出来给大家提个醒,有类似问题可试下。

CHENGGONG.jpg (299.18 KB, 下载次数: 95)

成功仿真

成功仿真

BAOCUO.jpg (283.43 KB, 下载次数: 96)

BAOCUO.jpg
回复

使用道具 举报

8#
ID:900273 发表于 2021-5-26 08:48 | 只看该作者
jackliuwenli 发表于 2021-5-26 08:38
建议先把例程跑通,多看官方操作

嗯 今天再倒腾倒腾,不行明天就换STC15F2K32S2了,我们以前的芯片是STM,现在太贵了。换芯从来了!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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