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

 
 
 
Reply to this topicStart new topic
> Снова Bootloаder, "Подводные камни" AVR109
Stas633
сообщение Apr 21 2007, 20:49
Сообщение #1


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Не нашел форуме описания подобной ситуации, поэтому "выкладываю", может кому пригодится..

Повторил bootloader по AVR109.
Попробовал программировать Мегу при помощи AVRProg.
Cтолкнулся с проблемой верификации памяти после программирования.

При "детальном рассмотрении" обнаружил, что в ASM-программе в AVR109 отсутствует ре-инициализация памяти (RWW) после операций записи страницы. И это не смотря на то, что
в тексте AVR109 эта "проблема" упоминается:
Код
...Note that if the RWW section accessed without re-enabling it after an erase or write
operation, all addresses in the RRW section read 0xFFFF....


После "подправки" программы проблемы "не стало":
Код
; void write_page (unsigned int adr, unsigned char function);
_write_page::

        MOV R31,R17        
        MOV R30,R16        ;move adress to z pointer (R31=ZH R30=ZL)
        OUT SPMCR,R18      ;argument 2 decides function
        SPM                ;perform pagewrite

; "поправка" программы
; ------------------------------------
    Wait_spm1:
        in R16, SPMCR
        sbrc R16,0
        rjmp Wait_spm1

        LDI R16,  $11     ; enable RWW
        OUT SPMCR, R16     ;
        SPM
; ------------------------------------

        RET


" dw $FFFF" и "nop" удалил как ненужные (а для чего используется dw $FFFF.. до сих пор не пойму smile.gif )

Вопрос... Почему же Atmel не "ерратил" ошибку? Или я чего-то не увидел, и напрасно предъявляю прететзии?
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 22 2007, 08:18
Сообщение #2


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Вы какое-то старьё раскопали или где? Вот фрагмент из файла, датированного (на моём компе) 11.07.2002

write_page:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R31,R17
MOV R30,R16 ;move adress to z pointer (R31=ZH R30=ZL)
LOAD_SPM_CONTROL_REGISTER_MACRO ; argument 2 decides function (r18)
_SPM ;Store program memory
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared

В текущей версии сорцов вообще используются встроенные функции IAR.
Цитата
" dw $FFFF" и "nop" удалил как ненужные (а для чего используется dw $FFFF.. до сих пор не пойму )

В старых мегах было нужно - FLASH там такая была (рассказывать обломно - в дейташитах есть). И не мешает оно совсем


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
CD_Eater
сообщение Apr 23 2007, 00:08
Сообщение #3


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

Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595



Цитата
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
Объясните плз, что это означает (или в каком ДШ про это рассказано)
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 23 2007, 00:26
Сообщение #4


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(sensor_ua @ Apr 22 2007, 09:18) *
...
write_page:
RCALL WAIT_SPMEN ;Wait for SPMEN flag cleared
MOV R31,R17
MOV R30,R16 ;move adress to z pointer (R31=ZH R30=ZL)
LOAD_SPM_CONTROL_REGISTER_MACRO ; argument 2 decides function (r18)
_SPM ;Store program memory
DW 0xFFFF ;For future part compatibility, instruction alignment
NOP
RJMP WAIT_SPMEN ;Wait for SPMEN flag cleared
...


В приведенном Вами примере отсутствует "переинициализация" RWW!
В текущей версии AVR109 (2004), дествительно данная проблема устранена:

<main.c>
Код
...
            // Read program memory.
            else if(val=='R')
            {
                // Send high byte, then low byte of flash word.
                _WAIT_FOR_SPM();
                _ENABLE_RWW_SECTION();
...
                address++; // Auto-advance to next Flash word.
            }
...


<flash.h>
Код
...
#define _ENABLE_RWW_SECTION() __DataToR0ByteToSPMCR_SPM( 0x00, 0x11 )
...


<intrinsics.h>
Код
....
/* SPM */

/*
  __DataToR0ByteToSPMCR_SPM, pseudo code.
  MOV   R0,data
  OUT   SPMCR,byte
  SPM
*/
__intrinsic void __DataToR0ByteToSPMCR_SPM(unsigned char data,
                                           unsigned char byte);

...


А какого размера (в байтах) получается загрузчик в IAR при условии совместимости с AVRProg?
(я не "пользуюсь" IAR'ом).
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 23 2007, 07:31
Сообщение #5


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
DW 0xFFFF ;For future part compatibility, instruction alignmentNOPQuoteEndQuoteEEndОбъясните плз, что это означает (или в каком ДШ про это рассказано)

Смотри DS ATmega163 (в ревизии E описательная часть на стр. 137, пример - на стр.141-142 - нужное на 142)
Instruction Word Read after
Page Erase, Page Write, and
Lock Bit Write
To ensure proper instruction pipelining after programming action (Page Erase, Page
Write, or Lock bit write), the SPM instruction must be followed with the sequence (.dw
$FFFF - NOP) as shown below:
spm
.dw $FFFF
nop
If not, the instruction following SPM might fail. It is not necessary to add this sequence
when the SPM instruction only loads the temporary buffer.

Цитата
В приведенном Вами примере отсутствует "переинициализация" RWW!

Раз считаете, что отсутствует - пусть отсутствуетwink.gif Прошу только заметить, что в приведенном кусочке запись не начинается до окончания предыдущей записи и выход из процедуры записи только после её окончания.

Цитата
А какого размера (в байтах) получается загрузчик в IAR при условии совместимости с AVRProg?

Самый короткий, который я встречал, занимал 384 байта. У меня занимал около 600, но пара функций была опущена. См. http://www.onembedding.com/files/jtag_vit/


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 23 2007, 08:16
Сообщение #6


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(sensor_ua @ Apr 23 2007, 08:31) *
Раз считаете, что отсутствует - пусть отсутствуетwink.gif Прошу только заметить, что в приведенном кусочке запись не начинается до окончания предыдущей записи и выход из процедуры записи только после её окончания.

Для переинициализации RWW не достаточно дождаться окончания процедуры записи (сброса бита SPMEN).
Необходимо установить биты RWWSRE и SPMEN и выполнить SPM. То есть:
- "загрузить" в SPMCR 0x11
- выпольнить команду SPM.
Такой процедуры в примере нет. Не так ли?

Для справки:
Код
• Bit 4 – RWWSRE: Read-While-Write Section Read Enable
When programming (page erase or page write) to the RWW section, the RWW section
is blocked for reading (the RWWSB will be set by hardware). To re-enable the RWW
section, the user software must wait until the programming is completed (SPMEN will be
cleared). Then, if the RWWSRE bit is written to one at the same time as SPMEN, the
next SPM instruction within four clock cycles re-enables the RWW section. The RWW
section cannot be re-enabled while the Flash is busy with a page erase or a page write
(SPMEN is set). If the RWWSRE bit is written while the Flash is being loaded, the Flash
load operation will abort and the data loaded will be lost (The page buffer will be cleared
when the Read-While-Write section is re-enabled).


Цитата(sensor_ua @ Apr 23 2007, 08:31) *
Самый короткий, который я встречал, занимал 384 байта. У меня занимал около 600, но пара функций была опущена.

Спасибо.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Apr 23 2007, 13:02
Сообщение #7


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

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Бит RWW есть не у всех мег. Я писал ещё для 163-й - у неё нетwink.gif
Оно в примере нафиг не нужно, потому как никто выше границы RWW-секции писать не даёт - потому вопросов не возникало. Если очень нужно заэкономить место под аппликейшн, ну тогда флаг в руки.


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Stas633
сообщение Apr 23 2007, 14:27
Сообщение #8


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

Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901



Цитата(sensor_ua @ Apr 23 2007, 14:02) *
Бит RWW есть не у всех мег. Я писал ещё для 163-й - у неё нет
Оно в примере нафиг не нужно, потому как никто выше границы RWW-секции писать не даёт - потому вопросов не возникало. Если очень нужно заэкономить место под аппликейшн, ну тогда флаг в руки.

Замечу только, что я говорил про особенности ЧТЕНИЯ_ПОСЛЕ_ЗАПИСИ в области RWW.
Да и об ограничении записи "выше границы RWW" (в NRWW) я не знаю... Может это ограничение касается только m163?
Go to the top of the page
 
+Quote Post

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

 


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


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