|
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文件
- #include "IAP_EEPROM.h"
- //#include<Uart_1.h> //用來CLI交互
- //STC15W4K48S4 單片機,可以使用IAP命令擦寫內部Flash
- //起始地址 0X0000 結束 0X27FF 其中,512Byte一個扇區
- //關閉IAP功能
- void Close_IAP(void)
- {
- IAP_CONTR = 0;
- IAP_CMD = 0;
- IAP_TRIG = 0;
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
- //擦除某地址所在的扇區
- void Erase_IAP(unsigned int addr)
- {
- IAP_CONTR = 0x82;//允許IAP操作,設置IAP操作速度
- IAP_CMD = 0x03;//扇區擦除命令
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;//地址賦值
- IAP_TRIG = 0x5a;
- IAP_TRIG = 0xa5;//觸發命令
- _nop_();_nop_();_nop_();
- Close_IAP();//清空IAP操作寄存器等
- }
- //在某地址寫入一個字節
- void Write_One_Byte(unsigned int addr,unsigned char dat)
- {
- IAP_CONTR = 0x82;//允許IAP操作,設置IAP操作速度
- IAP_CMD = 0x02;//IAP寫命令
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;//地址賦值
- IAP_DATA = dat;//更新寫寄存器
- IAP_TRIG = 0x5a;
- IAP_TRIG = 0xa5;//觸發
- _nop_();
- Close_IAP();//清空IAP操作寄存器等
- }
- //讀取某地址一個字節
- unsigned char Read_One_Byte(unsigned int addr)
- {
- unsigned char dat=0;//定義一個待返回的數據
- IAP_CONTR = 0x82;//允許IAP
- IAP_CMD = 0x01;//IAP讀命令
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;//地址賦值
- IAP_TRIG = 0x5a;
- IAP_TRIG = 0xa5;//觸發
- _nop_();_nop_();_nop_();_nop_();
- dat = IAP_DATA;
- Close_IAP();//清空IAP操作寄存器等
- return dat;
- }
- //保存內容到Flash
- void Save_Flash_Message(unsigned int Addr,unsigned char *Buf,unsigned int Len)
- {
- unsigned int i=0;
- Erase_IAP(Addr);//擦除對應扇區
-
- if(Len >= 511)
- Len = 511;
-
- Write_One_Byte(Addr,Len>>8);//長度寫入首地址
- Write_One_Byte(Addr+1,(Len&0X00FF));//長度寫入首地址
- for(i=0;i<Len;i++) //順序存儲有效信息
- {
- Write_One_Byte((Addr+2+i),Buf[i]);
- }
- }
- //從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[i] = Read_One_Byte(Addr+2+i);
- }
- }
- //
復制代碼
|
-
-
IAP.zip
2020-2-15 22:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
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;
評分
-
查看全部評分
|