Easyelectronics.ru

Электроника для всех
Текущее время: 24 сен 2022, 21:06

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 16 ноя 2021, 17:28 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
Всем привет. Продолжаю мучить PIC24HJ64GP502. Во-первых, храню настройки во флешке и хочу сделать так, чтобы они не затирались перепрошивкой, а во-вторых, хочу сделать бутлоадер. Следовательно, программатору требуется рассказать, в какую область флеша заливать прошивки. Полез в настройки. Во вкладке Program Options есть галка Очистить все перед прошивкой, и галку снять нельзя. Полез во вкладку Memories to Program. Переключился на ручную разметку памяти. Выставил для прошивки весь флеш (0-abff), и область a800-abff в качестве Preserve Program Memory Range. Галку в Preserve Program Memory. В итоге МК не шьется и под отладку не заходит. Выдает:

Код:
Target voltage detected
Target device PIC24HJ64GP502 found.
Device Revision Id  = 0x3004

Calculating memory ranges for operation...

Код:
Launching
Programming target
Failed to program the target device
The debugger could not be started.  Terminating debug session.
User program finished


Причем дело именно в Preserve Program Memory, без него все работает. Уже весь мозг себе сломал, но работать не могу заставить. В STM32 это делается легким движением руки, здесь же какая-то жесть. Кто может подсказать, как сделать правильные настройки?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 16 ноя 2021, 20:26 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3896
Может диапазон неправильно указали? В пиках вечно засада - то адреса в байтах, то в словах, то в страницах памяти указывать нужно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 16 ноя 2021, 22:53 
Заглядывает иногда

Зарегистрирован: 26 фев 2018, 03:06
Сообщения: 182
BARS_ писал(а):
Во-первых, храню настройки во флешке и хочу сделать так, чтобы они не затирались перепрошивкой, ...... Следовательно, программатору требуется рассказать, в какую область флеша заливать прошивки.
не буду утверждать 100%, но программатор перед записью новой прошивки , принудительно делает полное стирание и флеш и ЕЕПРОМ если таковой имеется. эта функция зашита на уровне самого МК .
если бы это было не так небыло бы никаких проблем отдельно стирать конфиг. и разлочивать МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 16 ноя 2021, 23:21 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3896
Функция-то есть, но постраничное стирание тоже есть. Кстати вот - еще ж надо на границу страницы попасть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 17 ноя 2021, 11:44 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
NStorm писал(а):
Может диапазон неправильно указали? В пиках вечно засада - то адреса в байтах, то в словах, то в страницах памяти указывать нужно.
Да вроде правильно. По крайней мере с картой флеша в MPLAB все бьется. Да и последнюю страницу он стирать перестал.

DmitriyVDN писал(а):
не буду утверждать 100%, но программатор перед записью новой прошивки , принудительно делает полное стирание и флеш и ЕЕПРОМ если таковой имеется. эта функция зашита на уровне самого МК.
Просто до этого работал с STM32 и там такого не было. Да и PicKit4 позволяет снять эту галку, затык чисто в ICD4 похоже.

NStorm писал(а):
еще ж надо на границу страницы попасть.
По идее когда не попадаешь оно ругается, что адрес неверно выровнен.

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 25 ноя 2021, 17:51 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
Ну вроде как с сохранением участка флеша после прошивки я разобрался. Теперь пытаюсь сделать бут. Точнее он у меня спокойно пишет в память, но вот перейти по адресу записанного не получается. Самое интересное, что основная прошивка продолжает стартовать без бута даже учитывая то, что она лежит не по адресу 0х200 (прописал в *.gld файле). В той же STM32 она не будет стартовать в таких условиях, т.к. по 0 адресу исполняемого кода не будет. А тут компилятор явно как-то хитрит и продолжает размещать в 0 адрес ссылку на код. В общем всю голову сломал уже. В примерах Пика переход делается командой asm("goto 0x3C00"); У меня же это тупо ребутит бутлоадер и все. Кто может подсказать, как сделать корректные настройки?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 25 ноя 2021, 21:53 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3896
Ну а если просто взять указатель на функцию, присвоить адрес переход и вызвать как функцию? Может там компилятор разберется что нужно сделать.
Ну и плюс опять же пиковские приколы - то слова, то байты в адресах.

