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

QQ登錄

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

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

STC單片機(jī)內(nèi)置EEPROM讀取與保存 函數(shù)調(diào)用 .c和.h文件

[復(fù)制鏈接]
ID:278006 發(fā)表于 2020-2-15 22:23 | 顯示全部樓層 |閱讀模式
10黑幣
STC 內(nèi)置EEPROM  讀取與保存的 .c和.h文件

請(qǐng)教如何調(diào)用文件  掉電不丟失

1、讀取3參數(shù)個(gè)數(shù)  改動(dòng)后 保存到 EEPROM
我的用法是 :

unsigned int  Temp_Buf[3];                           //定義緩存:
Read_Flash_Message(ks_Addr,Temp_Buf, 3);//讀取:函數(shù)是:void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);

Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函數(shù)是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);

現(xiàn)在是  無(wú)法保存  調(diào)取的也不對(duì)



//以下為.h文件
//使用單片機(jī)內(nèi)部的Flash,模擬EEPROM使用
//STC15W4K48S4 單片機(jī),可以使用IAP命令擦寫內(nèi)部Flash
//起始地址 0X0000 結(jié)束 0X27FF  其中,512Byte一個(gè)扇區(qū)
//一共20個(gè)扇區(qū)  一個(gè)扇區(qū)可以存儲(chǔ)一組參數(shù),這樣就可以直接擦出整個(gè)扇區(qū)修改內(nèi)容

#ifndef        __IAP_EEPROM__H_
#define        __IAP_EEPROM__H_
#include "STC15W.h"
#include "intrins.h"


#define        ks_Addr                                0X0000
#define        tz_Addr                                0X0200
#define        tm_Addr                                0X0400



//保存內(nèi)容到Flash
void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);
//從Flash讀取內(nèi)容
void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);
//讀取某地址一個(gè)字節(jié)
unsigned char Read_One_Byte(unsigned int addr);
void Erase_IAP(unsigned int addr);
void Write_One_Byte(unsigned int addr,unsigned char dat);

#endif

以下為.c文件

  1. #include "IAP_EEPROM.h"
  2. //#include<Uart_1.h> //用來(lái)CLI交互
  3. //STC15W4K48S4 單片機(jī),可以使用IAP命令擦寫內(nèi)部Flash
  4. //起始地址 0X0000 結(jié)束 0X27FF  其中,512Byte一個(gè)扇區(qū)

  5. //關(guān)閉IAP功能
  6. void Close_IAP(void)
  7. {
  8.         IAP_CONTR = 0;
  9.         IAP_CMD = 0;
  10.         IAP_TRIG = 0;
  11.         IAP_ADDRH = 0;
  12.         IAP_ADDRL = 0;
  13. }
  14. //擦除某地址所在的扇區(qū)
  15. void Erase_IAP(unsigned int addr)
  16. {
  17.                 IAP_CONTR = 0x82;//允許IAP操作,設(shè)置IAP操作速度         
  18.     IAP_CMD = 0x03;//扇區(qū)擦除命令            
  19.     IAP_ADDRL = addr;              
  20.     IAP_ADDRH = addr >> 8;//地址賦值         
  21.     IAP_TRIG = 0x5a;               
  22.     IAP_TRIG = 0xa5;//觸發(fā)命令               
  23.     _nop_();_nop_();_nop_();            
  24.     Close_IAP();//清空IAP操作寄存器等
  25. }
  26. //在某地址寫入一個(gè)字節(jié)
  27. void Write_One_Byte(unsigned int addr,unsigned char dat)
  28. {
  29.                 IAP_CONTR = 0x82;//允許IAP操作,設(shè)置IAP操作速度   
  30.     IAP_CMD = 0x02;//IAP寫命令
  31.     IAP_ADDRL = addr;
  32.     IAP_ADDRH = addr >> 8;//地址賦值
  33.     IAP_DATA = dat;//更新寫寄存器
  34.     IAP_TRIG = 0x5a;
  35.     IAP_TRIG = 0xa5;//觸發(fā)
  36.     _nop_();
  37.     Close_IAP();//清空IAP操作寄存器等
  38. }
  39. //讀取某地址一個(gè)字節(jié)
  40. unsigned char Read_One_Byte(unsigned int addr)
  41. {
  42.                 unsigned char dat=0;//定義一個(gè)待返回的數(shù)據(jù)
  43.     IAP_CONTR = 0x82;//允許IAP
  44.     IAP_CMD = 0x01;//IAP讀命令
  45.     IAP_ADDRL = addr;
  46.     IAP_ADDRH = addr >> 8;//地址賦值
  47.     IAP_TRIG = 0x5a;
  48.     IAP_TRIG = 0xa5;//觸發(fā)
  49.     _nop_();_nop_();_nop_();_nop_();
  50.     dat = IAP_DATA;
  51.                 Close_IAP();//清空IAP操作寄存器等
  52.     return dat;
  53. }
  54. //保存內(nèi)容到Flash
  55. void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len)
  56. {
  57.         unsigned int i=0;
  58.         Erase_IAP(Addr);//擦除對(duì)應(yīng)扇區(qū)
  59.         
  60.         if(Len >= 511)
  61.                 Len = 511;
  62.         
  63.         Write_One_Byte(Addr,Len>>8);//長(zhǎng)度寫入首地址
  64.         Write_One_Byte(Addr+1,(Len&0X00FF));//長(zhǎng)度寫入首地址
  65.         for(i=0;i<Len;i++) //順序存儲(chǔ)有效信息
  66.         {
  67.                 Write_One_Byte((Addr+2+i),Buf[i]);
  68.         }
  69. }
  70. //從Flash讀取內(nèi)容
  71. void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len)
  72. {
  73.         unsigned int i=0;
  74.         *Len = Read_One_Byte(Addr); //首先讀取長(zhǎng)度信息
  75.         *Len <<= 8;
  76.         *Len += Read_One_Byte(Addr+1);
  77.         
  78.         if(*Len >= 511)
  79.                 *Len = 511;
  80.         
  81.         for(i=0;i<*Len;i++)
  82.         {
  83.                 Buf[i] = Read_One_Byte(Addr+2+i);
  84.         }
  85. }
  86. //
