Если речь идёт об атмегах, то запись флэш-памяти осуществляется там только страницами по 128 байт. То есть перед записью данных в флэш, необходимо считать страницу памяти, начиная с адреса, кратного 128, поменять нужные байты и записать страницу обратно.
Вот функция чтения страницы:
Код:
|
void read_flash_page(UINT Addr_r, UCHAR *flash_buffer)
{
UCHAR ii_r;
for (ii_r=0; ii_r ‹ 128; ii_r++)
{
*(flash_buffer+ii_r)=_LPM((UCHAR const __flash *)Addr_r);
Addr_r++;
}
} |
А вот функция записи данных в флэш:
Код:
|
#pragma location = "CODE_BOOT"
void write_flash_page(UINT Addr_w, UCHAR *flash_buffer)
{
UCHAR ii_w;
UINT data_w;
_Wait_SPMEN;
_SPM_ERASE(Addr_w);
_Wait_SPMEN;
_Enable_RWW;
for (ii_w=0; ii_w ‹ 64; ii_w++)
{
data_w=(*(flash_buffer+ii_w*2))+((*(flash_buffer+i i_w*2+1))‹‹8);
_Wait_SPMEN;
_SPM_FILLTEMP(Addr_w, data_w);
Addr_w+=2;
}
Addr_w-=128;
_Wait_SPMEN;
_SPM_PAGEWRITE(Addr_w);
_Wait_SPMEN;
_Enable_RWW;
} |
Строка #pragma location = "CODE_BOOT" вставлена потому, что команда записи данных в флэш должна располагаться в области начального загрузчика, то есть в конце флэши (см. даташит).
Переменная CODE_BOOT устанавливается в параметрах при вызове компилятора.