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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC單片機EEPROM扇區操作問題

[復制鏈接]
跳轉到指定樓層
樓主
各位大佬,關于STC這芯片的EEPROM在進行操作時,如果不按照扇區順序操作控擦寫,能不能有效存入數據?例如:開機初始化時使用第二扇區進行擦寫,后面需要設置時使用第一扇區擦寫存數據,我經過測試發現第二扇區不能存數據,如下:
void main(void)
{

IO_Init();
Delay(100);

TempSum=IapRead(0x0001);//讀第一扇區
TempSum=TempSum<<8|IapRead(0x0002);
ADsodo_flag=IapRead(0x0203);//讀第二扇區
camp_dataFlag=ADsodo_flag;
TESample=IapRead(0x0404);//讀第三扇區
  TESample=camp_data<<8|IapRead(0x0405);
Delay(500);
Timer0_Init();


  while(1)
{
   
  
  if(AD_cmaxizuFlag_1)
  {
   TESample=tertpe-Set_temp;

   AD_cmaxizuFlag_1=0;
   }
  else
    if(AD_cmaxizuFlag_2)
    {
      TESample=Set_temp-tertpe;
   
      AD_cmaxizuFlag_2=0;
    }
   
  if(EepromFlag_1==2)
  {
    IapErase(0x0000);//擦除第一扇區
    IapProgram(0x0001,TempSum>>8);//寫入第一扇區
   IapProgram(0x0002,TempSum);
   EepromFlag_1=0;
     }
  
  if(EepromFlag_2==2)
  {

    IapErase(0x0200);//擦除第二扇區
    IapProgram(0x0203,ADsodo_flag);//寫入第二扇區
    IapErase(0x0400);//擦除第三扇區
    IapProgram(0x0404,TESample>>8);//寫入第三扇區
   IapProgram(0x0405,TESample);
    EepromFlag_2=0;
   }
if(Eepromflag_A)//開機按鍵初始化第一次寫入
{
  IapErase(0x0200);//擦除第二扇區
    IapProgram(0x0203,ADsodo_flag);//寫入第二扇區
Eepromflag_A=0;
}
}
}

  }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:322939 發表于 2021-12-14 15:50 | 只看該作者
還有就是第一扇區可以保存讀出,但第二和第三扇區卻不能保存
回復

使用道具 舉報

板凳
ID:624769 發表于 2021-12-14 16:43 | 只看該作者
任何扇區 都能擦,寫, 讀。

但是,前提是,這些扇區真實存在, 如果你的Eeprom 只有 512字節 是只有 一個扇區的。

不清楚你的芯片型號,不清楚你的設置,看不到你擦,寫,讀 操作的代碼, 也看不到Eeprom 初始化代碼, 說什么都是猜。
回復

使用道具 舉報

地板
ID:213173 發表于 2021-12-14 16:57 | 只看該作者
不必按照扇區順序操作,可以選擇在有效扇區范圍內任意扇區的任意地址讀寫。一般從0開始讀寫,不易人為出錯。每個扇區512字節。
回復

使用道具 舉報

5#
ID:322939 發表于 2021-12-14 17:59 | 只看該作者
wulin 發表于 2021-12-14 16:57
不必按照扇區順序操作,可以選擇在有效扇區范圍內任意扇區的任意地址讀寫。一般從0開始讀寫,不易人為出錯 ...

但實際上卻不能存入數據,沒作用,只有第一扇區有作用,不知道那里出錯了
回復

使用道具 舉報

6#
ID:213173 發表于 2021-12-14 20:25 | 只看該作者
LAW1100 發表于 2021-12-14 17:59
但實際上卻不能存入數據,沒作用,只有第一扇區有作用,不知道那里出錯了

代碼不全,神仙也不知道那里出錯了。
回復

使用道具 舉報

7#
ID:322939 發表于 2021-12-15 08:06 | 只看該作者
wulin 發表于 2021-12-14 20:25
代碼不全,神仙也不知道那里出錯了。

代碼是模塊化的,太多了,上傳這里你們看了要花大量時間理解,用的芯片是STC8H1K08這款的
回復

使用道具 舉報

8#
ID:322939 發表于 2021-12-15 09:44 | 只看該作者
如果將數據全部放在第一扇區,也是只有第一個數據能讀出來,其它數據很大(FFH)不是原來數據,存不了
回復

