Пытаюсь написать загрузчик (bootloader) для ATMEGA128 и не получается. Программа должна постранично модифицировать память программ. Посмотрел много примеров, вроде делаю все как у всех, но не работает. Не работает самое элементарное - стирание страницы, запись пока не пробовал, т.к. перед записью нужно стереть страницу. Вот кусок программы, должна стираться нулевая (для примера) страница:
;Задаем нулевую страницу для стирания clr ZL clr ZH
;Проверяем, что не идет запись, ждем когда кончится, если идет M1: lds r16,SPMCSR sbrc r16,SPMEN rjmp M1
;>Проверяем, что не идет запись в EE, ждем когда кончится, если идет M2: sbic EECR,EEWE rjmp M2
;>Запускаем стирание ldi r16, (1<<PGERS) | (1<<SPMEN) sts SPMCSR,r16 spm
;Ждем, когда окончится стирание M3: lds r16,SPMCSR sbrc r16,SPMEN rjmp M3
Программа виснет на команде spm, дальше не идет. Если закомментировать команду spm, то все проскакивает (но стирания, естественно тоже не происходит).
Данная программа стартует с адреса 0x1F000 и расположена в области 0x1F000...0x1FFFF.
Может не так устанавливаю FUSES??? Установлено вот так: BODLEVEL = 1 BODEN = 0 SUT = 2 CKSEL = F BLB1 = 3 <-полный доступ к памяти зпгрузчика BLB0 = 3 <-полный доступ к памяти программ OCDEN = 1 JTAGEN = 1 CKOPT = 1 EESAVE = 0 BOOTSZ = 0 <- 4K область загрузчика (адреса 1F000-1FFFF) BOOTRST = 0 <- Стартовать с загрузчика (c адреса 1F000) M103C = 1 WDTON = 1
Где я ошибся, не понимаю?
|