Цитата:
А тут компилятор явно как-то хитрит и продолжает размещать в 0 адрес ссылку на код.

Не факт. Гадаю - но может он просто как nopы считает пустую память и просто добегает до прошивки, если сначала пусто.
AN1157 смотрели? Там есть пример с исходниками бута. Файлы тут: https://www.microchip.com/en-us/applica ... tes/an1157 Только они запаковали в древний инсталлер, который в Win10 у меня не работает. По идее после установки там должны быть исходники их бутлоадера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 25 ноя 2021, 22:07 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3896
Вот, нашел исходники какого-то бута. Посмотрите как тут реализовано:https://github.com/krekeltronics/pic24-bootloader-firmware
Код:
#define USER_PROG_RESET         0x100   //User app reset vector location
...
   sourceAddr.Val = USER_PROG_RESET;                                               //Setup user reset vector
   userReset.Val = ReadLatch(sourceAddr.word.HW, sourceAddr.word.LW);
...
      if(IFS0bits.T3IF == 1) {                                                    //If timer expired, jump to user code
         ResetDevice(userReset.Val);
...
void ResetDevice(WORD addr)
{
   asm("goto %0" : : "r"(addr));
}

Не пойму честно говоря зачем ReadLatch, т..к. по описанию она считывает с адреса во флэше... Но детально не копал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 26 ноя 2021, 12:59 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
NStorm писал(а):
Ну а если просто взять указатель на функцию, присвоить адрес переход и вызвать как функцию? Может там компилятор разберется что нужно сделать.

Пробовал, не прокатило)

NStorm писал(а):
Гадаю - но может он просто как nopы считает пустую память и просто добегает до прошивки, если сначала пусто.

Ну в 0000 адресе лежит адрес начала прошивки) Точнее лежал, после редактирования скрипта прошивка стартовать перестала.

NStorm писал(а):
Там есть пример с исходниками бута. Файлы тут: https://www.microchip.com/en-us/applica ... tes/an1157 Только они запаковали в древний инсталлер, который в Win10 у меня не работает.

Поглядел. Инсталлер в совместимости с win7 согласился поставиться. Вроде все настроил как в примере, но на работу никак не повлияло. После вызова goto тупо ребутится бут и все.

NStorm писал(а):
Вот, нашел исходники какого-то бута

ReadLatch какая-то странная штука. Внутри устроена вот так:

Код:
DWORD ReadLatch(WORD page, WORD addrLo)
{
   DWORD_VAL temp;

   TBLPAG = page;

   temp.word.LW = __builtin_tblrdl(addrLo);
   temp.word.HW = __builtin_tblrdh(addrLo);

   return temp.Val;
}


Т.е. в нее передается адрес TBLPAG и памяти. Самое интересное в том, что если я пишу в TBLPAG что-то отличное от нуля, МК виснет. В примере же туда пишется 0х01 (кстати, откуда берется адрес 0х100 ?). В общем ничего непонятно. В STM я часа 2 потратил на переход в бут/из бута. Тут уже 3 день бьюсь и все впустую xD

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 26 ноя 2021, 15:36 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
По поводу ReadLatch затупил. В нее же два слова передается, а не байта. А по адресу 100 лежит BLreset, который представляет из себя адрес начала прошивки. Правда, работать от этого оно не начало...

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 26 ноя 2021, 17:15 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3896
Посмотрите тут про таблицу векторов и скрипты для линкера: https://www.microchip.com/forums/m808895.aspx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 26 ноя 2021, 18:20 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
Нуууу особо ясности не внесло. В принципе я могу отказаться от прерываний в буте. Оно там итак всего одно на приеме данных DMA. Можно просто в цикле флаг мониторить. Возможно, тогда будет проще с таблицей прерываний.

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 28 ноя 2021, 03:26 
Заглядывает иногда

Зарегистрирован: 23 фев 2017, 09:07
Сообщения: 45
BARS_ писал(а):
В принципе я могу отказаться от прерываний в буте.

