WÅ‚asny bootloader do AVR - krok po kroku

jAVRBoot 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.

Komentarze (0) dodane przez admin August 27, 2008 (10:59AM)

MAGICZNY BANER darmowy system wymiany banerów