使用道具 舉報

9#
ID:322939 發表于 2021-12-15 09:49 | 只看該作者
void main(void)
{

        IO_Init();
        Delay(1000);
       
        TempSum=IapRead(0x0001);//讀出第一扇區1和2地址數據
        TempSum=TempSum<<8|IapRead(0x0002);
        ADsodo_flag=IapRead(0x0003);//第3地址數據
        camp_dataFlag=ADsodo_flag;
        TESample=IapRead(0x0004);//第4和5地址數據
        TESample=camp_data<<8|IapRead(0x0005);
        Delay(500);

        Timer0_Init();
while(1)
        {
if(EepromFlag_1==2)
         {
                  IapErase(0x0000);//擦除第一扇區
                  IapProgram(0x0001,TempSum>>8);//寫入數據
                        IapProgram(0x0002,TempSum);
                        IapProgram(0x0003,ADsodo_flag);//寫入
                         IapProgram(0x0004,TESample>>8);//寫入
                        IapProgram(0x0005,TESample);
                        EepromFlag_1=0;
                   }
           if(EepromFlag_2==2)
         {
              IapErase(0x0000);//擦除第一扇區
                  IapProgram(0x0001,TempSum>>8);//寫入數據
                        IapProgram(0x0002,TempSum);
                        IapProgram(0x0003,ADsodo_flag);//寫入
                         IapProgram(0x0004,TESample>>8);//寫入
                        IapProgram(0x0005,TESample);
                       EepromFlag_2=0;
                   }
}

回復

使用道具 舉報

10#
ID:213173 發表于 2021-12-15 11:40 | 只看該作者
LAW1100 發表于 2021-12-15 08:06
代碼是模塊化的,太多了,上傳這里你們看了要花大量時間理解,用的芯片是STC8H1K08這款的

不能正常讀寫eeprom的常見原因是受中斷干擾或VCC電壓不穩且過低。
回復

使用道具 舉報

11#
ID:322939 發表于 2021-12-15 13:49 | 只看該作者
wulin 發表于 2021-12-15 11:40
不能正常讀寫eeprom的常見原因是受中斷干擾或VCC電壓不穩且過低。

為何第一扇區的第1和2地址能正常讀寫,其它數據卻不能正常讀寫呢?何況在進行EPROM操作時試過將中斷關閉寫入后再開中斷也不行,供電電壓是3.3V,
回復

使用道具 舉報

12#
ID:624769 發表于 2021-12-15 14:11 | 只看該作者
LAW1100 發表于 2021-12-15 08:06
代碼是模塊化的,太多了,上傳這里你們看了要花大量時間理解,用的芯片是STC8H1K08這款的

所以說, 一直強調,要先說芯片型號, 就是沒人聽。

進入 Main 以后  一定要寫一句:

IAP_TPS = 24;     // 這里具體數值 取決于你的晶振速度 多少  MHz  四舍五入原則  24MHz  就寫24,22.1184MHz 就寫 22
回復

使用道具 舉報

13#
ID:322939 發表于 2021-12-15 14:31 | 只看該作者
188610329 發表于 2021-12-15 14:11
所以說, 一直強調,要先說芯片型號, 就是沒人聽。

進入 Main 以后  一定要寫一句:

這位大佬,這一句為什么要特別加在Main里呢,例程和手冊也沒說明。我在另一模塊設置里也有這句.
/***********初始化*************/
void IapIdle()
{
    IAP_CONTR =0;                           
    IAP_CMD =0;                                
    IAP_TRIG =0;                              
    IAP_ADDRH =0x80;                           
    IAP_ADDRL =0;
}
/************讀數據************/
u8 IapRead(u16 addr_c)
{
     char dat;
     u8 q;
    IAP_CONTR=0x80;                        
    IAP_TPS=24;                  //頻率設置24MHZ
    IAP_CMD=1;                                
    IAP_ADDRL=addr_c;                           
    IAP_ADDRH=addr_c>>8;                     
    IAP_TRIG=0x5a;                           
    IAP_TRIG=0xa5;                           
    for(q=0;q<3;q++);
    dat=IAP_DATA;                             
    IapIdle();                                 

    return dat;
}
/*************寫數據***********/
void IapProgram(u16 addr, u16 dat)
{
     u8 v;
    IAP_CONTR=0x80;                        
    IAP_TPS=24;                                //24MHZ
    IAP_CMD=2;                                
    IAP_ADDRL=addr;                           
    IAP_ADDRH=addr>>8;                     
    IAP_DATA=dat;                           
    IAP_TRIG=0x5a;                           
    IAP_TRIG=0xa5;                           
   for(v=0;v<3;v++);
    IapIdle();                                 
   
}
/***************擦除************/
void IapErase(u16 addr_a)
{
    u8 u;
    IAP_CONTR=0x80;                        
          IAP_TPS=24;                                //24MHz
    IAP_CMD=3;                                
    IAP_ADDRL=addr_a;                        
    IAP_ADDRH=addr_a>>8;                  
    IAP_TRIG=0x5a;                           
    IAP_TRIG=0xa5;                           
    for(u=0;u<3;u++);                                    
    IapIdle();                                
  
}
回復

使用道具 舉報

14#
ID:322939 發表于 2021-12-15 15:27 | 只看該作者
IAP_TPS=24;這句我加在main的開頭或者后面(while里)也是不行,只有第一扇區的數據能讀寫,其它讀寫不了
回復

使用道具 舉報

15#
ID:226055 發表于 2021-12-15 16:53 | 只看該作者
   STC8H系列的在對片內E2PROM操作時(片內FLASH亦然),多了個IAP_TPS寄存器,這是對以前單片機(比如STC15系列)的優化。這樣對E2PROM的操作所需時間硬件自動控制,用戶只需根系統工作頻率配置
IAP_TPS寄存器即可。手頭有艾克姆科技STC8H3K64S4開發板的源碼,已測試,好用。附件附上。

    1、上個圖片,實驗是通過串口調試助手來操作片內FLASH的。



    2、片內FLASH操作是需要下載時分配一下E2PROM空間的,如果單片機本身有E2PROM則無需分配。

    3、在對分配了的E2PROM操作時,地址空間不需要加偏移量,即依然從0x0000來操作。這和之前對STC15系列片內FLASH操作不一樣,請知悉。

    4、源碼見附件,同為STC8H,寄存器基本一致,具有很高的參考價值。













實驗2-16-1:片內FLASH讀寫 - 單個字節(STC8H3K64S4).rar

1.16 MB, 下載次數: 27

回復

使用道具 舉報

16#
ID:213173 發表于 2021-12-15 17:40 | 只看該作者
LAW1100 發表于 2021-12-15 14:31
這位大佬,這一句為什么要特別加在Main里呢,例程和手冊也沒說明。我在另一模塊設置里也有這句.
/****** ...

void IapProgram(u16 addr, u16 dat)   這樣寫形參 u16 dat 的依據是什么?
回復

使用道具 舉報

17#
ID:322939 發表于 2021-12-15 17:44 | 只看該作者
wulin 發表于 2021-12-15 17:40
void IapProgram(u16 addr, u16 dat)   這樣寫形參 u16 dat 的依據是什么?

u16這是在另一模塊宏定義無符號變量的縮略
回復

使用道具 舉報

18#
ID:624769 發表于 2021-12-15 18:47 | 只看該作者
先說 你 main() 函數里的問題
TempSum=IapRead(0x0001);//讀第一扇區
TempSum=TempSum<<8|IapRead(0x0002);


上面這兩句代碼,我能理解, 把 0x0001 0x0002 的內容讀出來,然后,合并。

TESample=IapRead(0x0404);//讀第三扇區
  TESample=camp_data<<8|IapRead(0x0405);

但是,這兩句代碼,我無法理解,你能解釋一下么??? 包括哪個 camp_data 是從哪里來的?


然后,你的寫Eeprom 子函數 的 u16 dat  也是有問題的。 不過等上面的問題你解答后,我們再討論后續問題。
回復

使用道具 舉報

19#
ID:213173 發表于 2021-12-15 20:07 | 只看該作者
LAW1100 發表于 2021-12-15 17:44
u16這是在另一模塊宏定義無符號變量的縮略

就從你的答復看,你根本沒有理解我為什么這么問。難道你把無符號字符型數據宏定義為u16?由此推斷你的程序中類似問題不會少。出現異常就不足為奇了。
回復

使用道具 舉報

20#
ID:57657 發表于 2021-12-15 21:49 | 只看該作者
LAW1100 發表于 2021-12-15 09:44
如果將數據全部放在第一扇區,也是只有第一個數據能讀出來,其它數據很大(FFH)不是原來數據,存不了

你定義的都是全局變量,也不知道是什么中斷修改了變量的值。

單片機內置EEPROM 不是真正的EEPROM,而是Flash閃存。
只有字節讀、字節寫、扇區擦除,沒有字節擦除,二進制1寫0不可逆,只有擦除才可以全部恢復為1,一擦一扇區(512字節)。
回復

使用道具 舉報

21#
ID:47286 發表于 2021-12-16 00:07 | 只看該作者
wulin 發表于 2021-12-15 20:07
就從你的答復看,你根本沒有理解我為什么這么問。難道你把無符號字符型數據宏定義為u16?由此推斷你的程 ...

18 19樓兩位大佬 跟風討論一下這句 void IapProgram(u16 addr, u16 dat)

第一個用u16沒問題 是地址 16位的 第二個是要寫入的數據 應該是8位的 但我覺得寫u16也沒事吧 只有8位 就是說即便16位也只取低8位 高8位自動就扔了 如果賦值是16位的 那結果也是低8位 先不說結果對不對 應該能正常執行吧
回復

使用道具 舉報

22#
ID:322939 發表于 2021-12-16 08:12 | 只看該作者
188610329 發表于 2021-12-15 18:47
先說 你 main() 函數里的問題
TempSum=IapRead(0x0001);//讀第一扇區
TempSum=TempSum

(TESample)這個是AD值與設定值相加減后的數值,存入第三扇區第4和5的地址(因為是16位,所以拆分8位存入,然后讀出來合并的)。在形參里無符號變量不能這樣使用(u16 ...)???
回復

使用道具 舉報

23#
ID:322939 發表于 2021-12-16 08:14 | 只看該作者
wulin 發表于 2021-12-15 20:07
就從你的答復看,你根本沒有理解我為什么這么問。難道你把無符號字符型數據宏定義為u16?由此推斷你的程 ...

#define  u16  unsigned int  這樣定義沒問題呀
回復

使用道具 舉報

24#
ID:322939 發表于 2021-12-16 08:20 | 只看該作者
dzbj 發表于 2021-12-16 00:07
18 19樓兩位大佬 跟風討論一下這句 void IapProgram(u16 addr, u16 dat)

第一個用u16沒問題 是地址 1 ...

第二扇區存入的是8位數據,它的數值很。ㄒ词0,要么是1或2)用來區分讀取那個區塊功能,如:if(0==camp_dataFlag)
{
........
}
if(1===camp_dataFlag)
{
  ...........
}
回復

使用道具 舉報

25#
ID:322939 發表于 2021-12-16 08:21 | 只看該作者
dzbj 發表于 2021-12-16 00:07
18 19樓兩位大佬 跟風討論一下這句 void IapProgram(u16 addr, u16 dat)

第一個用u16沒問題 是地址 1 ...

現在讀出來是255的數據,根本存不了。
回復

使用道具 舉報

26#
ID:213173 發表于 2021-12-16 08:38 | 只看該作者
dzbj 發表于 2021-12-16 00:07
18 19樓兩位大佬 跟風討論一下這句 void IapProgram(u16 addr, u16 dat)

第一個用u16沒問題 是地址 1 ...

不是說這樣寫一定會出錯,而是說寫代碼要嚴謹,要養成好習慣。從這點推斷樓主的程序中類似問題可能還有。曾經有人把無符號整型數據宏定義u8,無符號字符型數據宏定義u16。特別是使用他人不規范的模塊,結果出錯亂找,一會懷疑芯片,一會懷疑Keil,搞得焦頭爛額。
回復

使用道具 舉報

27#
ID:47286 發表于 2021-12-16 10:47 | 只看該作者
wulin 發表于 2021-12-16 08:38
不是說這樣寫一定會出錯,而是說寫代碼要嚴謹,要養成好習慣。從這點推斷樓主的程序中類似問題可能還有。 ...

大佬說的是 好習慣很重要 可用避免很多麻煩
回復

使用道具 舉報

28#
ID:47286 發表于 2021-12-16 10:58 | 只看該作者
LAW1100 發表于 2021-12-16 08:20
第二扇區存入的是8位數據,它的數值很。ㄒ词0,要么是1或2)用來區分讀取那個區塊功能,如:if(0==ca ...

你的問題我幫不上 因為我自己水平就不怎么樣 僅建議 你試試不寫其它程序 只寫扇區讀寫函數 而且只寫0 1 2扇區第0位 如果能寫進去 那就是你程序的事 再找毛病吧 不做最基本的測試 只問為什么別人也確實不知道怎么弄 畢竟程序是你寫的 別人不知道啊

STC的片子各系列我基本都用過 雖然操作上略有不同 但沒出現你說的問題 我自己用的扇區操作函數也是封裝的模塊 寫不同程序或者不同片子只是調用 也沒出過什么問題 就像聽說有人喝白開水得腳氣 貌似根本不可能的事 自己先就蒙b 還咋幫別人
回復

使用道具 舉報

29#
ID:322939 發表于 2021-12-17 08:56 | 只看該作者
已經找到問題原因了,多謝各位熱心解答。
回復

使用道具 舉報

30#
ID:161164 發表于 2021-12-17 10:54 | 只看該作者
LAW1100 發表于 2021-12-17 08:56
已經找到問題原因了,多謝各位熱心解答。

不說一下問題原因嗎?
讓后人遇到相同問題有一個解決的方向
回復

使用道具 舉報

31#
ID:879348 發表于 2021-12-17 11:13 | 只看該作者
lkc8210 發表于 2021-12-17 10:54
不說一下問題原因嗎?
讓后人遇到相同問題有一個解決的方向

那肯定是代碼問題
回復

使用道具 舉報

32#
ID:322939 發表于 2021-12-17 17:57 | 只看該作者
讀出來的數據被中斷打亂了,因為剛開機時顯示正常,但過了1秒后顯示跳變,正在查找是那里造成的。
回復

使用道具 舉報

33#
ID:624769 發表于 2021-12-17 19:44 | 只看該作者
LAW1100 發表于 2021-12-16 08:12
(TESample)這個是AD值與設定值相加減后的數值,存入第三扇區第4和5的地址(因為是16位,所以拆分8位存 ...

仔細看 在18樓問你的問題,

TESample=IapRead(0x0404);//讀第三扇區
  TESample=camp_data<<8|IapRead(0x0405);

紅字部分 到底什么 鬼??
回復

使用道具 舉報

34#
ID:960619 發表于 2021-12-17 22:30 來自觸屏版 | 只看該作者
Stc8h1k08用官方例程,今天剛用過
回復

使用道具 舉報

35#
ID:322939 發表于 2021-12-18 08:50 | 只看該作者
188610329 發表于 2021-12-17 19:44
仔細看 在18樓問你的問題,

TESample=IapRead(0x0404);//讀第三扇區

我在這里輸入代碼時輸錯了,忘了改過來。抱歉
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久综合 | 久久在视频 | 欧美精品在线免费观看 | 亚洲一二三区精品 | 亚洲视频区 | 久99久视频 | 亚洲视频国产 | 免费在线观看成人av | 国产一伦一伦一伦 | 亚洲高清视频在线 | 国产日韩一区二区 | 久草免费在线视频 | 羞羞网站在线观看 | 欧美午夜精品理论片a级按摩 | 国产一区二区不卡 | 成人免费在线视频 | 国产男女猛烈无遮掩视频免费网站 | 99re国产精品 | 九九热在线视频 | 久久99精品久久久 | 美女天天操 | 欧美在线观看一区 | 色播av| 综合色播| 一区二区在线免费观看 | 久久www免费视频 | 乱一性一乱一交一视频a∨ 色爱av | 黄色三级免费网站 | 亚洲最色网站 | 91成人小视频 | 欧美一区二区三区在线看 | 久久中文字幕电影 | 日韩一区二区在线视频 | 亚洲欧洲综合av | 亚洲日韩中文字幕 | 韩日av在线 | 黄网址在线观看 | 成人h动漫精品一区二区器材 | 欧美精品一区在线 | 国产日韩精品一区 | 亚洲视频一区二区三区 |