W układzie znajdują się 3 rodzaje pamięci:
W pamięci EEPROM możemy zapisywać pomiary i ustawienia. Wykorzystamy nagłówek:
#include <avr/eeprom.h>
W którym znajdują się prototypy następujących funkcji:
uint8_t eeprom_read_byte (const uint8_t *addr) void eeprom_write_byte (uint8_t *addr, uint8_t value) uint16_t eeprom_read_word (const uint16_t *addr) void eeprom_write_word (uint16_t *addr, uint16_t value) void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n) void eeprom_write_block (void *pointer_eeprom, const void *pointer_ram, size_t n)
Wcześniej pisałem o PROGMEM
dotyczącym pamięci FLASH, tutaj analogicznie użyjemy EEMEM
.
uint8_t EEMEM NonVolatileChar; uint16_t EEMEM NonVolatileInt; uint8_t EEMEM NonVolatileString[10]; int main(void) { uint8_t SRAMchar; uint16_t SRAMint; uint8_t SRAMstring[10]; SRAMchar = eeprom_read_byte(&NonVolatileChar); SRAMint = eeprom_read_word(&NonVolatileInt); eeprom_read_block((void*)&SRAMstring, (const void*)&NonVolatileString, 10); eeprom_write_block((const void*)&NonVolatileString, "123456789", 10); }
Uwaga! Jeżeli definiujemy początkowe wartości zmiennych w pamięci EEPROM to musimy pamiętać o zaprogramowaniu również pliku wynikowego dla pamięci EEPROM (nie tylko FLASH) W Eclipse: Project→Properties→AVR→AVRDude→Flash/EEPROM→Upload EEPROM Image zaznaczamy from build
Układy AVR posiadają możliwość programowanie poprzez bootloader (od Bootstrap) czyli program rozruchowy. Możemy napisać program który zostanie umieszczony na końcu pamięci FLASH oraz ustawić odpowiednie fusebity które pozwalają ustawić wektor przerwania reset z początku pamięci programu do adresu pod którym znajduje się nasz bootloader. Taki fragment kodu posiada specjalne uprawnienia: może zapisywać pamięć FLASH! Istnieją pewne ograniczenia np. bootloader musi zajmować określony zakres pamięci, a więc może zajmować tylko: 128, 256, 512 lub 1024 bajty. W praktyce zastosowanie bootloadera jest niezwykle pomocne, do układu nie musi być podpięty programator ISP czy JTAG, programowanie może odbywać się przez UART, który zajmuje tylko 2 piny układu, co więcej często aplikacje układu wykorzystują UART z założenia.
Do poczytania PDF: AVRFreaks