復(fù)制代碼




IAP.zip

1.63 KB, 下載次數(shù): 21, 下載積分: 黑幣 -5

最佳答案

查看完整內(nèi)容

//關(guān)閉IAP功能 void Close_IAP(void) { IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0; IAP_ADDRL = 0; } 中 IAP_ADDRH = 0;改為IAP_ADDRH = 0x80;

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:45334 發(fā)表于 2020-2-15 22:23 | 顯示全部樓層
//關(guān)閉IAP功能
void Close_IAP(void)
{
        IAP_CONTR = 0;
        IAP_CMD = 0;
        IAP_TRIG = 0;
        IAP_ADDRH = 0;
        IAP_ADDRL = 0;
}
中 IAP_ADDRH = 0;改為IAP_ADDRH = 0x80;
回復(fù)

使用道具 舉報(bào)

ID:278006 發(fā)表于 2020-2-16 17:57 | 顯示全部樓層
qsgang 發(fā)表于 2020-2-16 09:58
//關(guān)閉IAP功能
void Close_IAP(void)
{

1、讀取3參數(shù)個(gè)數(shù)  改動(dòng)后 保存到 EEPROM
我的用法是 :

unsigned int  Temp_Buf[3];                           //定義緩存:
Read_Flash_Message(ks_Addr,Temp_Buf, 3);//讀。汉瘮(shù)原型是:void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);

Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函數(shù)原型是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);
我對(duì)于 調(diào)用 帶指針參數(shù)的 函數(shù)有點(diǎn)迷糊  請(qǐng)教一下  我調(diào)用的方法對(duì)嗎?  一個(gè)是 len對(duì)應(yīng)的3好像是對(duì)的  *len也對(duì)應(yīng)3  對(duì)嗎?
回復(fù)

使用道具 舉報(bào)

ID:45334 發(fā)表于 2020-2-16 21:16 | 顯示全部樓層
讀錯(cuò)誤,寫正確,長(zhǎng)度用整形,不用指針
回復(fù)

使用道具 舉報(bào)

ID:278006 發(fā)表于 2020-2-17 10:54 | 顯示全部樓層
qsgang 發(fā)表于 2020-2-16 21:16
讀錯(cuò)誤,寫正確,長(zhǎng)度用整形,不用指針

讀錯(cuò)誤?您是說(shuō) 這個(gè)函數(shù)本身就是錯(cuò)誤 還是 我調(diào)用的錯(cuò)誤呀

//從Flash讀取內(nèi)容
void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len)
{
        unsigned int i=0;
        *Len = Read_One_Byte(Addr); //首先讀取長(zhǎng)度信息
        *Len <<= 8;
        *Len += Read_One_Byte(Addr+1);
        
        if(*Len >= 511)
                *Len = 511;
        
        for(i=0;i<*Len;i++)
        {
                Buf = Read_One_Byte(Addr+2+i);
        }
}
回復(fù)

使用道具 舉報(bào)

ID:91162 發(fā)表于 2020-3-8 08:39 | 顯示全部樓層
單片機(jī)初始化后要加幾百毫秒延時(shí),再進(jìn)主函數(shù),否則讀不出來(lái)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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