Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2018, 21:27

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 15:50 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Добрый день, сообщество!

Пишу bootloader для контроллера ATMega128. С размещением кода загрузчика с адреса 0xF000(сконфигурировал фьюзами BOOTSZ0 и BOOTSZ1, запрограммировал фьюз BOOTRST) проблем не возникает, программа нормально стартует с данного адреса. Использую Atmel Studio 7. Проблема возникает при перезаписи flash-памяти программ. В симуляторе Atmel Studio проект работает, флешка перезаписывается, на реальном чипе эффекта нет. В даташите вычитал, что перезапись страницы выполняется в среднем 4 миллисекунды, т.е. на запись 480 страниц уйдёт около 2 секунд. У меня же цикл записи пролетает чуть меньше, чем за одну. Пробовал и средствами программатора писать программу с адреса 0xF000 и указывать линкеру про смещение (-Wl,--section-start=.text=0x1E000).
Код:
#include <avr/pgmspace.h>
#include <avr/boot.h>
#include <stdio.h>
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>

uint8_t pgBuffer[SPM_PAGESIZE];

void boot_program_page(uint32_t page, uint8_t *buf)
{
   uint16_t i;
   uint8_t sreg;

   // Disable interrupts.
   sreg = SREG;
   cli();
   
   eeprom_busy_wait ();

   boot_page_erase (page);
   boot_spm_busy_wait ();      // Wait until the memory is erased.

   for (i=0; i<SPM_PAGESIZE; i+=2)
   {
      // Set up little-endian word.

      uint16_t w = *buf++;
      w += (*buf++) << 8;
      
      boot_page_fill (page + i, w);
   }

   boot_page_write (page);     // Store buffer in flash page.
   boot_spm_busy_wait();       // Wait until the memory is written.

   // Reenable RWW-section again. We need this if we want to jump back
   // to the application after bootloading.

   boot_rww_enable ();

   // Re-enable interrupts (if they were ever enabled).

   SREG = sreg;
}

int main(void)
{
   USART0_Init(47);
   USART1_Init(47);
   uint8_t str[] = {'B','O','O','T'};
   for (uint8_t i = 0; i < sizeof(str)/sizeof(uint8_t); i++) USART0_Transmit(str[i]);
   for (uint32_t i = 0; i < sizeof(pgBuffer)/sizeof(uint8_t); i++)
   {
      if (i % 2 == 1) pgBuffer[i] = 0xAA;
      else pgBuffer[i] = 0x55;
   }
   
   for(uint32_t i = 0; i < 480; i++)
   {
      boot_program_page(i * 0x100, pgBuffer);
      USART0_Transmit(pgm_read_byte(i * 0x100));
   }
}


тело функции boot_program_page(uint32_t page, uint8_t *buf) взято из стандартной библиотеки boot.h.

Что я делаю неверно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 17:39 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
mrLink писал(а):
С размещением кода загрузчика с адреса 0xF000
...
и указывать линкеру про смещение (-Wl,--section-start=.text=0x1E000).
...
Что я делаю неверно?

Циферки как-то не сходятся...

У ATmega128 программный счётчик 16-тибитный -- выше адреса 0xFFFF инструкции располагаться не могут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 17:54 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Циферки сходятся, так как адрес линкеру указывать надо в байтах, а не в словах. F000 - адрес в словах, 1E000 - в байтах


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 19:27 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
Прошу прощения -- ошибся.
А корректность записи памяти проверяете только через последовательный интерфейс? Может память записывается корректно, но по какой-то причине
Код:
USART0_Transmit(pgm_read_byte(i * 0x100));

выдаёт не правильный результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 19:40 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
К сожалению программирование только через isp, поэтому отладка на чипе недоступна( Также считывал память программатором, во всех ячейках FFFF, при этом в секции бутлоадера программа записана корректно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 21:20 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
mrLink писал(а):
поэтому отладка на чипе недоступна(

Ну почему же не доступна. Вон в USART0-то пишете. Вот и добавьте столько сообщений сколько нужно, что бы локализовать ошибку.
Если мониторить последовательный порт, что там наблюдается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 26 фев 2018, 22:27 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
А наблюдается вот что
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 00:58 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
• Boot Loader capabilities is not supported. А вот почему - ответ найдёте в DS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 09:38 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Так bootloader недоступен только в режиме совместимости с ATMega103(если запрограммировать фьюз M103C).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 11:09 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
mrLink писал(а):
Так bootloader недоступен только в режиме совместимости с ATMega103(если запрограммировать фьюз M103C).

По умолчанию, он запрограммирован ещё на заводе


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 18:10 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Попробовал изменить значение фьюза M103C. В этом случае программа с адреса 0xF000 вообще не стартует, не то что не перезаписывает. Отсюда вывод, что фьюз установлен не был.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 18:53 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 982
M103C (1) 1 ATmega103 compatibility mode 0 (programmed)
Он "инверсный". Когда 0 - режим совместимости включен. Когда 1 - выключен. Хотя он соб-но вообще работу бутлоадера исключает, а не записи во флэш.
Проверьте Boot Lock Bits:
See Table 108 and Table 109 for further details. The Boot Lock bits can be set in software and in Serial or Parallel Programming mode, but they can be cleared by a chip erase command only.
Может когда-то у вас в них записалось что-то.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 19:35 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Проверил Lock-биты BLB12, BLB11, BLB02, BLB01. Все в 1, что соответствует отсутствию каких либо ограничений на работу с секциями приложения и загрузчика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 21:17 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
Дайте скрин ваших fuses


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 27 фев 2018, 23:55 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Изображение
Вот скрин


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 28 фев 2018, 16:40 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
Скрин с фьюзами не соответствует фразе из первого сообщения:
mrLink писал(а):
С размещением кода загрузчика с адреса 0xF000(сконфигурировал фьюзами BOOTSZ0 и BOOTSZ1, запрограммировал фьюз BOOTRST)

Фьюзы BOOTSZ0 и BOOTSZ1 не прошиты (запрограммированы) -- это значит адрес загрузчика 0хFE00.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 28 фев 2018, 18:08 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
http://www.microchip.com//wwwAppNotes/A ... e=en591504


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 28 фев 2018, 18:42 
Только пришел

Зарегистрирован: 02 фев 2015, 20:52
Сообщения: 13
Спасибо! Запрограммировал фьюзы и заработало! Чувствую себя ослом! А подскажите пожалуйста, как же так получается, что программа загрузчика выполняется с адреса 0xF000 и только лишь не перезаписывает flash при том, что точка входа была вообще с другого адреса?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 01 мар 2018, 12:01 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 198
Контроллер стартует с адреса 0xFE00, а там пусто -- 0xFFFF -- до окончания памяти (т.к. код "бутлоадера" зашивался с адреса 0xF000 и длина его явно меньше 0xE00). Бытует мнение (подтверждённое на практике на некоторых контроллерах), что команды 0xFFFF контроллер интерпретирует как инструкцию NOP (хотя у неё код 0x0000). Вот контроллер и начинает выполнять эти "NOP"'ы пока счётчик команд не переполнится. При переполнении счётчика команд он сбрасывается в '0' и контроллер продолжает выполнение команд с нулевого адреса, а там опять "NOP"'ы в виде 0xFFFF. И так счётчик команд в конце концов досчитается до кода, зашитого начиная с адреса 0xF000. Код начнёт своё выполнение, но проблема в том, что он располагается в памяти типа NRWW (т.к. согласно фьюзам BOOTSZ0 и BOOTSZ1 память RWW располагается с адреса 0xFE00) и это расположение не позволяет перепрограммировать память -- вот поэтому код выполнялся, но ничего не прошивалось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 01 мар 2018, 12:48 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
Netzschlange писал(а):
Контроллер стартует с адреса 0xFE00.......

Что-то я не очень понял. Судя по данной таблице при программировании BOOTSZx меняется размер области BOOT и адрес старта.
При его фьюзах стартовый адрес 0xF000 и размер 4096 words. Ну и так далее.


Вложения:
BOOT.jpg
BOOT.jpg [ 119.14 Кб | Просмотров: 276 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 01 мар 2018, 13:12 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 982
ILYAUL, там инверсия на картинке - где галочка стоит - 0, где галочки нет - это 1. Посмотрите на M103C, я пишу когда он 1 - режим совместимости выключен. И у ТС там галочка не стоит и явно нет режима совместимости, значит там 1 без галочки.
С этими галочками фьюзов постоянная путаница. Лучше считать маску всего фьюза вручную или калькуляторами нормальными, где не галочки, а конкретика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с записью во Flash-память ATMega128
СообщениеДобавлено: 01 мар 2018, 13:16 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2515
Откуда: Москва
А врубился . У каждой программы свои галочки.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB