找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3521|回復(fù): 7
收起左側(cè)

IAP15F2K61S2單片機(jī)內(nèi)部沒有EEPROM的讀寫問題

[復(fù)制鏈接]
ID:900273 發(fā)表于 2021-5-25 14:58 | 顯示全部樓層 |閱讀模式
     據(jù)手冊(cè)說明 ,該單片機(jī)芯片內(nèi)部無EEPROM,用戶可將用戶程序區(qū)的FLASH當(dāng)做EEPROM用,試了好多扇區(qū)地址的讀寫和擦除,都是把程序直接干掉了,下次開機(jī)啥也沒有了。是這個(gè)芯片就無法存儲(chǔ)掉電保持?jǐn)?shù)據(jù)還是說明書我沒看懂?
  另外,本身板子用的是stc15f2k32s2,為了仿真換了IAP的芯片,結(jié)果仿真沒法用,按照提示也添加了STC MCU選型數(shù)據(jù)庫,和驅(qū)動(dòng)到KEIL目錄,仿真口設(shè)置也是相應(yīng)的串口4,9600波特率。就是死活不能仿真,請(qǐng)教高手前輩了!

手冊(cè)EEPROM說明

手冊(cè)EEPROM說明

仿真出錯(cuò)提示

仿真出錯(cuò)提示
回復(fù)

使用道具 舉報(bào)

ID:900273 發(fā)表于 2021-5-25 15:27 | 顯示全部樓層

eeprom部分擦除,讀寫程序

本帖最后由 bj1024 于 2021-5-25 16:50 編輯

#include "pbdata.h"
#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節(jié)讀命令
#define CMD_PROGRAM 2               //IAP字節(jié)編程命令
#define CMD_ERASE   3               //IAP扇區(qū)擦除命令
//extern uchar ADDR;

//uint addr_s;


//sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字節(jié) sTC15f內(nèi)有定義
//sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字節(jié)
//sfr IAP_CMD     =   0xC5;           //IAP命令寄存器
//sfr IAP_TRIG    =   0xC6;           //IAP命令觸發(fā)寄存器
//sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器
//根據(jù)不同的頻率選擇不同的等待時(shí)間
//#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扇區(qū)擦除命令
----------------------------*/

void  eeprom_init(uint addr)     //IAP扇區(qū)擦除命令
{
       IAP_CONTR= ENABLE_IAP;    //使能IAP
       IAP_CMD= CMD_ERASE;       //使能IAP命令
       IAP_ADDRL= addr;          //設(shè)置IAP低地址
       IAP_ADDRH= addr >> 8;     //設(shè)置IAP高地址
       IAP_TRIG= 0x5a;           //寫觸發(fā)命令0x5a
       IAP_TRIG= 0xa5;           //寫觸發(fā)命令0xa5
       _nop_();                  //等待寫ISP/IAP/EEPROM數(shù)據(jù)完成
       eeprom_offiap();          //關(guān)閉IAP功能
}

/*----------------------------
關(guān)閉IAP
----------------------------*/


void  eeprom_offiap(void)
{
    IAP_CONTR = 0;                  //關(guān)閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
    IAP_ADDRL = 0;
}

/*----------------------------
從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
----------------------------*/
uchar eeprom_read(uint addr)
        
{
    uchar dat;                       //數(shù)據(jù)緩沖區(qū)
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //設(shè)置IAP命令
    IAP_ADDRL = addr;               //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
    IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
    eeprom_offiap();                //關(guān)閉IAP功能
    return dat;                     //返回

}

/*----------------------------
從ISP/IAP/EEPROM區(qū)域?qū)懸蛔止?jié)
----------------------------*/


