亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:278006 發(fā)表于 2020-2-15 22:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
10黑幣
STC 內(nèi)置EEPROM  讀取與保存的 .c和.h文件

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

1、讀取3參數(shù)個數(shù)  改動后 保存到 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)在是  無法保存  調(diào)取的也不對



//以下為.h文件
//使用單片機內(nèi)部的Flash,模擬EEPROM使用
//STC15W4K48S4 單片機,可以使用IAP命令擦寫內(nèi)部Flash
//起始地址 0X0000 結(jié)束 0X27FF  其中,512Byte一個扇區(qū)
//一共20個扇區(qū)  一個扇區(qū)可以存儲一組參數(shù),這樣就可以直接擦出整個扇區(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);
//讀取某地址一個字節(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> //用來CLI交互
  3. //STC15W4K48S4 單片機,可以使用IAP命令擦寫內(nèi)部Flash
  4. //起始地址 0X0000 結(jié)束 0X27FF  其中,512Byte一個扇區(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. //在某地址寫入一個字節(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. //讀取某地址一個字節(jié)
  40. unsigned char Read_One_Byte(unsigned int addr)
  41. {
  42.                 unsigned char dat=0;//定義一個待返回的數(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);//擦除對應(yīng)扇區(qū)
  59.         
  60.         if(Len >= 511)
  61.                 Len = 511;
  62.         
  63.         Write_One_Byte(Addr,Len>>8);//長度寫入首地址
  64.         Write_One_Byte(Addr+1,(Len&0X00FF));//長度寫入首地址
  65.         for(i=0;i<Len;i++) //順序存儲有效信息
  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); //首先讀取長度信息
  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;

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
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ù)

使用道具 舉報

板凳
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ù)個數(shù)  改動后 保存到 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);
我對于 調(diào)用 帶指針參數(shù)的 函數(shù)有點迷糊  請教一下  我調(diào)用的方法對嗎?  一個是 len對應(yīng)的3好像是對的  *len也對應(yīng)3  對嗎?
回復(fù)

使用道具 舉報

地板
ID:45334 發(fā)表于 2020-2-16 21:16 | 只看該作者
讀錯誤,寫正確,長度用整形,不用指針
回復(fù)

使用道具 舉報

5#
ID:278006 發(fā)表于 2020-2-17 10:54 | 只看該作者
qsgang 發(fā)表于 2020-2-16 21:16
讀錯誤,寫正確,長度用整形,不用指針

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

//從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); //首先讀取長度信息
        *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ù)

使用道具 舉報

6#
ID:91162 發(fā)表于 2020-3-8 08:39 | 只看該作者
單片機初始化后要加幾百毫秒延時,再進主函數(shù),否則讀不出來
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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