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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 170|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

STC8H8K64U記憶功能問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:777834 發(fā)表于 2025-6-21 13:21 來(lái)自觸屏版 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這幾天在學(xué)單片機(jī)的EEPROM,有幾個(gè)問(wèn)題想下大家,1、EEPROM扇區(qū)擦除的時(shí)候其他的程序能跑嗎?是不是會(huì)停幾ms,為何動(dòng)態(tài)掃描的數(shù)碼管會(huì)抖一下。2、EEPROM按范例程序?qū)懭?27以下,開(kāi)機(jī)還原關(guān)電前狀況時(shí)數(shù)碼管顯示一致,寫(xiě)入128以上時(shí)數(shù)碼管顯示不一樣,這是為何?如果我想寫(xiě)入6666,該怎樣改范例的程序。搜索了好久始終沒(méi)找到合適的程序,大家?guī)蛶兔?/td>
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:69038 發(fā)表于 2025-6-21 14:59 | 只看該作者
現(xiàn)在請(qǐng)各位來(lái)到你猜我猜環(huán)節(jié)。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:20012 發(fā)表于 2025-6-21 16:14 | 只看該作者
在官方的庫(kù)里,操作擦寫(xiě)EEPROM是會(huì)關(guān)中斷的.
回復(fù)

使用道具 舉報(bào)