void  eeprom_writ(uchar addr,uchar dat)
{
       IAP_CONTR= ENABLE_IAP;     //使能IAP
       IAP_CMD= CMD_PROGRAM;      //設(shè)置IAP命令
       IAP_ADDRL= addr;           //設(shè)置IAP低地址
       IAP_ADDRH= addr >> 8;      //設(shè)置IPA高地址
       IAP_DATA= dat;             //寫ISP/IAP/EEPROM數(shù)據(jù)
       IAP_TRIG= 0x5a;            //寫觸發(fā)命令0x5a
       IAP_TRIG= 0xa5;            //寫觸發(fā)命令0xa5
       _nop_();                   //等待寫ISP/IAP/EEPROM數(shù)據(jù)完成
       eeprom_offiap();           //關(guān)閉IAP功能

}
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-5-25 21:07 | 顯示全部樓層
IAP15沒有EEPROM專用區(qū),但可以把用戶程序區(qū)的多余FLASH當(dāng)做EEPROM用。下載程序前根據(jù)代碼長(zhǎng)度的下一個(gè)扇區(qū),確定用作EEPROM的地址,以下圖為例,EEPROM的首地址選0x0800,就不會(huì)發(fā)生擦除用戶程序。
無標(biāo)題.jpg 無標(biāo)題1.jpg
回復(fù)

使用道具 舉報(bào)

ID:796531 發(fā)表于 2021-5-25 21:26 | 顯示全部樓層
應(yīng)該是你地址搞錯(cuò)了,要從程序沒有使用的空間地址來寫, 建議從最后幾個(gè)扇區(qū)來寫,譬如最后一個(gè)122扇區(qū)F200H開始寫
無標(biāo)題.jpg
回復(fù)

使用道具 舉報(bào)

ID:900273 發(fā)表于 2021-5-26 08:34 | 顯示全部樓層
paladina 發(fā)表于 2021-5-25 21:26
應(yīng)該是你地址搞錯(cuò)了,要從程序沒有使用的空間地址來寫, 建議從最后幾個(gè)扇區(qū)來寫,譬如最后一個(gè)122扇區(qū)F200 ...

我昨天折騰了一下午還是沒整明白,地址從F000H開始也不成,不過仿真整出來了。一會(huì)兒發(fā)出來!
回復(fù)

使用道具 舉報(bào)

ID:189235 發(fā)表于 2021-5-26 08:38 | 顯示全部樓層

建議先把例程跑通,多看官方操作
回復(fù)

使用道具 舉報(bào)

ID:900273 發(fā)表于 2021-5-26 08:45 | 顯示全部樓層
bj1024 發(fā)表于 2021-5-26 08:34
我昨天折騰了一下午還是沒整明白,地址從F000H開始也不成,不過仿真整出來了。一會(huì)兒發(fā)出來!

    嚴(yán)格按照官方介紹執(zhí)行操作,用USB轉(zhuǎn)串口下載程序正常,證明硬件連接是沒有問題的,包括不會(huì)犯弄錯(cuò)COM端口的錯(cuò)誤,但是用keil進(jìn)行仿真時(shí)提示"connection to target system lost ! please restet your arget system and try again"和“ error:target dll has been cancelled. debugger aborted !"
————————————————
版權(quán)聲明:本文為CSDN博主「weifengdq」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weifengdq/article/details/23036531





    程序下載軟件上的頻率選低點(diǎn)5.5296M,或6M就一切OK了,選其他如11.0592MHz會(huì)報(bào)錯(cuò)。據(jù)說是因?yàn)閁SB轉(zhuǎn)換芯片的原因,沒時(shí)間深究這個(gè)問題了。有功夫時(shí)再回頭補(bǔ)習(xí)功課。這個(gè)仿真問題 困擾了我好久,所以分享出來給大家提個(gè)醒,有類似問題可試下。

成功仿真

成功仿真
BAOCUO.jpg
回復(fù)

使用道具 舉報(bào)

ID:900273 發(fā)表于 2021-5-26 08:48 | 顯示全部樓層
jackliuwenli 發(fā)表于 2021-5-26 08:38
建議先把例程跑通,多看官方操作

嗯 今天再倒騰倒騰,不行明天就換STC15F2K32S2了,我們以前的芯片是STM,現(xiàn)在太貴了。換芯從來了!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表