Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC23xx - записать во флеш "из программы"
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
evgen2
Граждане, подскажите - возможно ли писать во флеш "изнутри" и если возможно - как это делать аккуратно ?

UPD: вот есть такое безрыбье http://caxapa.ru/lib/lpc2138_paramdata_howto_v11.html
но оно неизвестно какой древности, для другого процессора и без слова "Keil"
etoja
1. В юзер мануале всё подробно написано.
2. Приведённый код из сахары отлично работает для гну компилятора.
3. Кеил имеет разные версии компилятора: до поглощения фирмой ARM и после.
4. Компилятор Rowley Crossstudio(IDE+GCC) гораздо лучше Кейла, но мы живём в свободной стране и вам не запрещено корячиться с Кейлом.
Dr.Alexey
Посмотрите user manual, сайт www.nxp.com и этот форум на предмет "In application programming". Программирование встроенной Flash в LPC армах осуществляется через функции встроенного загрузчика. Вот, например аппликашка с сайта nxp: http://www.nxp.com/acrobat_download/applic...s/AN10256_1.pdf
etoja
Цитата(Dr.Alexey @ Nov 25 2009, 09:58) *
Посмотрите user manual ...


Dr.Alexey, вы читаете предыдущие сообщения?

Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С.
KRS
Цитата(etoja @ Nov 25 2009, 10:28) *
Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С.

Что за фигня?
Да стандартно там все! В АРМ по стандарту параметры через регистры передаются и стек (если не влезают)! И у всех компиляторов одинаково!


Моожно использовать так для всех компиляторов! Если у вас режим thumb!
Если ARM то надо делать interwork здесь ключевые слова/прагмы разные
typedef void (*iap) (uint32_t* cmd, uint32_t* res);
#define iap_entry ((iap)(0x7ffffff1))
Dr.Alexey
Цитата(etoja @ Nov 25 2009, 11:28) *
Dr.Alexey, вы читаете предыдущие сообщения?

Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С.


Не надо выдумывать проблем, которых нет. В приведенном Application Note есть два варианта кода - ассемблерный и C. Если используемый Вами C компилятор соблюдает соглашение ARM о вызове функций, то первые 4 параметра будут переданы через регистры. Другого способа записи встроенной flash из кода, кроме как использование функций встроенного загрузчика нет, насколько мне известно.
etoja
Очевидно, что у вас нет опыта использования IAP для разных компиляторов.
Поэтому шумите и пишете обрывки операторов.
А вы напишите полный работающий текст программы IAP для Кейла.

PS: приведенный на сахаре текст IAP для gcc не будет работать в Кейле.
Приведённый в aplication note AN10256 текст не будет работать ни в Кейле, ни в gcc,
а разработан он для компилятора ARM Developer Suite (ADS1.2)
KRS
Цитата(etoja @ Nov 25 2009, 11:39) *
Очевидно, что у вас нет опыта использования IAP для разных компиляторов.

У меня почему то этот код работает и в GCC и в IAR и в RVCT
кейлом не пользуюсь!
Что я делаю не так wink.gif ?
Dr.Alexey
Цитата(etoja @ Nov 25 2009, 12:39) *
Очевидно, что у вас нет опыта использования IAP для разных компиляторов.
Поэтому шумите и пишете обрывки операторов.
А вы напишите полный работающий текст программы IAP для Кейла.

PS: приведенный на сахаре текст IAP для gcc не будет работать в Кейле.
Приведённый в aplication note AN10256 текст не будет работать ни в Кейле, ни в gcc,
а разработан он для компилятора ARM Developer Suite (ADS1.2)




Не путайте функции для работы со встроенной flash и целый программны модуль. Вот код функции для записи во встроенную flash:

#define IAP_LOCATION 0x7ffffff1
typedef void (*IAP)(unsigned long[], unsigned long[]);
#define IAP_CMD_CopyRAMToFlash 51

static unsigned long command[5] = {0,0,0,0,0};
static unsigned long result[3]= {0,0,0};
static IAP iap_entry = (IAP) IAP_LOCATION;

unsigned long IAP_CopyRAMToFlash (unsigned long dst, unsigned long src, unsigned long count)
{
command[0] = IAP_CMD_CopyRAMToFlash;
command[1] = dst;
command[2] = src;
command[3] = count;
command[4] = OSCclk / 1000;
iap_entry(command, result);

return result[0];
}

Что именно скомпилирует RealView (который Вы называете Keil) и не скомпилирует GCC? Другое дело специфичные для компилятора вещи, например запрещение прерываний:

__ARMLIB_disableIRQ(); // Взято из примера на Сахаре (полагаю для GCC)
__disable_irq(); // Для RealView

P.S. давайте воздержимся от предположений по поводу опыта друг друга. Форум не для этого
evgen2
Цитата(etoja @ Nov 25 2009, 09:52) *
1. В юзер мануале всё подробно написано.
2. Приведённый код из сахары отлично работает для гну компилятора.
3. Кеил имеет разные версии компилятора: до поглощения фирмой ARM и после.
4. Компилятор Rowley Crossstudio(IDE+GCC) гораздо лучше Кейла, но мы живём в свободной стране и вам не запрещено корячиться с Кейлом.

1. В юзер мануале букв много, а примера работы нет. А эксперементировать как-то стрёмно...
3. 3.xx ...А когда ARM поглотила Keil ?
4. Разве GCC умеет так же оптимизировать, как и Кейл, т.е. RealView ? По отзывам - намного хуже...
etoja
Цитата(evgen2 @ Nov 25 2009, 12:09) *
...А когда ARM поглотила Keil ?

http://www.arm.com/products/DevTools/RealV...evelopment.html
evgen2
Модератору...

Какого... Неужели запись флеша из программы - это для начинающих ? А если я как начинающий - бутлоадер снесу нахрен ?

Цитата(etoja @ Nov 25 2009, 12:29) *

Если там это и написано, то где-то между строк
KRS
Цитата(evgen2 @ Nov 25 2009, 12:09) *
1. В юзер мануале букв много, а примера работы нет. А эксперементировать как-то стрёмно...
3. 3.xx ...А когда ARM поглотила Keil ?
4. Разве GCC умеет так же оптимизировать, как и Кейл, т.е. RealView ? По отзывам - намного хуже...

3 - да уже давно!
4 - не намного, но хуже. IAR и RVCT примерно одинаково, но IAR чаще генерит более сбалансированный код по производительность/размер!

1. Вот пример рабочий для IAR и LPC2129. Мнемонические константы убрал - заменил на физические!
Вам надо только константы заменить, номера страниц и т.п.
erase - стирает страницу целиком
write пишет блок 512 байт адрес - смещение внтури страницы
Почему для IAR - потому что page и iap_entry определены в xcl или icf ( -Deeprom=0C000 -Diap_entry=7ffffff1 )

Код
extern uint8_t page[8192];

__thumb void iap_entry(uint32_t* cmd, uint32_t* res);
static uint32_t iap_cmd[5];
static uint32_t iap_res[2];
uint32_t page_buf[512/4];

void page_erase(void)
{
  iap_cmd[0]=50;
  iap_cmd[1]=6;
  iap_cmd[2]=6;
  iap_entry(iap_cmd, iap_res);
  if (iap_res[0]) return;
  iap_cmd[0]=52;
  iap_cmd[1]=6;
  iap_cmd[2]=6;
  iap_cmd[3]=CLOCK_FREQ/1000;
  iap_entry(iap_cmd, iap_res);
}

void block_write(unsigned addr)
{
  iap_cmd[0]=50;
  iap_cmd[1]=6;
  iap_cmd[2]=6;
  iap_entry(iap_cmd, iap_res);
  if (iap_res[0]) return;
  addr&=~0x1FF;
  iap_cmd[0]=51;
  iap_cmd[1]=((uint32_t)(&page[addr]));
  iap_cmd[2]=(uint32_t)page_buf;
  iap_cmd[3]=512;
  iap_cmd[4]=CLOCK_FREQ/1000;
  iap_entry(iap_cmd, iap_res);
}
zltigo
Цитата(evgen2 @ Nov 25 2009, 12:30) *
Какого... Неужели запись флеша из программы - это для начинающих ?

Все вопросы, которые описаны с документации - к начинающим. Все вопросы связанные с незнанием основ языков - к начинающим.
Все вопросы, которые многократно поднимались на форуме - к начинающим.
Цитата
А если я как начинающий - бутлоадер снесу нахрен ?

Поскольку Вы документацию НЕ читаете, то сообщаю - снести штатный загрузчик Вам не удастся - для этого надо знать, как это сделать smile.gif

Moderator:
Это Ваш первое и последнее обсуждение действий модератора в основных ветках форума. Ознакомитесь с правилами форума в этой части.
Dr.Alexey
Цитата(evgen2 @ Nov 25 2009, 13:35) *
Какого... Неужели запись флеша из программы - это для начинающих ? А если я как начинающий - бутлоадер снесу нахрен ?



На сходный вопрос представители NXP ответили мне следующее:
В большинстве кристаллов (особенно более поздних) загрузчик прошит в ROM памяти, и не может быть стерт/заменен пользователем. Для остальных кристаллов hex-файл загрузчика есть на сайте NXP и его можно записать по JTAG в случае чего. Конкретно по кристалам узнавать у техподдержки поставщиков.
evgen2
Цитата(zltigo @ Nov 25 2009, 12:38) *
Поскольку Вы документацию НЕ читаете, то сообщаю - снести штатный загрузчик Вам не удастся - для этого надо знать, как это сделать smile.gif


Отвечаю как пользователю:

Мой опыт говорит об обратном. Чтобы что-то сломать - не обязательно знать, как это работает. И очень часто, даже слишком часто, приходилось слышать: "этого не может быть, потому что не может быть никогда", причем применительно к тематике этого форума, а не "вообще".

А что касается документации - раз уж вы документацию читаете - ткните носом, где в документации описан алгоритм определения сектора для записи своих данных.

Цитата(KRS @ Nov 25 2009, 12:35) *
Вам надо только константы заменить, номера страниц и т.п.


Так вот это-то как раз и непонятно - вот у меня есть список секторов. Где-то в них записана программа с данными, которая грузится при включении питания. Как мне определить - что занято, что свободно ?
zltigo
Цитата(Dr.Alexey @ Nov 25 2009, 12:41) *
В большинстве кристаллов (особенно более поздних) загрузчик прошит в ROM памяти, и не может быть стерт/заменен пользователем.

Может. И совсем не через JTAG. У производителя лежат прошивки ВООТ в комплекте с загрузчиком, который снимает дополнительную защиту с сектора. Для овладения сокровенными знаниями, можете дизассемблировать либо этот загрузчик, либо официальную библиотеку для управления дополнительной защитой.



Цитата(evgen2 @ Nov 25 2009, 12:54) *
А что касается документации - раз уж вы документацию читаете - ткните носом, где в документации описан алгоритм определения сектора для записи своих данных.

Вы хоть сами поняли, что спросить хотите?
Цитата
Так вот это-то как раз и непонятно - вот у меня есть список секторов. Где-то в них записана программа с данными, которая грузится при включении питания. Как мне определить - что занято, что свободно ?

Все свободны, ибо боотсектор Вам не доступен.
evgen2
Цитата(zltigo @ Nov 25 2009, 12:59) *
Вы хоть сами поняли, что спросить хотите?

Все свободны, ибо боотсектор Вам не доступен.

Если все свободны, то куда девается программа, которую я прошиваю ?
KRS
Цитата(evgen2 @ Nov 25 2009, 13:11) *
Если все свободны, то куда девается программа, которую я прошиваю ?

А вы код свой выложите, записи во флеш.
evgen2
Цитата(KRS @ Nov 25 2009, 13:22) *
А вы код свой выложите, записи во флеш.

Да я еще ничего не писал, я просто спрашиваю, у меня в голове никак не уложится.
Я пишу на писюке программу, заливаю ее во флеш, она во флеше занимает какие-то сектора. Теперь я изнутри хочу записать во флеш какие-то параметры. Мне предлагают писать в один из 11 для 128К или 28 для 512К секторов. Как мне не убить свою программу ?
Сергей Борщ
Цитата(evgen2 @ Nov 25 2009, 12:31) *
Теперь я изнутри хочу записать во флеш какие-то параметры. Мне предлагают писать в один из 11 для 128К или 28 для 512К секторов. Как мне не убить свою программу ?
bb-offtopic.gif И этот человек, который не знает, в какие адреса попала его программа, возмущается, что вопрос перенесли в ветку для начинающих. Позабавило.
1)Прочитайте документацию на ваш линкер. От корки до корки.
2)Попросите линкер сгенерировать вам карту памяти (.map). Медитируйте над ней.
3)Попросите линкер зарезервировать какой-то из сегментов для ваших данных. Он будет следить за тем, чтобы в этот сегмент не попал никакой код или другие даные.
zltigo
Цитата(evgen2 @ Nov 25 2009, 13:11) *
Если все свободны, то куда девается программа, которую я прошиваю ?

Про "Вашу" спрашиваете у своей программы, где она кончается. И не пеняйте на Фирму NXP - она о Вашем творчестве не знает ничего. Общий подход к делу - заводите некий сегмент с лежащей в нем переменой и линкуете его последним. По адресу этой переменной и узнаете где кончается Ваша программа. Вопрос обсуждался многократно, особенно когда начинают писать свои загрузчики. У некоторых компиляторов-линкеров такого типа механизм встроен на халяву. В поиск.
evgen2
Цитата(zltigo @ Nov 25 2009, 13:47) *
Про "Вашу" спрашиваете у своей программы, где она кончается. И не пеняйте на Фирму NXP - она о Вашем творчестве не знает ничего. Общий подход к делу - заводите некий сегмент с лежащей в нем переменой и линкуете его последним. По адресу этой переменной и узнаете где кончается Ваша программа. Вопрос обсуждался многократно, особенно когда начинают писать свои загрузчики. У некоторых компиляторов-линкеров такого типа механизм встроен на халяву. В поиск.

Ну значит - таки не все свободны. И на NXP я не пеняю. Хотя вот...вроде бы число циклов записи во флеш ограничено. Где это в доке написано - не вижу в упор...

Цитата(Сергей Борщ @ Nov 25 2009, 13:43) *
bb-offtopic.gif И этот человек, который не знает, в какие адреса попала его программа, возмущается, что вопрос перенесли в ветку для начинающих. Позабавило.


ну так ежели не<s>трахаться</s> иметь дела с ассемблером и не пытаться ужаться в 512 байт RAM с 8-битным кодом, то про это знать вовсе не обязательно
rolleyes.gif
во всяком случае - пока не припрет.
zltigo
Цитата(evgen2 @ Nov 25 2009, 14:17) *
И на NXP я не пеняю.

А это кто писал
Цитата
где в документации описан алгоритм определения сектора для записи своих данных.

Цитата
Где это в доке написано - не вижу в упор...

Тяжелый случай sad.gif. А поиск в PDF не по плечу? Запустите в Data Sheet поиск "erase cycles".
evgen2
Цитата(zltigo @ Nov 25 2009, 14:25) *
А это кто писал

Ну так не написано ж.

Цитата(zltigo @ Nov 25 2009, 14:25) *
Тяжелый случай sad.gif. А поиск в PDF не по плечу? Запустите в Data Sheet поиск "erase cycles".

Вы не поверите. Нет такой буквы. Ни в UM10211 (дока на LPC2364-78), ни в UM10360 (дока на 17xx)
zltigo
Цитата(evgen2 @ Nov 25 2009, 18:23) *
Вы не поверите. Нет такой буквы. Ни в UM10211 (дока на LPC2364-78), ни в UM10360 (дока на 17xx)

Поверю sad.gif sad.gif sad.gif. Читаем еще раз я писал "Data Sheet" а не "User Manual". Все параметры на чипы указываются в Data Sheet-ах.



Цитата(evgen2 @ Nov 25 2009, 18:23) *
Ну так не написано ж.

Так и НЕ ДОЛЖНО ничего быть написано про Вашу программу - нечего на зеркало пенять.
mdmitry
bb-offtopic.gif Почти. Может пора создать тему, в которой описать систему документации кристаллов в зависимости от производителя (NXP, TI, AD, Atmel и т.д.) и указать ГДЕ и ЧТО находится.
goodwin
Цитата(evgen2 @ Nov 25 2009, 18:23) *
Ну так не написано ж.
Вы не поверите. Нет такой буквы. Ни в UM10211 (дока на LPC2364-78), ни в UM10360 (дока на 17xx)


Зато написано "endurance"...
И "retention time" заодно.
evgen2
Цитата(zltigo @ Nov 25 2009, 18:32) *
Поверю sad.gif sad.gif sad.gif. Читаем еще раз я писал "Data Sheet" а не "User Manual". Все параметры на чипы указываются в Data Sheet-ах.

тьфу ты...виноват. Во многих других местах даташиты=узермануалу. Хотя чего бы не написать эту цифру в мануале - что, жаба душит лишнюю строчку написать ? Или в даташит отправить..

Цитата(zltigo @ Nov 25 2009, 18:32) *
Так и НЕ ДОЛЖНО ничего быть написано про Вашу программу - нечего на зеркало пенять.

Раз это мануал для юзера - должно быть написано. Хотя бы - "смотрите в инструкцию для вашего линкера/компилера куда он чего складывает"
zltigo
Цитата(mdmitry @ Nov 25 2009, 18:41) *
bb-offtopic.gif Почти. Может пора создать тему..

Может пора, для начала, заходить на сайт производителя и смотреть?
mdmitry
Цитата(zltigo @ Nov 25 2009, 18:59) *
Может пора, для начала, заходить на сайт производителя и смотреть?

Только после вопроса на форуме rolleyes.gif . Эти вопросы возникают чуть ли не ежемесячно.
zltigo
Цитата(evgen2 @ Nov 25 2009, 18:59) *
Раз это мануал для юзера - должно быть написано.

Это для Юзера, а не для Плинтуса. Юзер знает, для чего Линкеры, Компиляторы и умеет ими пользоваться, или не пользоваться....
evgen2
Цитата(zltigo @ Nov 25 2009, 19:04) *
Это для Юзера, а не для Плинтуса.

Юзер - не робот и память человеческая ограничена склерозом.
evgen2
Кстати, нашлось тут еще на туже тему...фиг знает что с иероглифами, но похоже на фотокамеру
http://www.pudn.com/downloads92/sourcecode...tail355878.html

смотреть файл. iar.c
zltigo
Цитата(evgen2 @ Nov 26 2009, 00:30) *
смотреть

http://www.google.lv/search?client=opera&a...-8&oe=utf-8
evgen2
Всем спасибо, заработало.

Остался только вопрос, как в Кейле зарезервировать область флеша. (чтоб компилер с линкером туда точно ничего не поместили и все работало в автомате, без разглядывания мапфайла каждый раз) Вроде бы для этого нужно пользовать scatter-loading, но чего-то оно больно мудреное...
aaarrr
Цитата(evgen2 @ Nov 26 2009, 17:40) *
Вроде бы для этого нужно пользовать scatter-loading, но чего-то оно больно мудреное...

Если scatter кажется "больно мудреным" (хотя это на самом деле совсем не так), можете просто скрыть от линкера часть флеш-памяти, сообщив ему размер меньше реального.
evgen2
Граждане, кто-нибудь таки умеет использовать IAP при работающем эзернете ?
meister
Цитата(evgen2 @ Dec 5 2009, 18:13) *
Граждане, кто-нибудь таки умеет использовать IAP при работающем эзернете ?


Очевидно, что, всего-то, всю программу придется загнать в SRAM. Флэш во время стирания-записи недоступна.
evgen2
Цитата(meister @ Dec 5 2009, 19:02) *
Очевидно, что, всего-то, всю программу придется загнать в SRAM. Флэш во время стирания-записи недоступна.

  1. пишется в пустой сектор
  2. Если не пользовать эзернет - запись работает

В принципе - и фиг бы с ним, можно и загнать. Вопрос - как ? есть ли средство для укрепления, а наставить мы как нибудь сами наставим примеры ?
meister
Цитата(evgen2 @ Dec 5 2009, 19:19) *
Вопрос - как?


Как загнать? Это зависит от среды разработки. Если не "загонять" (есть шанс, что не влезет) - убрать все, что работает с флэшем (выключить прерывания) и стирать-писать. Причем тут езернет?
zltigo
Цитата(meister @ Dec 5 2009, 20:34) *
Как загнать?

Не не надо никуда никого загонять вообще. Условия исполнения IAP кода описаны у NXP вполне четко. Притормозить MAС на время и все.
evgen2
Цитата(zltigo @ Dec 5 2009, 20:42) *
Не не надо никуда никого загонять вообще. Условия исполнения IAP кода описаны у NXP вполне четко. Притормозить MAС на время и все.

Э...В описалове IAP вроде про MAC ничего не написано. А как MAC притормозить ? Сейчас попробуем это многобуквие почитать :-/
meister
Цитата(zltigo @ Dec 5 2009, 20:42) *
Не не надо никуда никого загонять вообще.


Если не хочется тормозить MAC (отвечать на ARP пакеты, стирается довольно долго) - деваться некуда.
evgen2
Цитата(meister @ Dec 5 2009, 20:34) *
убрать все, что работает с флэшем (выключить прерывания) и стирать-писать.

ну так ясен пень - выключаю прерывания
Цитата(meister @ Dec 5 2009, 20:34) *
Причем тут езернет?

не знаю, но опытно-экспериментальным путем установлено, что без него - работает

Цитата(meister @ Dec 5 2009, 21:57) *
Если не хочется тормозить MAC (отвечать на ARP пакеты, стирается довольно долго) - деваться некуда.

ну так если у меня никаких прерываний и я пошел флеш читать-писать - я собственно никому и не отвечаю

Останавливаю МАС
MAC_COMMAND &= ~(CR_RX_EN | CR_TX_EN);
MAC_MAC1 &= ~MAC1_REC_EN;
или даже так:
MAC_MAC1=0;
MAC_MAC2=0;
и даже если отключить питание
PCONP &= ~0x40000000;
и ноги оторвать PCON2 = PCON3 = 0
после чего в отладчике дохожу до вызова IAP IAP_CMD_ERASE - и улетаю в ,во, на этот раз -
Undef_Handler B Undef_Handler
:-((
evgen2
Бредятина.

Чего я только не делал, в том числе и прерывания запрещал...
то через VIC, то через __disable_irq() ;
В любой позиции глючило. Сейчас вот вернул запрещение через VIC - и о чудо....
crying.gif cranky.gif maniac.gif
scifi
Цитата(evgen2 @ Dec 6 2009, 00:46) *
Бредятина.

Чего я только не делал, в том числе и прерывания запрещал...

Бывает...

Цитата(evgen2 @ Dec 6 2009, 00:46) *
Сейчас вот вернул запрещение через VIC - и о чудо....

И это бывает. Нужно применять научный метод. Соблюдать чистоту эксперимента. Тогда чудеса пропадут.
evgen2
Цитата(scifi @ Dec 6 2009, 03:25) *
Бывает...


И это бывает. Нужно применять научный метод. Соблюдать чистоту эксперимента. Тогда чудеса пропадут.

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