реклама на сайте
подробности

 
 
> Самопрограммирование mega640.
cpl
сообщение Jul 21 2008, 17:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Необходимо обновлять загрузчик, есть ли возможность прошить загрузчик(NRWW область) из памяти программ (NWW область) ?
Код взял из примеров Atmel, страница памяти программ остается не тронутой, не стирается ....
Если код располагается в NRWW областе то страница стирается, вне ее нечего не просиходит...
smile3046.gif
код:

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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Syberian
сообщение Aug 26 2008, 04:27
Сообщение #2


Участник
*

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



Не знаю, как насчет 640-й, но некоторые Меги не поддерживают побайтную запись флеш. Т.е. с каждым байтом будет переписываться вся страница из почти пустого буфера, т.е. 0хFF. В итоге мы увидим полностью затертую память.

Делал на 644 самопрограммирование по COM-порту из стандартного набора на асме постранично, и все работало!
Размещается прога в секторе smallboot.
Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все smile.gif


Код
.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
Go to the top of the page
 
+Quote Post
cpl
сообщение Aug 26 2008, 08:47
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Цитата(Syberian @ Aug 26 2008, 08:27) *
Чтобы перешить сам загрузчик, надо исполнять подобную программу из общей памяти. Вот и все smile.gif

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Вы сами то пробовали таким образом перешивать загрузчик из основной области ?
В теории все сходится да на практике расходится...

Повторюсь еще раз в симуляторе ВСЕ перешивается....
на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти.
smile3046.gif
вот теперь все smile.gif
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 26 2008, 19:26
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(cpl @ Aug 26 2008, 12:47) *
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Вы сами то пробовали таким образом перешивать загрузчик из основной области ?
В теории все сходится да на практике расходится...

Повторюсь еще раз в симуляторе ВСЕ перешивается....
на стендах мега 128 и 640 порепрошить загрузчик получилось только из загрузочной области, при перепрошивке из основной области проц неодекватен тк процессор не останавливается в момент прошивки а продолжает исполнять код в данном случаии FF по всей памяти.
smile3046.gif
вот теперь все smile.gif


Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 26 2008, 20:01
Сообщение #5


Местный
***

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



Цитата(Боинг749 @ Aug 26 2008, 22:26) *
Команда SPM может выполняться только из секции загрузчика... Это центральная идея вокруг которой крутятся все методики перепрошивки FLASH.

Ну, чего нового Вы здесь добавили? автор и сам в курсе а Александр Куличок и так довольно подробно обяснил.
ОФФ: Действительно, складывается впечатление, что Вы топик не читаете а проглядываете на скорую руку.
ПС: Ничего личного.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 26 2008, 20:19
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016