欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
需要大神進行數據保存講解,還有如何修改單片機程序
[打印本頁]
作者:
slckkk
時間:
2019-5-20 08:55
標題:
需要大神進行數據保存講解,還有如何修改單片機程序
/*
以下已經給出數據存儲的例程。就是把N個用戶數據通過緩存器ram的xdata區(0x8000~0x801f)來把數據存儲到 rom區的指定地址域 block_a和block_a_end之中; (ram就是所謂的“內存”,rom就是所謂的“硬盤”)
請讀懂函數,并把" //**************** "和” //********************* “之間的代碼,壓縮成一個循環體(主要問題)
思路是:把ROM塊“block_a(block_a~block_a_end)”分成長度為“save_size(即'用戶數據+CRC’的長度)”的若干個區,并標記bank1、bank2。。。。。bank n ;擦除時,會擦除整個塊"block_a",保存數據時,
則是先保存在bank1,下次保存在bank2,再次保存,則保存在緊挨著的下個bank; 最后整個block_a塊都滿了,則重新擦除塊“block_a“,再次從bank1(block_a的首地址)開始保存數據。就這樣周而復始;
注:
一次性最多只能擦除或者寫32byte,所有的數據,必須經過xdata區(0x8000~0x801f)的32byte緩沖區來完成。
擦除數據:1次最少可以擦除1byte的數據,最多一次性可以擦除32byte數據,在xdata區(0x8000~0x801f)把需要擦除的字節清零,接著執行擦除動作就可以了。
數據存儲:對于已經擦除過的扇區,則把要保存的數據發送到在xdata區(0x8000~0x801f),接著執行寫的動作就可以了
先選擇FMCR=0x01;來激活xdata區,并激活其他關于false操作的寄存器。
激活xdata區后,只有對xdata區(0x8000~0x801f)賦值的byte的才會對應的被擦或寫。
在執行擦除和寫動作時,會自動屏蔽中斷,不需要軟件屏蔽。
以長度為N數據鏈為例,其結構為:前面第0到第(N-2)個數據為用戶數據,最后一個——————第(N-1)為數據鏈的冗余碼。
*/
#define block_a ((unsigned char code *)0x3c00) /* BLOCK A ADDRESS 首地址*/
#define block_a_end ((unsigned char code *)0x3fff) /* BLOCK A end_ADDRESS 末地址*/
#define pgbuf_size 32 //緩沖區大小
#define pgbuf_start ((unsigned char xdata *)0x8000) //緩沖區首地址
#define pgbuf_end ((unsigned char xdata *)0x801f) //緩沖區末地址
//==========================================================
//塊擦除
//輸入block首地址(ers_start_addr)和末地址(ers_end_addr)
//擦除輸入的地址段
//芯片支持單個byte的擦除,但是本子程序不支持
//==========================================================
void fnblock_erase(uchar code *ers_start_addr,uchar code *ers_end_addr);
//===========================================
// 設置數據的保存
//本子程序允許存儲的數據鏈長度不限
//主要用于掉電記憶
//===========================================
#define save_size 45 //儲存的數據長度
uchar fntake_crc(uchar *p,uchar num_size); //求數據連的CRC
void fnact_circuit(); //激活燒錄升壓電路
void fnact_write(); //執行燒錄
void fnsave_data()
{
uchar code *write_addr;
uchar i,k,m,n,y;
k=take_crc(&save[0],(save_size-1)); //求CRC
save[save_size-1]=k; //保存CRC
write_addr=block_a;
y=0;
while(y<100) //如果換區100個都寫不成功,則認為芯片永久損壞,報廢。
{
while(write_addr<=(block_a_end-save_size)) //確保要寫的數據在block_a區域內
{ //-----------------查空,空時為0 ,當rom區為“空”時,邏輯數據為“0”
//在數據保存之前,先檢查需要保存的地址區域連save_size的長度都為“空”
for(i=0;i<save_size;i++)
{
if(*(write_addr+i)!=0) break;
}
if(i==save_size) break; //判斷,如果連續save_size的長度都為“空”,則結束循環并跳出
write_addr+=save_size; //如果當前的地址域不是連續“空”,則準備查詢下一個區
if(write_addr>(block_a_end-save_size)) //如果從block_a到(block_a_end-save_size)的區間都有非零數據(不是“空”),則執行調用擦除函數fnblock_erase()
{
block_erase(block_a,block_a_end); //擦除數據塊block_a
write_addr=block_a; //重置寫數據的區
bflash_erase=true; //置1,避免第85行,重復調用fnblock_erase()
break;
}
}
if((write_addr==block_a)&&(bflash_erase==false))
{ //第一次存儲時,也需要擦除一次
block_erase(block_a,block_a_end); //擦除
write_addr=block_a;
}
bflash_erase=false;
//開始寫入
//*****************************************************************
n=0;
while(n<8) //同一個區允許寫8次
{
//=================寫入一部分數據======================
k=(write_addr-block_a)%pgbuf_size; //計算開始寫的緩沖區相對地址
pgbuf=pgbuf_start+k; //開始寫的緩沖區絕對地址
fnact_circuit(); //激活燒錄升壓電路
m=pgbuf_size-k; //m=要保存數據的首地址(在緩沖區“0x8000~0x801f”中的首地址)
for(i=0;((i<m)&&(i<save_size));i++)
{ //把需要保存的數據移到緩沖區
*(pgbuf+i)=save[i];
}
if(write_addr>=0x3800)
{
FSADRL=(ushort)write_addr; //數據要保存在rom中的絕對地址低8位
FSADRM=(ushort)write_addr>>8; //數據要保存在rom中的絕對地址高8位
FSADRH=0;
fnact_write(); //執行燒錄
}
//=================================================
//================繼續寫剩下部分====================
for(;m<save_size;)
{ /
pgbuf=pgbuf_start;
fnact_circuit(); //激活燒錄升壓電路
for(i=0;((i<pgbuf_size)&&(i<(save_size-m)));i++)
{ //把需要保存的數據移到緩沖區
*(pgbuf+i)=save[i+m];
}
if(write_addr>=0x3800)
{
FSADRL=((ushort)write_addr+m);
FSADRM=((ushort)write_addr+m)>>8;
FSADRH=0;
fnact_write(); //執行燒錄
}
m=m+i;
}
//======================================
//**************************************
//-----------------------------驗證存儲是否成功
for(i=0;i<save_size;i++)
{
if(*(write_addr+i)!=save[i]) break;
}
if(i==save_size) break;
n++;
}
if(i==save_size) break;
y++;
write_addr+=save_size; //如果同一區寫8次不成功,則換區
if(write_addr>(block_a_end-save_size))
{
block_erase(block_a,block_a_end); //擦除
write_addr=block_a;
bflash_erase=true;
}
}
}
復制代碼
作者:
zhanghyg
時間:
2019-5-20 09:56
你想要怎么改啊
作者:
slckkk
時間:
2019-5-20 12:23
把" //**************** "和” //********************* “之間的代碼,壓縮成一個循環體
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1