?? stc_flash.c
字號(hào):
/****************************************************************
//MCS-51單片機(jī)底層EEPROM操作庫(kù)。
//只在STC89C52單片機(jī)上實(shí)驗(yàn)過(guò)
//create by changshengwuji
//email: netspider@163.com
//qq: 450353168
//2006.05.03
****************************************************************/
//#include "define_stc_flash.h"
#include "../inc/MCS_X51.H"
#include<intrins.h>
bit gint;
/*************************************************
//-----使能IAP----------------
*************************************************/
void flsh_en()
{
gint = EA;
INT_GLOBAL(0); //DISABLE INTERUPT
set_flsh_wait; //set wait time
set_flsh_en; //enable flash operate
}
/**************************************************
//停止IAP
**************************************************/
void flsh_ds()
{
set_flsh_ds; //disable flash operate
set_flsh_trig(0); //dis trig
INT_GLOBAL(gint); //return global int
}
/*從flash中讀出一個(gè)字節(jié)返回*/
UINT8 flsh_rd_byte(UINT16 addx)
{
set_flsh_addr(addx);
flsh_wr_cmd(CMD_READ);
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
return(flsh_rd_data);
}
/******************************************
//從一個(gè)扇區(qū)內(nèi)讀出一串?dāng)?shù)據(jù)。
//傳送參數(shù):扇區(qū)內(nèi)地址,讀出個(gè)數(shù),讀出地址
********************************************/
bit flsh_sector_rd(UINT16 addx,UINT8 num,UINT8 *p)
{
UINT8 i;
if(num > USED_SPACE)
return(0); //超出扇區(qū)范圍,退出
flsh_en();
for(i = 0;i < num;i++)
{
*p=flsh_rd_byte(addx + i);
p++;
}
flsh_ds(); //禁止iap操作
return(1);
}
/***********************************************
//扇區(qū)擦除
***********************************************/
void flsh_sector_earse(UINT16 addx)
{
UINT16 sec_addr = 0xfe00;
sec_addr &= addx; //取得扇區(qū)首地址
set_flsh_addr(sec_addr);
flsh_en();
flsh_wr_cmd(CMD_SES); //扇區(qū)擦除命令
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
flsh_ds();
}
/***********************************************************
// 寫(xiě)一個(gè)字節(jié)并校驗(yàn),如果寫(xiě)正確,返回1,否則返回0
***********************************************************/
bit flsh_wr_verify(UINT16 addx,UINT8 dax)
{
set_flsh_addr(addx);
flsh_wr_cmd(CMD_PGM);
flsh_wr_data(dax); //寫(xiě)數(shù)據(jù)到iap的數(shù)據(jù)寄存器。
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
flsh_wr_data(0); //使iap的數(shù)據(jù)寄存器改變,以便回讀。
flsh_wr_cmd(CMD_READ);
set_flsh_trig(TRIG1);
set_flsh_trig(TRIG2);
_nop_;
if(flsh_rd_data == dax)
return(1);
else
return(0);
}
/**************************************************************************
//寫(xiě)一個(gè)扇區(qū)
//傳送16位的目的地址,最好從扇區(qū)首地址開(kāi)始,8位的數(shù)據(jù)長(zhǎng)度,源數(shù)據(jù)的指針
**************************************************************************/
bit flsh_sector_wr(UINT16 addx,UINT8 num,UINT8 * pdax)
{
UINT8 i;
UINT16 addr;
if(num > USED_SPACE)
return(0); //超出扇區(qū)范圍退出
addr = addx;
flsh_sector_earse(addx); //擦除目的扇區(qū)
flsh_en();
for(i=0;i<num;i++)
{
if(!flsh_wr_verify(addr,*pdax))
{
flsh_ds(); //操作出錯(cuò),返回前禁止flash操作
return(0);
}
addr++;
pdax++;
}
flsh_ds(); //寫(xiě)完畢禁止FLASH 操作
return(1);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -