欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: STC單片機(jī)EEPROM扇區(qū)操作問題 [打印本頁]

作者: LAW1100    時(shí)間: 2021-12-14 15:48
標(biāo)題: STC單片機(jī)EEPROM扇區(qū)操作問題
各位大佬,關(guān)于STC這芯片的EEPROM在進(jìn)行操作時(shí),如果不按照扇區(qū)順序操作控擦寫,能不能有效存入數(shù)據(jù)?例如:開機(jī)初始化時(shí)使用第二扇區(qū)進(jìn)行擦寫,后面需要設(shè)置時(shí)使用第一扇區(qū)擦寫存數(shù)據(jù),我經(jīng)過測試發(fā)現(xiàn)第二扇區(qū)不能存數(shù)據(jù),如下:
void main(void)
{

IO_Init();
Delay(100);

TempSum=IapRead(0x0001);//讀第一扇區(qū)
TempSum=TempSum<<8|IapRead(0x0002);
ADsodo_flag=IapRead(0x0203);//讀第二扇區(qū)
camp_dataFlag=ADsodo_flag;
TESample=IapRead(0x0404);//讀第三扇區(qū)
  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);//擦除第一扇區(qū)
    IapProgram(0x0001,TempSum>>8);//寫入第一扇區(qū)
   IapProgram(0x0002,TempSum);
   EepromFlag_1=0;
     }
  
  if(EepromFlag_2==2)
  {

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

  }
}

作者: LAW1100    時(shí)間: 2021-12-14 15:50
還有就是第一扇區(qū)可以保存讀出,但第二和第三扇區(qū)卻不能保存
作者: 188610329    時(shí)間: 2021-12-14 16:43
任何扇區(qū) 都能擦,寫, 讀。

但是,前提是,這些扇區(qū)真實(shí)存在, 如果你的Eeprom 只有 512字節(jié) 是只有 一個扇區(qū)的。

不清楚你的芯片型號,不清楚你的設(shè)置,看不到你擦,寫,讀 操作的代碼, 也看不到Eeprom 初始化代碼, 說什么都是猜。
作者: wulin    時(shí)間: 2021-12-14 16:57
不必按照扇區(qū)順序操作,可以選擇在有效扇區(qū)范圍內(nèi)任意扇區(qū)的任意地址讀寫。一般從0開始讀寫,不易人為出錯。每個扇區(qū)512字節(jié)。
作者: LAW1100    時(shí)間: 2021-12-14 17:59
wulin 發(fā)表于 2021-12-14 16:57
不必按照扇區(qū)順序操作,可以選擇在有效扇區(qū)范圍內(nèi)任意扇區(qū)的任意地址讀寫。一般從0開始讀寫,不易人為出錯 ...

但實(shí)際上卻不能存入數(shù)據(jù),沒作用,只有第一扇區(qū)有作用,不知道那里出錯了
作者: wulin    時(shí)間: 2021-12-14 20:25
LAW1100 發(fā)表于 2021-12-14 17:59
但實(shí)際上卻不能存入數(shù)據(jù),沒作用,只有第一扇區(qū)有作用,不知道那里出錯了

代碼不全,神仙也不知道那里出錯了。
作者: LAW1100    時(shí)間: 2021-12-15 08:06
wulin 發(fā)表于 2021-12-14 20:25
代碼不全,神仙也不知道那里出錯了。

