|
|
  |
IAR -> ATMEGA128 бутлоадер |
|
|
|
Dec 20 2009, 17:28
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901

|
Пишу бутлоадер для Atmega128 в IAR. Не получается стереть страницу! Макрос Код #define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 ) не работает Прога работает только флеш не стирается. Код _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 .... фюзы разрешают полный доступ
|
|
|
|
|
Dec 20 2009, 18:45
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(D!m@ @ Dec 20 2009, 19:28)  Макрос Код #define _PAGE_ERASE(addr) __AddrToZByteToSPMCR_SPM( (void __flash *) (addr), 0x03 ) не работает  По какому адресу расположена функция main()? Какой размер boot-области установлен фузами?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 20 2009, 20:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Каким иаром пользуетесь? Писал бутлоадер для м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); Всё прекрасно работает
|
|
|
|
|
Dec 21 2009, 09:41
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901

|
Цитата(Сергей Борщ @ Dec 20 2009, 22:45)  По какому адресу расположена функция main()? Какой размер boot-области установлен фузами? Разве это имеет значения ? Я пробую стереть страницу с основной программы. Кода в этой странице нет, там записана константа Код _flash const unsigned char mas[256]@0x3000={0,1,2,3,4,5,6,7,8,9};
|
|
|
|
|
Dec 21 2009, 11:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(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.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 21 2009, 12:47
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901

|
сделал бутлоадер в адресе 0хf000-0xffff вектор сброса на бутлоадер. пробую стереть страницу- результата нет  страница по адресу 0х3000 что я не так делаю?
Сообщение отредактировал D!m@ - Dec 21 2009, 12:51
|
|
|
|
|
Dec 21 2009, 13:52
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901

|
код асм вроде правильн. IAR 5.20 у меня. если на асме тосам. написать врятли что поменяется. да чип ATmega128L-8au
|
|
|
|
|
Dec 21 2009, 14:40
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 10-04-07
Пользователь №: 26 901

|
Цитата(МП41 @ Dec 21 2009, 17:28)  а не рабоатет. - мне не подходит нада найти єтот бубен...
|
|
|
|
|
Dec 22 2009, 05:29
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Цитата(D!m@ @ Dec 21 2009, 16:52)  код асм вроде правильн. Если смотреть на картинку с ассемблерным кодом, то видно что адреса указаны в байтах (инкремент адреса между инструкциями >1). Ошибка типичная: в datasheet'е адрес начала секции загрузчика указан в словах, а не байтах, чего вы не учли. Код должен располагаться с адреса (в случае BOOTSZ = 00, как у вас) 0xF000 * 2 = 0x1E000 в байтах. Код всё ещё вне секци загрузчика, потому и не может что-либо сделать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|