地板
ID:1133081 發(fā)表于 2025-6-21 16:27 | 只看該作者
1、EEPROM扇區(qū)擦除或讀寫(xiě)的時(shí)候不能與其他的程序同時(shí)跑。要解決EEPROM擦除或讀寫(xiě)的時(shí)候不影響數(shù)碼管動(dòng)態(tài)掃描需要學(xué)會(huì)統(tǒng)籌調(diào)度,這要結(jié)合具體應(yīng)用處理,不是三言兩語(yǔ)說(shuō)的清的。
2、讀取128以上數(shù)據(jù)顯示出錯(cuò)多為數(shù)據(jù)類型使用不當(dāng)。想寫(xiě)入6666需要拆分為兩個(gè)字節(jié),讀取后再合并還原。
測(cè)試程序:
  1. //測(cè)試條件:STC8H實(shí)驗(yàn)板,MCU型號(hào)STC8H3K48S2
  2. //注意:測(cè)試本示例時(shí),需在ISP下載時(shí)將【允許低壓復(fù)位(禁止低壓中斷)】關(guān)閉
  3. #include <STC8H.H>
  4. #include <intrins.h>                                //庫(kù)頭文件
  5. #define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
  6. #define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar

  7. #define IAP_ADDRESS 0x0000                        //測(cè)試地址

  8. //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
  9. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  10.                 0x3f,0x06,0x5b,0x4f,
  11.                 0x66,0x6d,0x7d,0x07,
  12.                 0x7f,0x6f,0x77,0x7c,
  13.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  14. uchar data dis_buf[8];              //緩存數(shù)組
  15. uint  num,sec;
  16. uchar i;
  17. uint  sign;
  18. void  Timer0Init();                 //定時(shí)器初始化聲明
  19. void  IapIdle();                    //關(guān)閉IAP/EEPROM
  20. uchar IapRead(uint addr);           //讀取EEPROM數(shù)據(jù)
  21. void  IapProgram(uint addr, uchar dat);//寫(xiě)入EEPROM數(shù)據(jù)
  22. void  IapErase(uint addr);          //擦除EEPROM扇區(qū)

  23. //初始化單片機(jī)端口
  24. void McuInit()
  25. {
  26.         P0M0 = 0xff; P0M1 = 0x00;
  27.         P1M0 = 0x00; P1M1 = 0x00;
  28.         P2M0 = 0x00; P2M1 = 0x00;
  29.         P3M0 = 0x00; P3M1 = 0x00;
  30.         P4M0 = 0x00; P4M1 = 0x00;
  31.         P5M0 = 0x00; P5M1 = 0x00;
  32.         P6M0 = 0x00; P6M1 = 0x00;
  33.         P7M0 = 0x00; P7M1 = 0x00;
  34. }
  35. //關(guān)閉單片機(jī)端口
  36. void McuSleep()
  37. {
  38.         P0M0 = 0x00; P0M1 = 0xff;
  39.         P1M0 = 0x00; P1M1 = 0xff;
  40.         P2M0 = 0x00; P2M1 = 0xff;
  41.         P3M0 = 0x00; P3M1 = 0xff;
  42.         P4M0 = 0x00; P4M1 = 0xff;
  43.         P5M0 = 0x00; P5M1 = 0xff;
  44.         P6M0 = 0x00; P6M1 = 0xff;
  45.         P7M0 = 0x00; P7M1 = 0xff;
  46. }

  47. void main()                                                       
  48. {
  49.         McuInit();
  50.         if(IapRead(IAP_ADDRESS)==0xff)//如果沒(méi)有保存過(guò)數(shù)據(jù)
  51.         {
  52.                 IapProgram(IAP_ADDRESS, 0);//扇區(qū)首地址寫(xiě)0
  53.                 sec=0;
  54.                 sign=1;
  55.         }
  56.         else
  57.         {
  58. //                for(i=1;i<12;i++)         //測(cè)試寫(xiě)10次
  59.                 for(i=1;i<511;i++)        //測(cè)試寫(xiě)滿510個(gè)字節(jié)
  60.                 {
  61.                         if(IapRead(IAP_ADDRESS+i)==0xff)//如果遇到?jīng)]有保存數(shù)據(jù)的單元
  62.                         {
  63.                                 sec=IapRead(IAP_ADDRESS+i-1);//讀取前一個(gè)字節(jié)保存的數(shù)據(jù)
  64.                                 sign=i;           //地址緩存
  65.                                 break;            //跳出循環(huán)
  66.                         }
  67.                 }
  68.         }
  69. //        if(sign==11)                  //測(cè)試寫(xiě)10次
  70.         if(sign==510)                 //如果寫(xiě)滿510
  71.         {
  72.                 IapErase(IAP_ADDRESS);    //擦除扇區(qū)
  73.                 IapProgram(IAP_ADDRESS, 0);//首地址寫(xiě)0
  74.                 sign=1;
  75.         }
  76.         PCON &= 0xDF;                 //清0掉電標(biāo)志
  77.         ELVD = 1;                     //開(kāi)低壓中斷
  78.         EA   = 1;                     //開(kāi)總中斷

  79.         Timer0Init();                 //初始化定時(shí)器

  80.         while(1)
  81.         {
  82.                 if(TF0)                   //查詢T0中斷請(qǐng)求標(biāo)志
  83.                 {               
  84.                         TF0=0;                //T0中斷請(qǐng)求標(biāo)志清0
  85.                         if(++num>=1000)       //1秒
  86.                         {
  87.                                 num=0;                               
  88.                                 sec=++sec%250;
  89.                         }
  90.                         dis_buf[0]=table[sec/100%10];
  91.                         dis_buf[1]=table[sec/10%10];
  92.                         dis_buf[2]=table[sec%10];
  93.                         P0=0x00;              //段消隱
  94.                         P2=~(0x01<<i);        //送段碼
  95.                         P0=dis_buf[i];        //送位碼
  96.                         i=++i%3;              //循環(huán)計(jì)數(shù)
  97.                 }//耗時(shí)569us
  98.         }
  99. }

  100. void PowerLost() interrupt 6      //低壓中斷
  101. {
  102.         EA = 0;                       //關(guān)閉總中斷
  103.         McuSleep();                   //關(guān)閉所有端口(停止所有耗電電路)
  104.         IapProgram(IAP_ADDRESS+sign,sec);//寫(xiě)數(shù)據(jù)到EEPROM
  105.         while((PCON & 0x20) != 0)     //復(fù)查低壓標(biāo)志
  106.         {
  107.                 PCON &= 0xDF;             //清除低壓標(biāo)志
  108.                 _nop_();               
  109.                 _nop_();                  //坐等掉電
  110.         }
  111.         IAP_CONTR = 0x20;             //發(fā)現(xiàn)是誤報(bào),重啟單片機(jī),恢復(fù)正常工作
  112. }

  113. void Timer0Init(void)             //1毫秒@11.0592MHz
  114. {
  115.         AUXR |= 0x80;                 //定時(shí)器時(shí)鐘1T模式
  116.         TMOD &= 0xF0;                 //設(shè)置定時(shí)器模式
  117.         TL0 = 0xCD;                   //設(shè)置定時(shí)初始值
  118.         TH0 = 0xD4;                   //設(shè)置定時(shí)初始值
  119.         TF0 = 0;                      //清除TF0標(biāo)志
  120.         TR0 = 1;                      //定時(shí)器0開(kāi)始計(jì)時(shí)
  121. }
  122. //關(guān)閉IAP/EEPROM
  123. void IapIdle()
  124. {
  125.     IAP_CONTR = 0;                //關(guān)閉IAP功能
  126.     IAP_CMD = 0;                  //清除命令寄存器
  127.     IAP_TRIG = 0;                 //清除觸發(fā)寄存器
  128.     IAP_ADDRH = 0x80;             //將地址設(shè)置到非IAP區(qū)域
  129.     IAP_ADDRL = 0;
  130. }
  131. //讀取EEPROM數(shù)據(jù)
  132. uchar IapRead(uint addr)
  133. {
  134.     uchar dat;

  135.     IAP_CONTR = 0x80;             //使能IAP
  136.     IAP_TPS = 12;                 //設(shè)置等待參數(shù)12MHz
  137.     IAP_CMD = 1;                  //設(shè)置IAP讀命令
  138.     IAP_ADDRL = addr;             //設(shè)置IAP低地址
  139.     IAP_ADDRH = addr >> 8;        //設(shè)置IAP高地址
  140.     IAP_TRIG = 0x5a;              //寫(xiě)觸發(fā)命令(0x5a)
  141.     IAP_TRIG = 0xa5;              //寫(xiě)觸發(fā)命令(0xa5)
  142.     _nop_();
  143.     dat = IAP_DATA;               //讀IAP數(shù)據(jù)
  144.     IapIdle();                    //關(guān)閉IAP功能

  145.     return dat;
  146. }
  147. //寫(xiě)入EEPROM數(shù)據(jù)
  148. void IapProgram(uint addr, uchar dat)
  149. {
  150.     IAP_CONTR = 0x80;             //使能IAP
  151.     IAP_TPS = 12;                 //設(shè)置等待參數(shù)12MHz
  152.     IAP_CMD = 2;                  //設(shè)置IAP寫(xiě)命令
  153.     IAP_ADDRL = addr;             //設(shè)置IAP低地址
  154.     IAP_ADDRH = addr >> 8;        //設(shè)置IAP高地址
  155.     IAP_DATA = dat;               //寫(xiě)IAP數(shù)據(jù)
  156.     IAP_TRIG = 0x5a;              //寫(xiě)觸發(fā)命令(0x5a)
  157.     IAP_TRIG = 0xa5;              //寫(xiě)觸發(fā)命令(0xa5)
  158.     _nop_();
  159.     IapIdle();                    //關(guān)閉IAP功能
  160. }

  161. void IapErase(uint addr)
  162. {
  163.     IAP_CONTR = 0x80;             //使能IAP
  164.     IAP_TPS = 12;                 //設(shè)置等待參數(shù)12MHz
  165.     IAP_CMD = 3;                  //設(shè)置IAP擦除命令
  166.     IAP_ADDRL = addr;             //設(shè)置IAP低地址
  167.     IAP_ADDRH = addr >> 8;        //設(shè)置IAP高地址
  168.     IAP_TRIG = 0x5a;              //寫(xiě)觸發(fā)命令(0x5a)
  169.     IAP_TRIG = 0xa5;              //寫(xiě)觸發(fā)命令(0xa5)
  170.     _nop_();                      //
  171.     IapIdle();                    //關(guān)閉IAP功能
  172. }