代碼是模塊化的,太多了,上傳這里你們看了要花大量時(shí)間理解,用的芯片是STC8H1K08這款的
作者: LAW1100    時(shí)間: 2021-12-15 09:44
如果將數(shù)據(jù)全部放在第一扇區(qū),也是只有第一個數(shù)據(jù)能讀出來,其它數(shù)據(jù)很大(FFH)不是原來數(shù)據(jù),存不了
作者: LAW1100    時(shí)間: 2021-12-15 09:49
void main(void)
{

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

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


作者: wulin    時(shí)間: 2021-12-15 11:40
LAW1100 發(fā)表于 2021-12-15 08:06
代碼是模塊化的,太多了,上傳這里你們看了要花大量時(shí)間理解,用的芯片是STC8H1K08這款的

不能正常讀寫eeprom的常見原因是受中斷干擾或VCC電壓不穩(wěn)且過低。
作者: LAW1100    時(shí)間: 2021-12-15 13:49
wulin 發(fā)表于 2021-12-15 11:40
不能正常讀寫eeprom的常見原因是受中斷干擾或VCC電壓不穩(wěn)且過低。

為何第一扇區(qū)的第1和2地址能正常讀寫,其它數(shù)據(jù)卻不能正常讀寫呢?何況在進(jìn)行EPROM操作時(shí)試過將中斷關(guān)閉寫入后再開中斷也不行,供電電壓是3.3V,
作者: 188610329    時(shí)間: 2021-12-15 14:11
LAW1100 發(fā)表于 2021-12-15 08:06
代碼是模塊化的,太多了,上傳這里你們看了要花大量時(shí)間理解,用的芯片是STC8H1K08這款的

所以說, 一直強(qiáng)調(diào),要先說芯片型號, 就是沒人聽。

進(jìn)入 Main 以后  一定要寫一句:

IAP_TPS = 24;     // 這里具體數(shù)值 取決于你的晶振速度 多少  MHz  四舍五入原則  24MHz  就寫24,22.1184MHz 就寫 22
作者: LAW1100    時(shí)間: 2021-12-15 14:31
188610329 發(fā)表于 2021-12-15 14:11
所以說, 一直強(qiáng)調(diào),要先說芯片型號, 就是沒人聽。

進(jìn)入 Main 以后  一定要寫一句:

這位大佬,這一句為什么要特別加在Main里呢,例程和手冊也沒說明。我在另一模塊設(shè)置里也有這句.
/***********初始化*************/
void IapIdle()
{
    IAP_CONTR =0;                           
    IAP_CMD =0;                                
    IAP_TRIG =0;                              
    IAP_ADDRH =0x80;                           
    IAP_ADDRL =0;
}
/************讀數(shù)據(jù)************/
u8 IapRead(u16 addr_c)
{
     char dat;
     u8 q;
    IAP_CONTR=0x80;                        
    IAP_TPS=24;                  //頻率設(shè)置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;
}
/*************寫數(shù)據(jù)***********/
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();                                
  
}

作者: LAW1100    時(shí)間: 2021-12-15 15:27
IAP_TPS=24;這句我加在main的開頭或者后面(while里)也是不行,只有第一扇區(qū)的數(shù)據(jù)能讀寫,其它讀寫不了
作者: cocolala    時(shí)間: 2021-12-15 16:53
   STC8H系列的在對片內(nèi)E2PROM操作時(shí)(片內(nèi)FLASH亦然),多了個IAP_TPS寄存器,這是對以前單片機(jī)(比如STC15系列)的優(yōu)化。這樣對E2PROM的操作所需時(shí)間硬件自動控制,用戶只需根系統(tǒng)工作頻率配置
IAP_TPS寄存器即可。手頭有艾克姆科技STC8H3K64S4開發(fā)板的源碼,已測試,好用。附件附上。

    1、上個圖片,實(shí)驗(yàn)是通過串口調(diào)試助手來操作片內(nèi)FLASH的。



    2、片內(nèi)FLASH操作是需要下載時(shí)分配一下E2PROM空間的,如果單片機(jī)本身有E2PROM則無需分配。

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

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













實(shí)驗(yàn)2-16-1:片內(nèi)FLASH讀寫 - 單個字節(jié)(STC8H3K64S4).rar

1.16 MB, 下載次數(shù): 27


