Код
void boot_program_page (uint32_t page, uint8_t *buf)
{
uint16_t i;
uint8_t sreg;
sreg = SREG;
asm("cli"); // Disable interrupts.
eeprom_busy_wait();
boot_page_erase(page);
boot_spm_busy_wait(); // Wait until the memory is erased.
for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.
uint16_t w = *buf++;
w += (*buf++) << 8;
boot_page_fill_safe(page + i, w);
//boot_page_fill (page + i, w);
}
boot_page_write(page); // Store buffer in flash page.
boot_spm_busy_wait(); // Wait until the memory is written.
// Reenable RWW-section again. We need this if we want to jump back
// to the application after bootloading.
//boot_rww_enable ();
// Re-enable interrupts (if they were ever enabled).
boot_rww_enable();
SREG = sreg;
boot_spm_interrupt_enable();
//asm("sei"); // Enable interrupts
}
{
uint16_t i;
uint8_t sreg;
sreg = SREG;
asm("cli"); // Disable interrupts.
eeprom_busy_wait();
boot_page_erase(page);
boot_spm_busy_wait(); // Wait until the memory is erased.
for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.
uint16_t w = *buf++;
w += (*buf++) << 8;
boot_page_fill_safe(page + i, w);
//boot_page_fill (page + i, w);
}
boot_page_write(page); // Store buffer in flash page.
boot_spm_busy_wait(); // Wait until the memory is written.
// Reenable RWW-section again. We need this if we want to jump back
// to the application after bootloading.
//boot_rww_enable ();
// Re-enable interrupts (if they were ever enabled).
boot_rww_enable();
SREG = sreg;
boot_spm_interrupt_enable();
//asm("sei"); // Enable interrupts
}
1. Что будет если не использовать макрос boot_page_erase(page); ?
2. Возможно ли исправить только несколько слов в странице? Используя boot_page_fill() с конкретными адресами а потом запуская boot_page_write(page);?
Контроллер Atmega 128
Заранее благодарю.