復(fù)制代碼




評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
wpppmlah + 10 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:1136941 發(fā)表于 2025-6-21 16:54 | 只看該作者
x=6666;
y=x/256;
z=x%256;
IapProgramByte(0x0000,y);
IapProgramByte(0x03ff,z);
------------------------
y=IapReadByte(0x0000);
z=IapReadByte(0x03ff);
x=y*256+z;
6666=x;
回復(fù)

使用道具 舉報(bào)

6#
ID:1143567 發(fā)表于 2025-6-21 19:18 來(lái)自觸屏版 | 只看該作者
1,擦除扇區(qū)的時(shí)候需要4~6ms。2,eeprom按字節(jié)寫(xiě)入,范圍-127-127,如果要寫(xiě)入大于127的數(shù)值需要分成高8位和低8位寫(xiě)入

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
wpppmlah + 10 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:1109793 發(fā)表于 2025-6-21 19:24 | 只看該作者
6666是int,兩個(gè)字節(jié)
回復(fù)

使用道具 舉報(bào)

8#
ID:230500 發(fā)表于 2025-6-22 07:58 | 只看該作者
1;先擦再寫(xiě),
2;數(shù)據(jù)是按一個(gè)字節(jié)寫(xiě)入的,如果大于一個(gè)字節(jié)需要拆分
3;寫(xiě)入地址從0000寫(xiě)入, 如果超過(guò)地址范圍 在下載軟件的時(shí)候需要在ISP軟件里設(shè)置分配空間大。ㄟ@個(gè)很重要,很多人第一次都不會(huì),官方默認(rèn)空間是0.5K;寫(xiě)入多個(gè)數(shù)據(jù)讀出就會(huì)出錯(cuò),因?yàn)榭臻g溢出)
4;寫(xiě)EEPROM 確實(shí)會(huì)關(guān)一下中斷,所以這個(gè)寫(xiě)入需要自己規(guī)劃好,如果數(shù)據(jù)量大可以先存到緩存 然后分多次寫(xiě)入;
回復(fù)

使用道具 舉報(bào)

9#
ID:226055 發(fā)表于 2025-6-23 10:24 | 只看該作者
    我以艾克姆科技的STC8H8K64U來(lái)把需要注意的幾點(diǎn)和你溝通下吧:
    1、實(shí)驗(yàn)連接圖如下:




    2、因?yàn)镾TC8H8K64U這個(gè)型號(hào)是沒(méi)有片內(nèi)EEPROM的(都是FLASH),所以要先分割出空間作為EEPROM用。




    3、下載附件的例子,可以打開(kāi)串口調(diào)試助手觀察到下面實(shí)驗(yàn)現(xiàn)象。




    4、如果是項(xiàng)目用,還是建議選擇出廠自帶片內(nèi)EEPROM的芯片,比如STC8H8K48U,會(huì)給自己帶來(lái)便利。




EEPROM.rar

81 KB, 下載次數(shù): 0

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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