|
Самопрограммирование mega640. |
|
|
|
Jul 21 2008, 17:32
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Необходимо обновлять загрузчик, есть ли возможность прошить загрузчик(NRWW область) из памяти программ (NWW область) ? Код взял из примеров Atmel, страница памяти программ остается не тронутой, не стирается .... Если код располагается в NRWW областе то страница стирается, вне ее нечего не просиходит... код: ldi ZL,0x00 ldi ZH,0x70 ldi temp,(1 << PGERS | 1<< SPMEN) ; Page Erase call Do_spmF ldi temp,(1 << RWWSRE | 1<< SPMEN) call Do_spmF Do_spmF: push temp1 Do_spmF1: in temp1,SPMCSR sbrc temp1,SPMEN rjmp Do_spmF1 in temp1,SREG cli Wait_eeF: sbic EECR,EEPE rjmp Wait_eeF out SPMCSR,temp spm out SREG,temp1 pop temp1 ret
|
|
|
|
|
 |
Ответов
|
Aug 26 2008, 04:27
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999

|
Не знаю, как насчет 640-й, но некоторые Меги не поддерживают побайтную запись флеш. Т.е. с каждым байтом будет переписываться вся страница из почти пустого буфера, т.е. 0хFF. В итоге мы увидим полностью затертую память. Делал на 644 самопрограммирование по COM-порту из стандартного набора на асме постранично, и все работало! Размещается прога в секторе smallboot. Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все  Код .equ PAGESIZEB = 256;PAGESIZEB is page size in BYTES, not words .org SMALLBOOTSTART
.equ spm_pagebuf=$110; 256bytex .equ spm_numpages=$10A .equ spm_crc1=$10B .equ spm_crc2=$10C .equ spm_crc3=$10D .equ spm_crc4=$10E
com_spi: cli rcall com__read cpi tmp,'F' breq spi_flsh jmp 0; suxxxxxxxxxxxxxx!!!!!!!!
spi_flsh: rcall com__read sts spm_numpages,tmp clr zh clr zl
lds cnt1,spm_numpages
spm_rdda1: push cnt1 ldiy spm_pagebuf ldi tmp,0xCB rcall com__write clr cnt spm_rdda: rcall com__read st y+,tmp djnz cnt,spm_rdda ldiy spm_pagebuf rcall Write_page inc zh pop cnt1 djnz cnt1,spm_rdda1
ldi tmp,0xCB rcall com__write jmp 0
Write_page: ; Page Erase ldi tmp, (1<<PGERS) | (1<<SPMEN) rcall Do_spm ; re-enable the RWW section ldi tmp, (1<<RWWSRE) | (1<<SPMEN) rcall Do_spm ; transfer data from RAM to Flash page buffer ldi cnt, 0 ;init loop variable 256
Wrloop: ld r0, Y+ ld r1, Y+ ldi tmp, (1<<SPMEN) rcall Do_spm adiw ZH:ZL, 2 subi cnt, 2;use subi for PAGESIZEB<=256 brne Wrloop
dec zh ; execute Page Write ldi tmp, (1<<PGWRT) | (1<<SPMEN) call Do_spm ; re-enable the RWW section ldi tmp, (1<<RWWSRE) | (1<<SPMEN) call Do_spm ; read back and check, optional
Return: in tmp, SPMCSR sbrs tmp, RWWSB; If RWWSB is set, the RWW section is not ready yet ret rjmp Return
Do_spm: ; check for previous HW ops complete Wait_spm: in tmp1, SPMCSR sbrc tmp1, SPMEN rjmp Wait_spm Wait_ee: sbic EECR, EEPE rjmp Wait_ee ; SPM timed sequence out SPMCSR, tmp spm ret
com__write: lds tmp1,ucsr0a sbrs tmp1,udre0 rjmp com__write sts udr0,tmp ret com__read: lds tmp1,ucsr0a sbrs tmp1,rxc0 rjmp com__read lds tmp,udr0 ret
|
|
|
|
|
Aug 26 2008, 08:47
|
Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340

|
Цитата(Syberian @ Aug 26 2008, 08:27)  Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Вы сами то пробовали таким образом перешивать загрузчик из основной области ? В теории все сходится да на практике расходится... Повторюсь еще раз в симуляторе ВСЕ перешивается.... на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти. вот теперь все
|
|
|
|
|
Aug 26 2008, 19:26
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(cpl @ Aug 26 2008, 12:47)  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Вы сами то пробовали таким образом перешивать загрузчик из основной области ? В теории все сходится да на практике расходится... Повторюсь еще раз в симуляторе ВСЕ перешивается.... на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти. вот теперь все  Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH.
|
|
|
|
|
Aug 26 2008, 20:01
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Боинг749 @ Aug 26 2008, 22:26)  Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH. Ну, чего нового Вы здесь добавили? автор и сам в курсе а Александр Куличок и так довольно подробно обяснил. ОФФ: Действительно, складывается впечатление, что Вы топик не читаете а проглядываете на скорую руку. ПС: Ничего личного.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 26 2008, 20:19
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(sKWO @ Aug 27 2008, 00:01)  Ну, чего нового Вы здесь добавили? автор и сам в курсе а Александр Куличок и так довольно подробно обяснил. ОФФ: Действительно, складывается впечатление, что Вы топик не читаете а проглядываете на скорую руку. ПС: Ничего личного. Может я и правда ничего нового не добавил... Каюсь.. Я просто хотел сакцентрировать внимание топикстартера на главном моменте... Потому что судя по его последнему топику он так и не понял, что SPM может выполняться только из загрузчика, расположенного в секции NRWW. И что при самопрограммировании секции NRWW проц останавливается до окончания SPM. А при самопрограммировании RWW проц может читать и выполнять код только из NRWW. И что после окончания операции программировании RWW нужно разрешить доступ к RWW иначе все ячейки RWW будут читаться как $FF
Сообщение отредактировал Боинг749 - Aug 26 2008, 20:21
|
|
|
|
Сообщений в этой теме
cpl Самопрограммирование mega640. Jul 21 2008, 17:32 arttab обновлялка загрузчика должна быть в NRWW.
Хотя мо... Jul 22 2008, 13:26 cpl Цитата(arttab @ Jul 22 2008, 17:26) обнов... Jul 22 2008, 13:31  oran-be Совершенно непонятно - в чем проблема. Если зашар... Jul 22 2008, 16:15   cpl Цитата(oran-be @ Jul 22 2008, 20:15)... Jul 23 2008, 08:21 IJAR Сталкивался с подобной проблемой - решил ее так:
З... Jul 23 2008, 07:43 _Pasha Цитата(IJAR @ Jul 23 2008, 10:43) функция... Jul 23 2008, 07:51  IJAR Цитата(_Pasha @ Jul 23 2008, 11:51) Иными... Jul 23 2008, 08:05 Александр Куличок ЦитатаИными словами, во время записи происходит ка... Jul 23 2008, 12:36 Боинг749 Цитата(Александр Куличок @ Jul 23 2008, 15... Aug 25 2008, 12:55
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|