WÅ‚asny bootloader do AVR - krok po kroku
Mikrokontolery serii ATMega wyposażone zostały w instrukcje pozwalające programować pamięć Flash z poziomu aplikacji. Dzięki temu istnieje możliwość zmiany oprogramowania w mikrokontrolerze poprzez dowolny, wybrany interfejs.Poniżej przedstawiony zostanie sposób implementacji prostego bootloadera sterowanego poprzez interfejs RS232.
Wstęp
Pamięć programu w mikrokontrolerach ATMega podzielona została na dwa obszary. Pierwszy z nich to tzw. obszar aplikacji, natomiast drugi to obszar programu ładującego (BLS). Program umieszczony w obszarze BLS może przeprogramować obszar aplikacji. Nasz bootloader musi być więc umieszczony w obszarze BLS.
Program
Program został napisany dla mikrokontrolera ATMega88, jednak dostosowanie do innych układów jest bardzo proste.
Zapis programu:
boot_write: rcall RS232_send_char rcall RS232_receive_char cpi acc,'f' brne boot_write_ee rcall RS232_send_char rcall RS232_receive_char mov yh,acc rcall RS232_receive_char mov yl,acc clr zl clr zh boot_write_flash_loop_1: mov xl,zl mov xh,zh ldi temp2,PAGESIZE boot_write_flash_loop_2: rcall RS232_receive_char rcall RS232_send_char mov r0,acc rcall RS232_receive_char rcall RS232_send_char mov r1,acc ldi spm_cmd,(1 << SELFPRGEN) rcall spm_do adiw z,2 cp zh,yh brlo boot_write_flash_no_end cp zl,yl brsh boot_write_flash_end boot_write_flash_no_end: dec temp2 brne boot_write_flash_loop_2 boot_write_flash_end: push zl push zh mov zl,xl mov zh,xh ldi spm_cmd,(1 << PGWRT | 1 << SELFPRGEN) rcall spm_do pop zh pop zl cp zh,yh brlo boot_write_flash_loop_1 cp zl,yl brlo boot_write_flash_loop_1 ldi spm_cmd,(1 << RWWSRE | 1 << SELFPRGEN) rcall spm_do ldi acc,'d' rcall RS232_send_char boot_loop_go: rjmp boot_loop
Zapis programu odbywa się w przedziale pamięci od 0 do yh:yl. Parametry określające górną granicę przekazywane są poprzez interfejs RS232 przez użytkownika.
Dane zapisywane są słowami, dlatego pobierane są dwa bajty i umieszczane w rejestrach r0 oraz r1. Następnie wywoływana jest funkcja smp_do, która dokonuje właściwego zapisu do pamięci Flash mikrokontrolera.
Funkcja spm_d0 wygląda następująco:
spm_do: in spm_wait,SPMCSR sbrc spm_wait,SELFPRGEN rjmp spm_do spm_do_wait_ee: sbic EECR,EEPE rjmp spm_do_wait_ee out SPMCSR,spm_cmd spm ret
Oczyt danych:
boot_read: rcall RS232_send_char rcall RS232_receive_char cpi acc,'f' brne boot_read_ee rcall RS232_send_char clr zl clr zh boot_read_loop: lpm acc,z+ rcall RS232_send_char cpi zh,high((RWW_STOP_ADDR + 1) << 1) brne boot_read_loop cpi zl,low((RWW_STOP_ADDR + 1) << 1) brne boot_read_loop rjmp boot_loop
Kasowanie zawartości pamięci:
boot_erase_chip: rcall RS232_send_char clr zl clr zh clr acc clr temp ldi temp2,PAGE_SIZE boot_erase_chip_loop: ldi spm_cmd,(1 << PGERS | 1 << SELFPRGEN) rcall spm_do add zl,temp2 adc zh,temp inc acc cpi acc,RWW_PAGES brne boot_erase_chip_loop ldi spm_cmd,(1 << RWWSRE | 1 << SELFPRGEN) rcall spm_do ldi acc,'d' rcall RS232_send_char rjmp boot_loop
Pliki
Cały program oraz aplikacja na PC sterująca bootloaderem dostępne są poniżej: bootloader.asm
jAVRBoot.zip
Podsumowanie
Bootloader działa na mikrokontrolerze ATMega88 z zegarem 12MHz, dla innego zegara i mikrokontrolera należy dokonać odpowiednich zmian. Programując mikrokontroler należy także pamiętać o ustawieniu Fuse Bitów tzn. uaktywnienie bootloadera i wskazanie jego adresu w pamięci (dla proponowanego rozwiązania adres to: 0x0C00).
Mikrokontroler po włączeniu czeka chwilę na komendę uaktywniającą bootloader, jeśli ta się nie pojawi rozpoczyna się wykonywanie właściwego programu.
dodane przez admin August 27, 2008 (10:59AM)
Brak komentarzy
Dodaj komentarz
* = wymagane pole