Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR -> ATMEGA128 бутлоадер
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
D!m@
Пишу бутлоадер для Atmega128 в IAR.
Не получается стереть страницу!
Макрос
Код
#define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 )
не работает smile3046.gif
Прога работает только флеш не стирается.

Код
_flash const unsigned char  mas[256]@0x3000={0,1,2,3,4,5,6,7,8,9};
void main()
{
    
#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
  _WAIT_FOR_SPM();        
  _PAGE_ERASE( 0х3000 );
#pragma diag_default=Pe1053 // Back to default.
_WAIT_FOR_SPM();    

printf("%02X",SPMCSR);
for(int i=0x3000;i<0x3025;i++)
  printf("%02X",_LOAD_PROGRAM_MEMORY(i));



Результат:
Код
00 00 01 02 03 04 ....

фюзы разрешают полный доступ
Сергей Борщ
Цитата(D!m@ @ Dec 20 2009, 19:28) *
Макрос
Код
#define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 )
не работает smile3046.gif
По какому адресу расположена функция main()? Какой размер boot-области установлен фузами?
mempfis_
Каким иаром пользуетесь?
Писал бутлоадер для м128 в 5.10а.
Подключите intrinsics.h там определены функции для перепрошивки флеш.

Код
#define _SPM_ERASE(Addr) \
  __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), 0x03)

#define _SPM_FILLTEMP(Addr,Word)  \
  __AddrToZWordToR1R0ByteToSPMCR_SPM((void __flash*)(Addr), (Word), 0x01)

#define _SPM_PAGEWRITE(Addr) \
  __AddrToZByteToSPMCR_SPM((void __flash*)(Addr), (0x05))


_SPM_ERASE(Addr) использует в качестве адреса адрес страницы сдвинутый на 8 бит влево
Код
_SPM_ERASE(page<<8);


Всё прекрасно работает smile.gif
D!m@
Цитата(Сергей Борщ @ Dec 20 2009, 22:45) *
По какому адресу расположена функция main()? Какой размер boot-области установлен фузами?

Разве это имеет значения ?
Я пробую стереть страницу с основной программы. Кода в этой странице нет, там записана константа
Код
_flash const unsigned char  mas[256]@0x3000={0,1,2,3,4,5,6,7,8,9};
MrYuran
Цитата(D!m@ @ Dec 21 2009, 12:41) *
Разве это имеет значения ?

У AVR есть особенность, что основную флешь можно тереть/писать только из флеши бутлодера и наоборот.
То есть стереть основную флешь из неё же не получится.
Сергей Борщ
Цитата(MrYuran @ Dec 21 2009, 11:49) *
основную флешь можно тереть/писать только из флеши бутлодера и наоборот.
"Наоборот" тоже нельзя:
Цитата
Boot Loader Section – BLS
While the application section is used for storing the application code, the The Boot Loader software must be located in the BLS since the SPM instruction can initiate a programming when executing from the BLS only. The SPM instruction can access the entire Flash, including the BLS itself. The protection level for the Boot Loader section can be selected by the Boot Loader Lock bits (Boot Lock bits 1), see Table 109 on page 278.
D!m@
Нажмите для просмотра прикрепленного файла
сделал бутлоадер в адресе 0хf000-0xffff вектор сброса на бутлоадер.
пробую стереть страницу- результата нет smile3046.gif страница по адресу 0х3000

что я не так делаю?
МП41
Я недавно возился с ATmega16 в IAR (5.xx не помню) , пробовал стирать страницы тоже, использовал intrinsics.h. Подпрограмма, которая стирает, расположена в области загрузчика, даже hex проверял. Много чего перепробовал, но страницу стереть так не удалось, хотя в ассемблере с подобными вещами проблем не было.
D!m@
Нажмите для просмотра прикрепленного файла
код асм вроде правильн. IAR 5.20 у меня.
если на асме тосам. написать врятли что поменяется.

да чип ATmega128L-8au
МП41
Так и у меня по листингу всё в порядке, а не рабоатет. Не знаю, какой бубен брать для плясок.
D!m@
Цитата(МП41 @ Dec 21 2009, 17:28) *
а не рабоатет.
- мне не подходит

нада найти єтот бубен...
mempfis_
Цитата(МП41 @ Dec 21 2009, 17:28) *
Так и у меня по листингу всё в порядке, а не рабоатет. Не знаю, какой бубен брать для плясок.


Попробуйте вместо плясок с бубном применить unlock nrww команду для начала smile.gif
И учитывать что для м128 имеет значение какую из 64к страниц памяти пишите (т.е. перед надо устанавливать соотв. значение RAMPZ).
D!m@
О бубне говорить легко. Выразите свою мысль в коде.
SysRq
Цитата(D!m@ @ Dec 21 2009, 16:52) *
код асм вроде правильн.
Если смотреть на картинку с ассемблерным кодом, то видно что адреса указаны в байтах (инкремент адреса между инструкциями >1).
Ошибка типичная: в datasheet'е адрес начала секции загрузчика указан в словах, а не байтах, чего вы не учли. Код должен располагаться с адреса (в случае BOOTSZ = 00, как у вас) 0xF000 * 2 = 0x1E000 в байтах.
Код всё ещё вне секци загрузчика, потому и не может что-либо сделать.
МП41
Цитата(SysRq @ Dec 22 2009, 07:29) *
...
Ошибка типичная: в datasheet'е адрес начала секции загрузчика указан в словах, а не байтах, чего вы не учли. Код должен располагаться с адреса (в случае BOOTSZ = 00, как у вас) 0xF000 * 2 = 0x1E000 в байтах.
Код всё ещё вне секци загрузчика, потому и не может что-либо сделать.

Спасибо, у меня всё заработало! Теперь об этом буду помнить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.