Код
/* Flash Memory write function, writes a buffer (Buffer_Add) to the Flash memory, size is number of words */
__near UINT8 Flash_Write(__far UINT16 *Flash_Add, UINT16 *Buffer_Add, INT16 numwords) {
INT16 flag; /* flag to indicate end of Flash memory write cycle */
////
UINT32 f = (UINT32)Flash_Add;
UINT32 b = (UINT32)Buffer_Add;
puthex(f>>24);puthex(f>>16);puthex(f>>8);puthex(f);puts("\n\r");
puthex(b>>24);puthex(b>>16);puthex(b>>8);puthex(b);puts("\n\r");
puthex(numwords>>8);puthex(numwords);puts("\n\r");
__DI();
if(FMCS_RDY == 0)Read_Reset();
FMCS_WE = 1; /* enable write access to Flash memory */
while (numwords >0) {
flag=0;
////
puts("1");
*SEQ_AAAA = 0xAA; /* unlock sequence for Flash memory write */
////
puts("2");
*SEQ_5554 = 0x55;
////
puts("3");
*SEQ_AAAA = 0xA0;
////
puts("4");
*Flash_Add = *Buffer_Add;
////
puts("5");
while (flag == 0) {
if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
flag = 1;
numwords--;
Flash_Add++;
Buffer_Add++;
}
else {
if((*Flash_Add & 0x0020) == 0x0020) { /* time limit exceeded? */
if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
flag = 1;
numwords--;
Flash_Add++;
Buffer_Add++;
}
else {
flag = 2;
Read_Reset();
FMCS_WE = 0; /* disable Flash write */
__EI();
return(2); /* return value 2, write buffer aborted due to timeout error */
}
}
}
}
}
FMCS_WE = 0; /* disable Flash write */
__EI();
return(3); /* return value 3, write buffer finished successfully */
}
__near UINT8 Flash_Write(__far UINT16 *Flash_Add, UINT16 *Buffer_Add, INT16 numwords) {
INT16 flag; /* flag to indicate end of Flash memory write cycle */
////
UINT32 f = (UINT32)Flash_Add;
UINT32 b = (UINT32)Buffer_Add;
puthex(f>>24);puthex(f>>16);puthex(f>>8);puthex(f);puts("\n\r");
puthex(b>>24);puthex(b>>16);puthex(b>>8);puthex(b);puts("\n\r");
puthex(numwords>>8);puthex(numwords);puts("\n\r");
__DI();
if(FMCS_RDY == 0)Read_Reset();
FMCS_WE = 1; /* enable write access to Flash memory */
while (numwords >0) {
flag=0;
////
puts("1");
*SEQ_AAAA = 0xAA; /* unlock sequence for Flash memory write */
////
puts("2");
*SEQ_5554 = 0x55;
////
puts("3");
*SEQ_AAAA = 0xA0;
////
puts("4");
*Flash_Add = *Buffer_Add;
////
puts("5");
while (flag == 0) {
if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
flag = 1;
numwords--;
Flash_Add++;
Buffer_Add++;
}
else {
if((*Flash_Add & 0x0020) == 0x0020) { /* time limit exceeded? */
if((*Flash_Add & 0x0080) == (*Buffer_Add & 0x0080)) { /* write cycle finished succesfully? */
flag = 1;
numwords--;
Flash_Add++;
Buffer_Add++;
}
else {
flag = 2;
Read_Reset();
FMCS_WE = 0; /* disable Flash write */
__EI();
return(2); /* return value 2, write buffer aborted due to timeout error */
}
}
}
}
}
FMCS_WE = 0; /* disable Flash write */
__EI();
return(3); /* return value 3, write buffer finished successfully */
}
Вывод в консоль:
Код
00FF8000
000022EC
0046
1234
000022EC
0046
1234
PS: Watchdog отключен.
Что может быть?
PS2: Тут вдруг подумалось, а не может ли это быть из-за того, что контроллер 474l работает на 16МГц (4 кварц * 4 множитель)?