作者: wulin    時(shí)間: 2021-12-15 17:40
LAW1100 發(fā)表于 2021-12-15 14:31
這位大佬,這一句為什么要特別加在Main里呢,例程和手冊也沒說明。我在另一模塊設(shè)置里也有這句.
/****** ...

void IapProgram(u16 addr, u16 dat)   這樣寫形參 u16 dat 的依據(jù)是什么?
作者: LAW1100    時(shí)間: 2021-12-15 17:44
wulin 發(fā)表于 2021-12-15 17:40
void IapProgram(u16 addr, u16 dat)   這樣寫形參 u16 dat 的依據(jù)是什么?

u16這是在另一模塊宏定義無符號變量的縮略
作者: 188610329    時(shí)間: 2021-12-15 18:47
先說 你 main() 函數(shù)里的問題
TempSum=IapRead(0x0001);//讀第一扇區(qū)
TempSum=TempSum<<8|IapRead(0x0002);


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

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

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


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

作者: wulin    時(shí)間: 2021-12-15 20:07
LAW1100 發(fā)表于 2021-12-15 17:44
u16這是在另一模塊宏定義無符號變量的縮略

就從你的答復(fù)看,你根本沒有理解我為什么這么問。難道你把無符號字符型數(shù)據(jù)宏定義為u16?由此推斷你的程序中類似問題不會少。出現(xiàn)異常就不足為奇了。
作者: npn    時(shí)間: 2021-12-15 21:49
LAW1100 發(fā)表于 2021-12-15 09:44
如果將數(shù)據(jù)全部放在第一扇區(qū),也是只有第一個數(shù)據(jù)能讀出來,其它數(shù)據(jù)很大(FFH)不是原來數(shù)據(jù),存不了

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

單片機(jī)內(nèi)置EEPROM 不是真正的EEPROM,而是Flash閃存。
只有字節(jié)讀、字節(jié)寫、扇區(qū)擦除,沒有字節(jié)擦除,二進(jìn)制1寫0不可逆,只有擦除才可以全部恢復(fù)為1,一擦一扇區(qū)(512字節(jié))。
作者: dzbj    時(shí)間: 2021-12-16 00:07
wulin 發(fā)表于 2021-12-15 20:07
就從你的答復(fù)看,你根本沒有理解我為什么這么問。難道你把無符號字符型數(shù)據(jù)宏定義為u16?由此推斷你的程 ...

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

第一個用u16沒問題 是地址 16位的 第二個是要寫入的數(shù)據(jù) 應(yīng)該是8位的 但我覺得寫u16也沒事吧 只有8位 就是說即便16位也只取低8位 高8位自動就扔了 如果賦值是16位的 那結(jié)果也是低8位 先不說結(jié)果對不對 應(yīng)該能正常執(zhí)行吧
作者: LAW1100    時(shí)間: 2021-12-16 08:12
188610329 發(fā)表于 2021-12-15 18:47
先說 你 main() 函數(shù)里的問題
TempSum=IapRead(0x0001);//讀第一扇區(qū)
TempSum=TempSum

(TESample)這個是AD值與設(shè)定值相加減后的數(shù)值,存入第三扇區(qū)第4和5的地址(因?yàn)槭?6位,所以拆分8位存入,然后讀出來合并的)。在形參里無符號變量不能這樣使用(u16 ...)???
作者: LAW1100    時(shí)間: 2021-12-16 08:14
wulin 發(fā)表于 2021-12-15 20:07
就從你的答復(fù)看,你根本沒有理解我為什么這么問。難道你把無符號字符型數(shù)據(jù)宏定義為u16?由此推斷你的程 ...

#define  u16  unsigned int  這樣定義沒問題呀
作者: LAW1100    時(shí)間: 2021-12-16 08:20
dzbj 發(fā)表于 2021-12-16 00:07
18 19樓兩位大佬 跟風(fēng)討論一下這句 void IapProgram(u16 addr, u16 dat)

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

第二扇區(qū)存入的是8位數(shù)據(jù),它的數(shù)值很小(要么是0,要么是1或2)用來區(qū)分讀取那個區(qū)塊功能,如:if(0==camp_dataFlag)
{
........
}
if(1===camp_dataFlag)
{
  ...........
}

作者: LAW1100    時(shí)間: 2021-12-16 08:21
dzbj 發(fā)表于 2021-12-16 00:07
18 19樓兩位大佬 跟風(fēng)討論一下這句 void IapProgram(u16 addr, u16 dat)

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

現(xiàn)在讀出來是255的數(shù)據(jù),根本存不了。
作者: wulin    時(shí)間: 2021-12-16 08:38
dzbj 發(fā)表于 2021-12-16 00:07
18 19樓兩位大佬 跟風(fēng)討論一下這句 void IapProgram(u16 addr, u16 dat)

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

不是說這樣寫一定會出錯,而是說寫代碼要嚴(yán)謹(jǐn),要養(yǎng)成好習(xí)慣。從這點(diǎn)推斷樓主的程序中類似問題可能還有。曾經(jīng)有人把無符號整型數(shù)據(jù)宏定義u8,無符號字符型數(shù)據(jù)宏定義u16。特別是使用他人不規(guī)范的模塊,結(jié)果出錯亂找,一會懷疑芯片,一會懷疑Keil,搞得焦頭爛額。
作者: dzbj    時(shí)間: 2021-12-16 10:47
wulin 發(fā)表于 2021-12-16 08:38
不是說這樣寫一定會出錯,而是說寫代碼要嚴(yán)謹(jǐn),要養(yǎng)成好習(xí)慣。從這點(diǎn)推斷樓主的程序中類似問題可能還有。 ...

大佬說的是 好習(xí)慣很重要 可用避免很多麻煩
作者: dzbj    時(shí)間: 2021-12-16 10:58
LAW1100 發(fā)表于 2021-12-16 08:20
第二扇區(qū)存入的是8位數(shù)據(jù),它的數(shù)值很小(要么是0,要么是1或2)用來區(qū)分讀取那個區(qū)塊功能,如:if(0==ca ...

你的問題我?guī)筒簧?因?yàn)槲易约核骄筒辉趺礃?僅建議 你試試不寫其它程序 只寫扇區(qū)讀寫函數(shù) 而且只寫0 1 2扇區(qū)第0位 如果能寫進(jìn)去 那就是你程序的事 再找毛病吧 不做最基本的測試 只問為什么別人也確實(shí)不知道怎么弄 畢竟程序是你寫的 別人不知道啊

STC的片子各系列我基本都用過 雖然操作上略有不同 但沒出現(xiàn)你說的問題 我自己用的扇區(qū)操作函數(shù)也是封裝的模塊 寫不同程序或者不同片子只是調(diào)用 也沒出過什么問題 就像聽說有人喝白開水得腳氣 貌似根本不可能的事 自己先就蒙b 還咋幫別人
作者: LAW1100    時(shí)間: 2021-12-17 08:56
已經(jīng)找到問題原因了,多謝各位熱心解答。
作者: lkc8210    時(shí)間: 2021-12-17 10:54
LAW1100 發(fā)表于 2021-12-17 08:56
已經(jīng)找到問題原因了,多謝各位熱心解答。

不說一下問題原因嗎?
讓后人遇到相同問題有一個解決的方向
作者: wufa1986    時(shí)間: 2021-12-17 11:13
lkc8210 發(fā)表于 2021-12-17 10:54
不說一下問題原因嗎?
讓后人遇到相同問題有一個解決的方向

那肯定是代碼問題
作者: LAW1100    時(shí)間: 2021-12-17 17:57
讀出來的數(shù)據(jù)被中斷打亂了,因?yàn)閯傞_機(jī)時(shí)顯示正常,但過了1秒后顯示跳變,正在查找是那里造成的。
作者: 188610329    時(shí)間: 2021-12-17 19:44
LAW1100 發(fā)表于 2021-12-16 08:12
(TESample)這個是AD值與設(shè)定值相加減后的數(shù)值,存入第三扇區(qū)第4和5的地址(因?yàn)槭?6位,所以拆分8位存 ...

仔細(xì)看 在18樓問你的問題,

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

紅字部分 到底什么 鬼??
作者: baobao125    時(shí)間: 2021-12-17 22:30
Stc8h1k08用官方例程,今天剛用過
作者: LAW1100    時(shí)間: 2021-12-18 08:50
188610329 發(fā)表于 2021-12-17 19:44
仔細(xì)看 在18樓問你的問題,

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

我在這里輸入代碼時(shí)輸錯了,忘了改過來。抱歉




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1