64、写 BEE 的标准程序是什么?
///******************************
// * 函数名: Erom_data_write()
// * 函数功能: BLOCK EEPROM 单数据块写入函数函数
// * 入口参数:写入首地址 Erom_add 和写入数组 Arr_erom2[]
// * 返回参数:无
// ******************************/
void Erom_data_write(uint address)
{
uchar i;
Erom_add = address;
OSCCTL=0x20; //降频到 1M
// OSCCTL=0x30; //降频到 1M
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
__asm
CLR _INTCTL , _AIE //关中断,防止中断打断 EEP
JNB _INTCTL , _AIE
JMP $-2
BANKSEL _Erom_add //为了防止 address 的两个数据不在一个
区
MOV R2 , _Erom_add
MOV _BADDRL , R2 //写入地址低位
BANKSEL _Erom_add //为了防止 address 的两个数据不在一个
区
MOV R2 , _Erom_add+1
MOV _BADDRH , R2 //写入地址高位
MOV R2 , #_Arr_erom //将数组的首地址送到 R0 低位在低位 高位在
高位对称
__endasm;
for(i=0;i<16;i++) //写入 4 个字, 8 个字节。
{
_CWDT();
BADDRH=0x0f;
if(BADDRL < 0X70)
break;
__asm
BANKSEL _Arr_erom //为了防止 Arr_erom2 中的元素不在一个区
LD R7 , [ R2 ] //向 R6 中写入数据低位
INCR2
BANKSEL _Arr_erom //为了防止 Arr_erom2 中的元素不在一个区
LD R6 , [ R2 ] //向 R7 中写入数据高位
INC R2 //指向下一个字
/****数据写入函数****/
MOV R5 , #0x84 //R5 在 C 编译器环境中被中断所占用,但是在操
作之前关闭中断可以进行 R5 的操作。
MOV _EECTL1 , R5
MOV R5 , #0x69
MOV _EECTL2 , R5
MOV R5 , #0x96
MOV _EECTL2 , R5
SET _EECTL1 , 1
.DW 0xffff
.DW 0xffff
.DW 0xffff
.DW 0xffff
.DW 0xffff
.DW 0xffff
DW 0xffff
.DW 0xffff
.DW 0xffff
.DW 0xffff
MOV R5 , #0X80 //关闭 BLOCK EE 的写操作,防止意外写
MOV EECTL1,R5
INC _BADDRL //操作地址指向下一个
__endasm;
}
OSCCTL=0x70; //降频到 16M
_NOP();
_NOP();
AIE=1;
}
|