Без программного ремапа IVT работать в буте с прерываниями невозможно. Ремап увеличит латентность прерываний примерно на 8 машинных циклов.
А вообще, вы референсный мануал на PIC24H открывали? А то вы воюете с тем, что задокументировано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 29 ноя 2021, 11:03 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
Я уже какие только мануалы не читал) С непревычки трудновато сразу разобраться. Использование прерываний в буте вообще не критично. Я могу и в цикле мониторить наличие данных DMA. С прерываниями оно, конечно удобнее, но не критично. Я вот про что еще подумал. А когда я через программатор лью обе прошивки оно будет работать? Может сам программатор надо настроить? Например, чтобы он не перезаписывал область настроек МК с 0х000 д 0х200...

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 29 ноя 2021, 14:01 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
Еще немного порассуждаю вслух =) Для того, чтобы у меня работали прерывания мне требуется прерывания для основной прошивки перекинуть в альтернативное местоположение в памяти. Копаю микрочиповские примеры. В скрипте для бута пишут следующее:

Код:
    /* Int Vector Remap Method 2 –point to a location in a jump table */
    LONG(ABSOLUTE(0x2004)); /*T2 Interrupt - location of jump table goto instruction*/

А в скрипте прошивки таблица прерываний вообще удаляется. Вроде понятно, перекидываем прерывание таймера 2 в 0x2004. Далее идем в c файл прошивки:

Код:
/*
*   ISR JUMP TABLE
*
*   It is necessary to define jump table as a function because C30 will
*   not store 24-bit wide values in program memory as variables.
*
*   This function should be stored at an address where the goto instructions
*   line up with the remapped vectors from the bootloader's linker script.
*/
void __attribute__ ((address(0x1000))) ISRTable(){

   asm("reset"); //reset instruction to prevent runaway code
   asm("goto %0"::"i"(&_T2Interrupt));  //T2Interrupt's address
}


Вот тут уже не совсем понятно. Используется адрес 0x1000. Как он соотносится с 0x2004? Или я что-то не так понимаю? И как это работает, когда одно и то же прерывание используется и в буте и в прошивке?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 01 дек 2021, 16:43 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 465
Откуда: г. Ростов-на-Дону
В общем, все еще бьюсь с данной задачей. Из бута исключено прерывание. Сейчас работает переход из бута в приложение, НО прерывания в приложении не работают (само приложение при этом запускается). Следовательно, неправильно ремаплю таблицу векторов прерывания. Просмотрел кучу примеров, делаю аналогично им. Но результат нулевой. Кто может объяснить, как правильно это сделать? Своими силами ну никак не могу въехать в это...

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: MPLAB ICD4 и PIC4, разграничение флеша.
СообщениеДобавлено: 05 дек 2021, 01:04 
Заглядывает иногда

Зарегистрирован: 23 фев 2017, 09:07
Сообщения: 45
BARS_ писал(а):
Кто может объяснить, как правильно это сделать?...

Лучше это делать на АСМе.
org-ом прибиваются гвоздями к конкретному адресу флеша все обработчики прерываний в которых пишем либо retfie, либо bra <метка реального обработчика>:
Код:
;---------------------------
.org app_code-0x206
;---------------------------
MainStart:
   goto   Main
__INT0Interrupt:
   retfie
__IC1Interrupt:
   bra   IC1ISR
__OC1Interrupt:
   retfie
__T1Interrupt:
   bra   T1ISR
__DMA0Interrupt:
   bra   DMA0ISR
__IC2Interrupt:
   bra   IC2ISR
__OC2Interrupt:
   retfie
__T2Interrupt:
   bra   T2ISR
__T3Interrupt:
   retfie
...........
...........

Таким образом, расположенная на первой странице флеша таблица векторов (IVT) и reset-вектор никогда не модифицируются. А код показанный выше может быть изменен в части меток реальных обработчиков, включая добавление новых обработчиков. Патамушта при этом retfie и bra занимают одно слово во флеше.
Реальные обработчики могут менять размеры и перемещаться линкером куда угодно.


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


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


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

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


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

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

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