久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4060|回復: 29
打印 上一主題 下一主題
收起左側

STC15F2K60S2單片機內部EEPROM保存數據成功率低

  [復制鏈接]
跳轉到指定樓層
樓主
STC15F2K60S2內部EEPROM保存數據成功率低。我只保存2個16位的數據。有時能保,有時不保。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2023-1-27 20:59 | 只看該作者
不知道你的應用場景,無法做出判斷。如果是用于掉電保存,是需要有一定的編程技巧和硬件支持。
回復

使用道具 舉報

板凳
ID:57657 發表于 2023-1-27 21:49 | 只看該作者
保存有問題可能是供電不足、晶振頻率、寄存器配置有問題,具體提供程序源碼。
回復

使用道具 舉報

地板
ID:965189 發表于 2023-1-27 22:39 | 只看該作者
成功率最低的部分
         case 3:disp_cn_1_16x16(piad[11],4,48);            //
                   if(num==12)                                                        //確認鍵
                        {
                          if((shui_h!=shu)&&(shu!=0))
                          {
                               shui_h=shu;
                               delay_ms(2);
                                IapErase(0x0200);                         //扇區擦除
                                IapProgram(0x0200,shui_h>>8);  //保存高水位數據高8位
                                IapProgram(0x0200+1,shui_h);    //保存高水位數據低8位
                          }
                          flas++;
                          shu=0;                                 //輸入板清0
                        }
                        if(shui_h>99)
                        {
                          disp_cn_2_8x16(pia1[h1],4,40); //h百位
                        }
                        else
                        {
                          disp_cn_2_8x16(pi0[0],4,40); //
                        }
                        if(shui_h>9)
                        {
                          disp_cn_2_8x16(pia1[h2],4,48); //h十位
                        }
                        else
                        {
                          disp_cn_2_8x16(pi0[0],4,48); //
                        }
                          disp_cn_2_8x16(pia1[h3],4,56);
                        if(num==15)flas--;
                        break;
回復

使用道具 舉報

5#
ID:965189 發表于 2023-1-27 22:41 | 只看該作者
按確認鍵(num==12),把設定的數據保存。
回復

使用道具 舉報

6#
ID:965189 發表于 2023-1-27 22:48 | 只看該作者
這些都是STC的例程提供的
/*----------------------------
    關閉IAP
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //關閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發寄存器
    IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
    IAP_ADDRL = 0;
        EA=1;
}

/*----------------------------
從ISP/IAP/EEPROM區域讀取一字節
----------------------------*/
char IapRead(int addr)          //讀數據
{
    BYTE dat;                       //數據緩沖區

    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    EA=0;
        IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
   
        _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數據
    IapIdle();                      //關閉IAP功能

    return dat;                     //返回
}

/*----------------------------
寫一字節數據到ISP/IAP/EEPROM區域
----------------------------*/
void IapProgram(int addr, char dat)        //寫數據
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    EA=0;
        IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數據
    IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}

/*----------------------------
扇區擦除
----------------------------*/
void IapErase(int addr)                //扇區擦除
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    EA=0;
        IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}
回復

使用道具 舉報

7#
ID:965189 發表于 2023-1-27 22:55 | 只看該作者
wulin 發表于 2023-1-27 20:59
不知道你的應用場景,無法做出判斷。如果是用于掉電保存,是需要有一定的編程技巧和硬件支持。

不是掉電,按確認鍵保存的。之前用過8G的,掉電保存都正常成功。
回復

使用道具 舉報

8#
ID:624769 發表于 2023-1-28 00:00 來自手機 | 只看該作者
檢查 iap_contr 的設置,是否和你晶振一致,
回復

使用道具 舉報

9#
ID:213173 發表于 2023-1-28 07:21 | 只看該作者
君工創 發表于 2023-1-27 22:55
不是掉電,按確認鍵保存的。之前用過8G的,掉電保存都正常成功。

CPU的等待時間ENABLE_IAP設置是否得當?芯片型號確認是STC15xxxx,不是IAP15xxxx?后者要另行指定保存地址。
回復

使用道具 舉報

10#
ID:491577 發表于 2023-1-28 14:34 | 只看該作者
最可能是扇區擦除時間沒有設置正確,造成擦除不完全。要根據單片機使用頻率選擇。STC例程工作頻率為11.0592MHz,選擇#define ENABLE_IAP  0x82是有問題的,應該選0x83更好。
//#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
回復

使用道具 舉報

11#
ID:434018 發表于 2023-1-28 17:50 | 只看該作者
增加 _nop_(); 數量試試
Example
for (int i=0;i<50;i++)  _nop_();
回復

使用道具 舉報

12#
ID:1034262 發表于 2023-1-28 17:58 | 只看該作者
樓主很可能是你設置的讀寫速度和MCU的頻率對不上導致的。
回復

使用道具 舉報

13#
ID:965189 發表于 2023-1-28 22:10 | 只看該作者
多謝上面幾位的建議,我的CPU主頻是24MHz.
回復

使用道具 舉報

14#
ID:41656 發表于 2023-1-29 10:39 | 只看該作者
你程序問題  STC用了很多了沒有發現這個問題注意設置的時間控制寄存器設置是否正確
回復

使用道具 舉報

15#
ID:491577 發表于 2023-1-29 21:45 | 只看該作者
CPU主頻是24MHz,比例程快了1倍,引用例程時有些地方需要多加一個_nop_(); 比如:
_nop_();                        //等待ISP/IAP/EEPROM操作完成
要多加一個_nop_();
另外:
#define ENABLE_IAP 0x81           //if SYSCLK<24MHz

回復

使用道具 舉報

16#
ID:965189 發表于 2023-1-29 22:14 | 只看該作者
之前用0x80;對應30MHz,現在用#define ENABLE_IAP  0x81,對應24MHz,兩個都用過,沒有改變。
回復

使用道具 舉報

17#
ID:965189 發表于 2023-1-29 22:17 | 只看該作者
唯有這個增加_nop_();未試過。
回復

使用道具 舉報

18#
ID:401564 發表于 2023-1-30 09:20 | 只看該作者
不存在成功率這一說的
代碼正確了就一定行
代碼正確了,保存不了,單片機本身的問題概率小到幾乎為0
檢查一下代碼
回復

使用道具 舉報

19#
ID:213173 發表于 2023-1-30 09:56 | 只看該作者
君工創 發表于 2023-1-28 22:10
多謝上面幾位的建議,我的CPU主頻是24MHz.

有可能是樓主開了中斷,在讀寫EEPROM時發生中斷,破壞了正常讀寫EEPROM。從你提供的代碼看并不是STC的原例程,被你插入了EA=1;/EA=0;。正常處理中斷的寫法是:
        case 3:disp_cn_1_16x16(piad[11],4,48);//
                if(num==12)//確認鍵
                {
                        if((shui_h!=shu)&&(shu!=0))
                        {
                                shui_h=shu;
                                delay_ms(2);
                                EA=0;
                                IapErase(0x0200);                         //扇區擦除
                                IapProgram(0x0200,shui_h>>8);  //保存高水位數據高8位
                                IapProgram(0x0200+1,shui_h);    //保存高水位數據低8位
                                EA=1;
                        }
                }
回復

使用道具 舉報

20#
ID:491577 發表于 2023-1-30 12:46 | 只看該作者
還有可能是電源濾波問題,24M需要103電容,12M需要104電容,樓主可以試試12M或6M主頻時是否正常。如果降低主頻正常,電源加一個103電容和1個22uf電容。
回復

使用道具 舉報

21#
ID:965189 發表于 2023-1-30 13:17 | 只看該作者

我試過這個方法不行才改現在這的。
回復

使用道具 舉報

22#
ID:965189 發表于 2023-1-30 13:19 | 只看該作者

CPU傍邊有并104電容。
回復

使用道具 舉報

23#
ID:491577 發表于 2023-1-30 15:09 | 只看該作者
24M主頻需要103電容,104不行。STC手冊有要求好好看一下。12M主頻以下要104電容。
回復

使用道具 舉報

24#
ID:1044091 發表于 2023-1-30 15:22 來自手機 | 只看該作者
還有一個方法,問下STC的技術支持,就是產品手冊上那個電話。我還是單片機初哥的時候就問過一次,技術小妹很專業,幾句話就把問題解決了。
回復

使用道具 舉報

25#
ID:382454 發表于 2023-1-30 15:29 | 只看該作者
不可能的,要這樣說的話,芯片司也要倒閉了。
回復

使用道具 舉報

26#
ID:491577 發表于 2023-1-30 16:06 | 只看該作者
STC手冊的建議,24M主頻需要103電容,12M主頻以下要104電容。大部分情況下用104都沒事,但是有部分會出問題。最好按手冊來做,要是經常改變頻率,最好103,104電容都加上,安全一些。

無標題.jpg (250.64 KB, 下載次數: 61)

無標題.jpg
回復

使用道具 舉報

27#
ID:213173 發表于 2023-1-30 17:34 | 只看該作者
君工創 發表于 2023-1-30 13:17
我試過這個方法不行才改現在這的。

STC的例程沒有問題,做各種應用測試也沒有出現過你上述現象。上萬件的產品出去沒有發生過EEPROM出這種問題。多數是你軟件或硬件有問題。
回復

使用道具 舉報

28#
ID:965189 發表于 2023-1-30 21:33 | 只看該作者
hhh402 發表于 2023-1-30 16:06
STC手冊的建議,24M主頻需要103電容,12M主頻以下要104電容。大部分情況下用104都沒事,但是有部分會出問題 ...

謝謝你的提醒,一直沒有留意這個問題,而且我習慣用104,看來這個問題也要重視。回到廣州再試下。
回復

使用道具 舉報

29#
ID:965189 發表于 2023-1-31 09:25 | 只看該作者
wulin 發表于 2023-1-30 17:34
STC的例程沒有問題,做各種應用測試也沒有出現過你上述現象。上萬件的產品出去沒有發生過EEPROM出這種問 ...

我也認為是我的問題,只是暫時沒找到原因。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热国产免费 | 在线观看www | 99精品国产一区二区三区 | 中文在线播放 | 免费黄色日本 | a国产一区二区免费入口 | 美人の美乳で授乳プレイ | 97精品一区二区 | 最新国产精品视频 | 久久久久久久91 | 欧美一区二不卡视频 | 天天操天天干天天爽 | 狠狠干美女| 国产视频一区二区三区四区五区 | 亚洲视频在线一区 | 欧美日韩国产精品一区 | 精品国产欧美一区二区三区成人 | 午夜国产一级 | 久久看看| 国产精品高潮呻吟久久av黑人 | 日韩视频在线免费观看 | 国产欧美日韩在线一区 | 亚洲成人在线免费 | 久久综合狠狠综合久久综合88 | 成人3d动漫一区二区三区91 | 精品乱码一区二区 | 久久国内| 免费成人高清 | 羞羞涩涩在线观看 | 亚洲视频精品 | 久久国产视频播放 | 国产网站在线免费观看 | 99久久精品一区二区毛片吞精 | av天天干| 爱爱无遮挡| 久久国产综合 | www.一级毛片| 午夜天堂精品久久久久 | 伦理片97 | 欧美中文字幕一区二区三区亚洲 | 日韩欧美天堂 |