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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5328|回復: 6
收起左側

STC單片機內置EEPROM讀取與保存 函數調用 .c和.h文件

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

請教如何調用文件  掉電不丟失

1、讀取3參數個數  改動后 保存到 EEPROM
我的用法是 :

unsigned int  Temp_Buf[3];                           //定義緩存:
Read_Flash_Message(ks_Addr,Temp_Buf, 3);//讀。汉瘮凳牵簐oid Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);

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

現在是  無法保存  調取的也不對



//以下為.h文件
//使用單片機內部的Flash,模擬EEPROM使用
//STC15W4K48S4 單片機,可以使用IAP命令擦寫內部Flash
//起始地址 0X0000 結束 0X27FF  其中,512Byte一個扇區
//一共20個扇區  一個扇區可以存儲一組參數,這樣就可以直接擦出整個扇區修改內容

#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



//保存內容到Flash
void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);
//從Flash讀取內容
void Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);
//讀取某地址一個字節
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命令擦寫內部Flash
  4. //起始地址 0X0000 結束 0X27FF  其中,512Byte一個扇區

  5. //關閉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. //擦除某地址所在的扇區
  15. void Erase_IAP(unsigned int addr)
  16. {
  17.                 IAP_CONTR = 0x82;//允許IAP操作,設置IAP操作速度         
  18.     IAP_CMD = 0x03;//扇區擦除命令            
  19.     IAP_ADDRL = addr;              
  20.     IAP_ADDRH = addr >> 8;//地址賦值         
  21.     IAP_TRIG = 0x5a;               
  22.     IAP_TRIG = 0xa5;//觸發命令               
  23.     _nop_();_nop_();_nop_();            
  24.     Close_IAP();//清空IAP操作寄存器等
  25. }
  26. //在某地址寫入一個字節
  27. void Write_One_Byte(unsigned int addr,unsigned char dat)
  28. {
  29.                 IAP_CONTR = 0x82;//允許IAP操作,設置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;//觸發
  36.     _nop_();
  37.     Close_IAP();//清空IAP操作寄存器等
  38. }
  39. //讀取某地址一個字節
  40. unsigned char Read_One_Byte(unsigned int addr)
  41. {
  42.                 unsigned char dat=0;//定義一個待返回的數據
  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;//觸發
  49.     _nop_();_nop_();_nop_();_nop_();
  50.     dat = IAP_DATA;
  51.                 Close_IAP();//清空IAP操作寄存器等
  52.     return dat;
  53. }
  54. //保存內容到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);//擦除對應扇區
  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讀取內容
  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. //
復制代碼




IAP.zip

1.63 KB, 下載次數: 21, 下載積分: 黑幣 -5

最佳答案

查看完整內容

//關閉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;

評分

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

查看全部評分

回復

使用道具 舉報

ID:45334 發表于 2020-2-15 22:23 | 顯示全部樓層
//關閉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;
回復

使用道具 舉報

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

1、讀取3參數個數  改動后 保存到 EEPROM
我的用法是 :

unsigned int  Temp_Buf[3];                           //定義緩存:
Read_Flash_Message(ks_Addr,Temp_Buf, 3);//讀。汉瘮翟褪牵簐oid Read_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int *Len);

Save_Flash_Message(ks_Addr,Temp_Buf, 3);//保存    函數原型是 :void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len);
我對于 調用 帶指針參數的 函數有點迷糊  請教一下  我調用的方法對嗎?  一個是 len對應的3好像是對的  *len也對應3  對嗎?
回復

使用道具 舉報

ID:45334 發表于 2020-2-16 21:16 | 顯示全部樓層
讀錯誤,寫正確,長度用整形,不用指針
回復

使用道具 舉報

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

讀錯誤?您是說 這個函數本身就是錯誤 還是 我調用的錯誤呀

//從Flash讀取內容
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);
        }
}
回復

使用道具 舉報

ID:91162 發表于 2020-3-8 08:39 | 顯示全部樓層
單片機初始化后要加幾百毫秒延時,再進主函數,否則讀不出來
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品一区二区三区中文字幕 | 亚洲天堂精品久久 | 色婷婷综合久久久中字幕精品久久 | 日韩一级黄色毛片 | 91久久久久久 | 亚洲一视频 | 亚洲欧美中文日韩在线v日本 | 在线免费观看一区二区 | 中文字幕日韩一区 | 欧美一区二区免费在线 | 久久视频精品 | 精品一区国产 | 亚洲午夜网 | av黄色片| 在线播放亚洲 | 中文字幕在线精品 | 久久精品99久久 | 国产欧美性成人精品午夜 | 久久久久久国产精品 | 国产高清在线观看 | 欧一区二区 | 一区二区在线不卡 | 国产精品视频久久 | 成人在线免费网站 | 欧美精品中文字幕久久二区 | 中文字幕久久精品 | 偷拍自拍网 | 国产真实精品久久二三区 | 国产精品美女久久久 | 欧美一区二区在线播放 | 久久精品日 | 天天搞天天操 | 久久久国产一区二区三区四区小说 | 日韩第一页 | 亚洲免费视频网站 | 99久久免费精品国产男女高不卡 | 国产精品免费一区二区三区四区 | 老司机久久 | 欧美一区二区三区日韩 | 欧美黄色片在线观看 | 精品福利一区二区三区 |