CODE
unsigned char flashpage[257];
unsigned short flashwpage[129];
void SP_Load_Flash_Buffer(unsigned char adres, unsigned short data)
{
cli();
asm("push r0");
asm("push r1");
asm("push r30");
asm("push r31");
asm("mov r30,r24");
asm("clr r31");
asm("mov r0,r23");
asm("mov r1,r22");
asm("ldi r24,0x23");
asm("sts 0x1ca,r24");
asm("spm");
asm("pop r31");
asm("pop r30");
asm("pop r1");
asm("pop r0");
sei();
};
void SP_Erase_WriteApplicationPage(unsigned short adres)
{
cli();
asm("push r16");
asm("push r30");
asm("push r31");
asm("mov r30,r24");
asm("mov r31,r24");
asm("ldi r16, 0x25");
asm("sts 0x1ca,r16");
asm("ldi r16, 0x9d");
asm("sts 0x34,r16");
asm("spm");
asm("pop r31");
asm("pop r30");
asm("pop r16");
sei();
_delay_ms(100);
};
//////////////////////////////////////////////
void SP_Erase_Flash_buffer(void)
{
NVM.CMD=NVM_CMD_ERASE_FLASH_BUFFER_gc;
NVM.CTRLA|=0x01;
_delay_ms(50);
};
////////////////////////////////////////////////////
void Story_Data_in_Flash(unsigned char page,unsigned char *buffer)
{
unsigned char offset=0;
unsigned short data=0;
SP_Erase_Flash_buffer();
for(offset=0;offset<254;offset+=2)
{
data=buffer[offset];
data<<=8;
data|=buffer[offset+1];
SP_Load_Flash_Buffer(offset,data);
};
data=buffer[254];
data<<=8;
data|=buffer[255];
SP_Load_Flash_Buffer(255,data);
SP_Erase_WriteApplicationPage(page);
};
/////////////////////////////////////////////////////////
cli();
flashpage[0] = 0x55;
SP_Erase_WriteApplicationPage(0x78);
_delay_ms(100);
Story_Data_in_Flash(0x78,flashpage);
_delay_ms(100);
flashpage[0] = 0x00;
SP_Load_Flash_Buffer(0x78, flashwpage);
_delay_ms(100);
if(flashwpage[0]==0x5500)
{
for(k=0; k<6; k++)
{
PORTD_OUT^=0x40;
PORTE_OUT = 0x00;
_delay_ms(400);
PORTE_OUT = 0xFF;
_delay_ms(200);
}
}
unsigned short flashwpage[129];
void SP_Load_Flash_Buffer(unsigned char adres, unsigned short data)
{
cli();
asm("push r0");
asm("push r1");
asm("push r30");
asm("push r31");
asm("mov r30,r24");
asm("clr r31");
asm("mov r0,r23");
asm("mov r1,r22");
asm("ldi r24,0x23");
asm("sts 0x1ca,r24");
asm("spm");
asm("pop r31");
asm("pop r30");
asm("pop r1");
asm("pop r0");
sei();
};
void SP_Erase_WriteApplicationPage(unsigned short adres)
{
cli();
asm("push r16");
asm("push r30");
asm("push r31");
asm("mov r30,r24");
asm("mov r31,r24");
asm("ldi r16, 0x25");
asm("sts 0x1ca,r16");
asm("ldi r16, 0x9d");
asm("sts 0x34,r16");
asm("spm");
asm("pop r31");
asm("pop r30");
asm("pop r16");
sei();
_delay_ms(100);
};
//////////////////////////////////////////////
void SP_Erase_Flash_buffer(void)
{
NVM.CMD=NVM_CMD_ERASE_FLASH_BUFFER_gc;
NVM.CTRLA|=0x01;
_delay_ms(50);
};
////////////////////////////////////////////////////
void Story_Data_in_Flash(unsigned char page,unsigned char *buffer)
{
unsigned char offset=0;
unsigned short data=0;
SP_Erase_Flash_buffer();
for(offset=0;offset<254;offset+=2)
{
data=buffer[offset];
data<<=8;
data|=buffer[offset+1];
SP_Load_Flash_Buffer(offset,data);
};
data=buffer[254];
data<<=8;
data|=buffer[255];
SP_Load_Flash_Buffer(255,data);
SP_Erase_WriteApplicationPage(page);
};
/////////////////////////////////////////////////////////
cli();
flashpage[0] = 0x55;
SP_Erase_WriteApplicationPage(0x78);
_delay_ms(100);
Story_Data_in_Flash(0x78,flashpage);
_delay_ms(100);
flashpage[0] = 0x00;
SP_Load_Flash_Buffer(0x78, flashwpage);
_delay_ms(100);
if(flashwpage[0]==0x5500)
{
for(k=0; k<6; k++)
{
PORTD_OUT^=0x40;
PORTE_OUT = 0x00;
_delay_ms(400);
PORTE_OUT = 0xFF;
_delay_ms(200);
}
}
Здравствуйте
Пробую запись во флеш атиксмеги на основе вышеперечисленных функции, в итоге не получается
Прошу подсказать кто работал.
Заранее благодарен