參考資訊:
https://www.microchip.com/en-us/product/attiny13#Documentation
https://www.avrfreaks.net/forum/self-programming-tiny13-solved
https://nerdathome.blogspot.com/2008/04/avr-as-usage-tutorial.html
Program Flash的操作都是以Page為單位,一個Page是16 Words(32 Bytes),Z(r32:r30)暫存器是位址,r1:r0則是Word的資料,唯一要注意的地方是,填寫的位址是0x00開始

main.s
.equ SPMCSR, 0x37
.org 0x0000
rjmp main
.org 0x0020
main:
rcall program_flash
loop:
rjmp loop
program_flash:
; erase
ldi r30, 0x00
ldi r31, 0x01
ldi r16, 0x03
out SPMCSR, r16
spm
; fill (0x100: 0x50, 0xa0, 0x5a, 0xa1...)
ldi r30, 0x00
ldi r31, 0x00
ldi r18, 0x50
ldi r19, 0xa0
ldi r17, 16
0:
mov r0, r18
mov r1, r19
ldi r16, 0x01
out SPMCSR, r16
spm
inc r18
inc r19
inc r30
inc r30
dec r17
tst r17
brne 0b
; write
ldi r30, 0x00
ldi r31, 0x01
ldi r16, 0x05
out SPMCSR, r16
spm
ret
編譯和燒錄
$ avr-as -mmcu=attiny13 -o main.o main.s $ avr-ld -o main.elf main.o $ avr-objcopy --output-target=ihex main.elf main.ihex $ sudo avrdude -c usbasp -p t13 -B 1024 -U flash:w:main.ihex:i
接著讀取Flash
$ sudo avrdude -c usbasp -p t13 -B 1024 -U flash:r:flash.bin:r
完成