📄 stciap.c
字号:
/**********************************************
* 文件名:STCIAP.C
/**********************************************/
#include "REG51STC.H"
#include "oven.h"
#include "citation.h"
#include <INTRINS.H>
//-----------------------------------------------------
#define DATA_FLASH_START_ADDRESS 0x2800 //STC12C5410
#define ENABLE_ISP 0x81 //等待时间
//---------------------------------------
/***********************************************
* 功能:送地址
************************************************/
void set_isp_add(uint add)
{
ISP_ADDRH=add/256;
ISP_ADDRL=add%256;
}
/**********************************************
* 功能:触发ISP
***********************************************/
void trigger_isp(void)
{
//EA=0;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();_nop_();_nop_();_nop_();_nop_();
// EA=1;
}
/****************************************
* 功能:打开 ISP,IAP 功能
****************************************/
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | ENABLE_ISP;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
/***********************************************
* 功能:关闭IAP功能
************************************************/
void iap_disable(void)
{
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
EA=1;
}
/************************************************
* 功能:IAP字节读
*************************************************/
uchar byte_verify(uint add)
{
ISP_CMD=1;
set_isp_add(add);
ISP_IAP_enable();
trigger_isp(); //触发ISP
iap_disable(); //关闭IAP功能
return(ISP_DATA);
}
/***********************************************
* 功能:字节编程
************************************************/
void byte_program(uint add,uchar *ptr)
{
ISP_CMD=2;
set_isp_add(add);
ISP_DATA=*ptr;
ISP_IAP_enable();
trigger_isp();
iap_disable(); //关闭IAP功能
if(*ptr!=byte_verify(add)) isp_err=1; //只要有1个字节写入不正确则出错
}
/**********************************************
* 功能:扇区擦除
***********************************************/
void sector_erase(uint add)
{
//ISP_CONTR=ENABLE_ISP;//等待时间
ISP_CMD=0x03;
set_isp_add(add);
ISP_IAP_enable();
trigger_isp();
iap_disable(); //关闭IAP功能
}
/*************************************************
* 功能:保存IAP系统参数
*************************************************/
void iap_sys_save(uint add,uchar *pi,uchar amount)
{ uchar i;
sector_erase(add); //扇区擦除
ISP_CONTR=ENABLE_ISP;//等待时间
for(i=0;i<amount;i++)
{
byte_program(add+i,pi+i);
}
}
/*************************************************
* 功能:读IAP系统参数
*************************************************/
void iap_sys_read(uint add,uchar *pi,uchar amount)
{ uchar i;
ISP_CONTR=ENABLE_ISP;//等待时间
for(i=0;i<amount;i++)
{
*(pi+i)=byte_verify(add+i);
}
//iap_disable(); //关闭IAP功能
}
/*************************************************
* 功能:掉电保存数据
**************************************************/
void power_drop_save(void)
{ void *pi;
drop_bit=save_bit;
pi=&drop_bit;
iap_sys_save(DATA_FLASH_START_ADDRESS+512,pi,9);
}
/*************************************************
* 功能:恢复掉电数据
**************************************************/
void renew_dropdata(void)
{ void *pi;
pi=&drop_bit;
iap_sys_read(DATA_FLASH_START_ADDRESS+512,pi,9);
save_bit=drop_bit;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -