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

 
 
 
Reply to this topicStart new topic
> Самопрограммирование 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
arttab
сообщение Jul 22 2008, 13:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
cpl
сообщение Jul 22 2008, 13:31
Сообщение #3


Местный
***

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



Цитата(arttab @ Jul 22 2008, 17:26) *
обновлялка загрузчика должна быть в NRWW.
Хотя может для новых камней чего поменялось

Все также осталось, специально смотрел....
у меня так и реализовано,
хотел обновлять загрузчик целиком, но значит увы нельзя ....
Go to the top of the page
 
+Quote Post
oran-be
сообщение Jul 22 2008, 16:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Совершенно непонятно - в чем проблема. Если зашарить битами защиты область NRWW то все будет читаться и писаться, только при организации потока записи необходимо учитывать, что при записи области NRWW проц будет подвисать на момент записи.
Go to the top of the page
 
+Quote Post
IJAR
сообщение Jul 23 2008, 07:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Сталкивался с подобной проблемой - решил ее так:
Загрузчик размещен в области BootLoader, при этом функция непосредственной
записи во Flash занимает строго 1 страницу в 256 байт (хотя сама она короче)
Перед заменой загрузчика, во Flash для Application, пишется промежуточный загрузчик,
но он использует функцию записи страницы Flash из основного загрузчика.
Далее - управление передается на промежуточный загрузчик, который производит
обновление основного, при этом страница с функцией записи Flash пропускается.
Все отлично работает.


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jul 23 2008, 07:51
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(IJAR @ Jul 23 2008, 10:43) *
функция непосредственной
записи во Flash занимает строго 1 страницу в 256 байт


Иными словами, во время записи происходит какая-то чехарда с фьюзами?
Go to the top of the page
 
+Quote Post
IJAR
сообщение Jul 23 2008, 08:05
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Цитата(_Pasha @ Jul 23 2008, 11:51) *
Иными словами, во время записи происходит какая-то чехарда с фьюзами?

Затрудняюсь ответить что реально происходит, но при отладке в симуляторе AVR STUDIO -
все пишется, а реально в контроллере запись не происходит а сам контроллер
куда то "улетает". Приведенной выше способ надежно работает.


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post
cpl
сообщение Jul 23 2008, 08:21
Сообщение #8


Местный
***

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



Цитата(oran-be @ Jul 22 2008, 20:15) *
Совершенно непонятно - в чем проблема. Если зашарить битами защиты область NRWW то все будет читаться и писаться, только при организации потока записи необходимо учитывать, что при записи области NRWW проц будет подвисать на момент записи.


все расшарино, на 128L номер не прошел....
только из области загрузчика работает.

Цитата(IJAR @ Jul 23 2008, 11:43) *
Сталкивался с подобной проблемой - решил ее так:
Загрузчик размещен в области BootLoader, при этом функция непосредственной
записи во Flash занимает строго 1 страницу в 256 байт (хотя сама она короче)
Перед заменой загрузчика, во Flash для Application, пишется промежуточный загрузчик,
но он использует функцию записи страницы Flash из основного загрузчика.
Далее - управление передается на промежуточный загрузчик, который производит
обновление основного, при этом страница с функцией записи Flash пропускается.
Все отлично работает.


Нечто подобное и сделано, только все сразу прошито, в последнем секторе содержиться подпрограмма перепрошивки всего.
Вообще моглибы сделать и пропроще единую область для перепрошивки, с логическим разделением на боот и все остальное(надо посмотреть как там у арм7 с этим делом), лучше подождать во время перепрощивки с подвисанием, чем так изголяться с загрузчиком...

Цитата(IJAR @ Jul 23 2008, 12:05) *
Затрудняюсь ответить что реально происходит, но при отладке в симуляторе AVR STUDIO -
все пишется, а реально в контроллере запись не происходит а сам контроллер
куда то "улетает". Приведенной выше способ надежно работает.


Одним словом симулятор не больше и не меньше.....
в нем поначалу пробовал все ок в реальном железе область закрывается на чтение все 0xff и проц неподвисая выполняет эти 0xff .... да еще при последующем считывании flash оказывается что страница так и не стерта ! все как было так и осталось 07.gif
На мой взгляд перемудрил атмел.... maniac.gif
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jul 23 2008, 12:36
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
Иными словами, во время записи происходит какая-то чехарда с фьюзами?

Никакой чехарды нет.
Из Application-секции команда SPM не работает ни при каких фьюзах(вернее, локах smile.gif). SPM может выполнятся только из секции бутлоадера. А может и не выполнятся:
1. если делается попытка записи в секцию Application при выставленом [SPM prohibit in Application section] (иными словами, запрет обновления секции приложения)
2. если делается попытка записи в секцию bootloader'а при выставленом [SPM prohibit in Bootloader section] (запрет обновления секции загрузчика)

То есть, сам загрузчик (реализация его алгоритма) может размещаться где угодно (Application или Bootloader, RWW или NRWW), но непосредственно функция записи или, если еще точнее, команда spm, должна размещаться в секции Bootloader'а. Там же должен размещаться код ожидания окончания записи, если мы вызвали ее из секции приложения и пишем в секцию приложения (сорри за тавтологию)

Цитата
обновлялка загрузчика должна быть в NRWW

Позвольте уточнить - должна быть в секции bootloader'а.
Граница между NRWW и RWW - фиксированная, а Application/Boolloader section - может изменятся фьюзами. Cекция Bootloder'a всегда находится в области NRWW. При определенных фьюзах (BOOTSZ != 0) в область NRWW попадает конец секции Application (в которой spm не работает)

Как писал IJAR, Вам нужно в секции бутлоадера зарезервировать одну страничку, которая никогда не будет обновлятся (в т.ч. и при обновлении кода загрузчика) и в ней разместить функцию непосредственной записи + ожидания окончания записи странички (при необходимости). Еще в ней можно сделать дополнительную проверку ZH:ZL, чтобы не стереть саму себя.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 25 2008, 12:55
Сообщение #10


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

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



Цитата(Александр Куличок @ Jul 23 2008, 15:36) *
Вам нужно в секции бутлоадера зарезервировать одну страничку, которая никогда не будет обновлятся (в т.ч. и при обновлении кода загрузчика) и в ней разместить функцию непосредственной записи + ожидания окончания записи странички (при необходимости).
Я делаю ни одну, а несколько, в которой размещаю обновлялку самого загрузчика и набор самых необходимых подпрограмм
Go to the top of the page
 
+Quote Post
Syberian
сообщение Aug 26 2008, 04:27
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #13


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

Группа: Новичок
Сообщений: 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
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #15


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

Группа: Новичок
Сообщений: 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

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

 


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


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