📄 iap.c
字号:
#include "reg922.h"
#include "iap.h"
#define uint8 unsigned char
#define uint16 unsigned int
#define PAGE_SIZE 0x3F
/* 定义FLASH控制命令字 */
#define LOAD 0x00 /* 加载数据 */
#define PROG 0x48 /* 编程 */
#define ERS_PROG 0x68 /* 擦除编程 */
#define ERS_S 0x71 /* 擦除扇区 */
#define ERS_P 0x70 /* 擦除页 */
bit prog_fail;
uint8 idata W_ADDRH,W_ADDRL;
uint16 idata R_ADDR;
bit FLASH_WriteByte(uint16 addr, uint8 dat)
{
long i;
EA=0;
FMCON = LOAD; // 设置加载数据命令
FMADRH = addr>>8; // 设置写入地址
FMADRL = addr&0xFF;
FMDATA = dat; // 写入数据
FMCON = ERS_PROG;
for(i=0;i<200;i++);
if ( (FMCON&0x0F)!=0x00 )
{
EA=1;
return(0);
}
else
{
EA=1;
return(1);
}
}
uint8 FLASH_ReadByte(uint16 addr)
{
uint8 code *readp;
readp = addr;
return(*readp);
}
/*
bit FLASH_WriteNByte(uint16 addr, uint8 *dat_buf, uint8 no)
{
long i;
if(0==no) return(0);
FMCON = LOAD; // 设置加载数据命令
FMADRH = addr>>8; // 设置写入地址
FMADRL = addr&0xFF;
while(1)
{ FMDATA = *dat_buf; // 写入数据
dat_buf++; // 指向下一个待写入的数据
addr++;
no--;
if(0==no) break; // 判断是否写完所有数据,若是则退出
if( (addr&PAGE_SIZE)==0 ) // 判断是否要换页
{ FMCON = ERS_PROG; // 若是,则擦除编程
if( (FMCON&0x0F)!=0x00 ) return(0);
// 切换到下一页
FMCON = LOAD;
FMADRH = addr>>8;
FMADRL = addr&0xFF;
}
}
FMCON = ERS_PROG; // 擦除编程
for(i=0;i<200;i++);
if( (FMCON&0x0F)!=0x00 )
{
EA=1;
return(0);
}
else
{
EA=1;
return(1);
}
}
void FLASH_ReadNByte(uint16 addr, uint8 *dat_buf, uint8 no)
{ uint8 code *readp;
if(0==no) return;
readp = addr; // 设置读取的地址
for(; no>0; no--)
{ *dat_buf = *readp; // 读取数据
dat_buf++;
readp++; // 指向下一地址
}
}
bit FLASH_EraseSector(uint16 addr)
{
long i;
EA=0;
FMADRH = addr>>8;
FMADRL = addr&0xFF;
FMCON = ERS_S;
for(i=0;i<200;i++);
if( (FMCON&0x0F)!=0x00 )
{
EA=1;
return(0);
}
else
{
EA=1;
return(1);
}
}
bit FLASH_ErasePage(uint16 addr)
{
long i;
EA=0;
FMADRH = addr>>8;
FMADRL = addr&0xFF;
FMCON = ERS_P;
for(i=0;i<200;i++);
if( (FMCON&0x0F)!=0x00 )
{
EA=1;
return(0);
}
else
{
EA=1;
return(1);
}
}
bit FLASH_FillPage(uint16 addr, uint8 dat)
{ uint8 i;
long j;
// 擦除扇区
if( FLASH_ErasePage(addr)==0 ) return(0);
//填充数据
FMADRH = addr>>8; // 设置页起始地址
FMADRL = addr&(~PAGE_SIZE);
FMCON = LOAD; // 设置加载数据命令
for(i=0; i<=PAGE_SIZE; i++)
{ FMDATA = dat; // 加载数据
}
FMCON = PROG; // 开始编程
for(j=0;j<200;j++);
if( (FMCON&0x0F)!=0x00 )
{
EA=1;
return(0);
}
else
{
EA=1;
return(1);
}
}
bit PGM_USER(uint8 page_hi , uint8 page_lo )
{
uint8 Fm_stat;
uint8 i; // 循环次数
FMCON = LOAD; // 装载命令,清除页寄存器
FMADRH = page_hi; //
FMADRL = page_lo; // 页地址写入地址寄存器
for (i=0;i<64;i++)
{
// temp=dbytes[i];
FMDATA=0xdd;
}
FMCON=ERS_PROG; // 擦除&编程页命令
Fm_stat = FMCON; // 读结果状态
if((Fm_stat & 0xF)!=0)
prog_fail = 1;
else
prog_fail = 0;
return (prog_fail);
}
void FLASH_TEST(void)
{
unsigned char sta,addrh,addrl;
unsigned int i,j;
Uart_Printf("This is a FLASH Test!");
for(i=0xd00;i<0xd64;i++)
{
addrh=i/256;
addrl=i%256;
if(PGM_USER(addrh,addrl))
{
// Uart_Printf("Program FLASH Fail!\n");
}
}
for(i=0xcf0;i<0xdff;i++)
{
sta=FLASH_ReadByte(i);
Uart_Printchar(sta);
for(j=0;j<65535;j++) ;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -