Jump to content
Sign in to follow this  
squad_leader

Bootloader Avr, Не Хочет Ничего Писать В Собственную Flash

Recommended Posts

Имею проблему в силу невысоких знаний с bootloader'ом для AtMega168PA

В качестве основы использую http://www.siwawi.arubi.uni-kl.de/avr_projects/ проект Martin Thomas’a из Германии «AVRPROG compatible boot-loader»

Вообщем эта хрень почти работает.

Почти, потому что не пишет ничего в собственную флеш. Ошибок нет, просто отрабатывает с нулевым результатом.

Среда разработки - AtmelStudio7

МК - Atmega168PA

Исходники брал тут http://easyelectronics.ru/img/AVR_kurs/Bootloader/Bootloader.rar

Фьюзы настроил 8f4f02d95739.png

Линкеру указал LDFLAGS += -Wl,--section-start=.text=0x3800; То что ему нужно указывать адрес байтах, а не word'aх учел, умножил адрес на х2

Бутлоадер компилится без ошибок, шьется, отлично отрабатывает весь функционал, кроме одного.

Не шьет память.

Выгружал hex из МК, открывал в блокноте. Все адреса до секции бута заполнены как и положено FFFF.....

С первого адреса бута - идет код бута

Пробовал даже сразу в main()

руками задавать uint8_t gBuffer[128] ={0xAA,0xAB,0xAC,0xAE,0xAF,0xA1,0x2,0xA0,

........

0xAA,0xAB,0xAC,0xAE,0xAF,0xA1,0x2,0xA0,

};

Потом чистить флеш

eraseFlash();

Потом просто писать этот массив в первую ячейку флеша.

writeFlashPage(0x0000,gBuffer);

Не пишет.

Подскажите куда копать. 4 день сижу.

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Ваша Мега168 поддерживается проектом?

169 поддерживается. 168 напрямую не заявлена, но *.h под нее переписал, переменные поправил.

Работают же все иные функции.

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

Почему Вы решили, что Мега с ближайшим номером является родней отсутствующей в списке?

168-я - это расширенная версия 8-й (16кб и более развитая периферия). Расширенный набор регистров, таблица векторов прерываний, есть различия в именах регистров и отдельных битов, начало области программ смещено до 0х100 (вместо 0х60 у Меги8).

Наверное корректировать только заголовочный файл .h маловато.

Edited by Геннадий

Share this post


Link to post
Share on other sites

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

8 заявлена, 16 заявлена, 164 заявлена, и все что рядом.

Я не только h поправил. Да и к тому же все же все порты работают, UART тоже, Ацп тоже. Вся сложная переферия в том числе.

Из флеша читать можно(читается норм), Во флеш писать можно, но изменений нету.

Такое ощущение что где-то стоит какая-то защита ,которая не позволяет функции п бутлоадера изменить флеш

Share this post


Link to post
Share on other sites

Материалы вебинара: «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)»

Вы можете посмотреть видеозапись вебинара «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)», ознакомиться с ответами на вопросы и презентацией, в которой вы найдете много полезных ссылок, в том числе подробнее раскрывающих ответы на вопросы.

Подробнее

А как именно вы шьёте? Я к примеру использую загрузчик chip45boot2. И при каждом прошивании снимаю и подаю напряжение так как загрузчик работает первые 5 секунд после ресета проца а дальше управление передаётся основной программе. Можно и не выдёргивать питание а поставить кнопку ресет.

Share this post


Link to post
Share on other sites

Какие конкретно фузы выставлены?

Как определяете что бутлодырь ...

отлично отрабатывает весь функционал

Питание нормальное? Не из бутлодыря hex шьется и читается?


Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

Share this post


Link to post
Share on other sites

На скриншоте же видны фузы efuse=0xF8 ; hfuse=0xD7 ; lfuse=FD.

А вот содержимое лок-битов было бы интересно.


Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Share this post


Link to post
Share on other sites

Праздники закончились, возвращаюсь к проблеме.

-> Питание нормальное? Не из бутлодыря hex шьется и читается? Питание 3,3в через DCDC конвертер, все идеально.

ЧЕрез ISP и шьется и читается без каких либо проблем.

Фьюзы и локбиты

a06ed5e2edbc.jpg

2f83c1fbca1c.jpg

b5c1508347f3.jpg

Edited by squad_leader

Share this post


Link to post
Share on other sites

на всякий случай кину кусок кода который реализует запись

static inline uint16_t writeFlashPage(uint16_t waddr, pagebuf_t size)
{
uint32_t pagestart = (uint32_t)waddr<<1;
uint32_t baddr = pagestart;
uint16_t data;
uint8_t *tmp = gBuffer;

do
 {
 data = *tmp++;
 data |= *tmp++ << 8;
 boot_page_fill(baddr, data); // call asm routine.
 baddr += 2;   // Select next word in memory
 size -= 2;   // Reduce number of bytes to write by two
 }
while (size);    // Loop until all bytes written
rev_green; //reverse LED green
boot_page_write(pagestart);
boot_spm_busy_wait();
boot_rww_enable();  // Re-enable the RWW section
return baddr>>1;
}

Share this post


Link to post
Share on other sites

Нашел в интернете такое замечание

"На устройствах, которые имеют блок памяти загрузки (boot block), инструкция SPM имеет возможность записи во всю область памяти FLASH, но только в том случае, если она выполняется из области памяти загрузки. Выполнение SPM из секции приложения не дает никакого эффекта"

Вот прям задницей чую, что это из области моей пробелемы, но как проверить - не понятно

Share this post


Link to post
Share on other sites

Вообщем тему можно закрывать. Осилил.

Ошибка была в том, что линкеру нужно говорить LDFLAGS += -Wl,--section-start=.text=0x3800 даже если boot flash size уверен, что адрес 1С00

1С00 *2 = 3800

Edited by squad_leader

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...