|
|
  |
LPC23xx - записать во флеш "из программы" |
|
|
|
Nov 25 2009, 01:03
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Граждане, подскажите - возможно ли писать во флеш "изнутри" и если возможно - как это делать аккуратно ? UPD: вот есть такое безрыбье http://caxapa.ru/lib/lpc2138_paramdata_howto_v11.htmlно оно неизвестно какой древности, для другого процессора и без слова "Keil"
Сообщение отредактировал evgen2 - Nov 25 2009, 01:08
|
|
|
|
|
Nov 25 2009, 06:58
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 30-09-08
Из: Санкт-Петербург
Пользователь №: 40 583

|
Посмотрите user manual, сайт www.nxp.com и этот форум на предмет "In application programming". Программирование встроенной Flash в LPC армах осуществляется через функции встроенного загрузчика. Вот, например аппликашка с сайта nxp: http://www.nxp.com/acrobat_download/applic...s/AN10256_1.pdf
|
|
|
|
|
Nov 25 2009, 08:03
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(etoja @ Nov 25 2009, 10:28)  Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С. Что за фигня? Да стандартно там все! В АРМ по стандарту параметры через регистры передаются и стек (если не влезают)! И у всех компиляторов одинаково! Моожно использовать так для всех компиляторов! Если у вас режим thumb! Если ARM то надо делать interwork здесь ключевые слова/прагмы разные typedef void (*iap) (uint32_t* cmd, uint32_t* res); #define iap_entry ((iap)(0x7ffffff1))
Сообщение отредактировал KRS - Nov 25 2009, 08:08
|
|
|
|
|
Nov 25 2009, 08:34
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 30-09-08
Из: Санкт-Петербург
Пользователь №: 40 583

|
Цитата(etoja @ Nov 25 2009, 11:28)  Dr.Alexey, вы читаете предыдущие сообщения?
Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С. Не надо выдумывать проблем, которых нет. В приведенном Application Note есть два варианта кода - ассемблерный и C. Если используемый Вами C компилятор соблюдает соглашение ARM о вызове функций, то первые 4 параметра будут переданы через регистры. Другого способа записи встроенной flash из кода, кроме как использование функций встроенного загрузчика нет, насколько мне известно.
Сообщение отредактировал Dr.Alexey - Nov 25 2009, 08:34
|
|
|
|
|
Nov 25 2009, 09:08
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(etoja @ Nov 25 2009, 11:39)  Очевидно, что у вас нет опыта использования IAP для разных компиляторов. У меня почему то этот код работает и в GCC и в IAR и в RVCT кейлом не пользуюсь! Что я делаю не так  ?
|
|
|
|
|
Nov 25 2009, 09:08
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 30-09-08
Из: Санкт-Петербург
Пользователь №: 40 583

|
Цитата(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. давайте воздержимся от предположений по поводу опыта друг друга. Форум не для этого
Сообщение отредактировал Dr.Alexey - Nov 25 2009, 09:10
|
|
|
|
|
Nov 25 2009, 09:09
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(etoja @ Nov 25 2009, 09:52)  1. В юзер мануале всё подробно написано. 2. Приведённый код из сахары отлично работает для гну компилятора. 3. Кеил имеет разные версии компилятора: до поглощения фирмой ARM и после. 4. Компилятор Rowley Crossstudio(IDE+GCC) гораздо лучше Кейла, но мы живём в свободной стране и вам не запрещено корячиться с Кейлом. 1. В юзер мануале букв много, а примера работы нет. А эксперементировать как-то стрёмно... 3. 3.xx ...А когда ARM поглотила Keil ? 4. Разве GCC умеет так же оптимизировать, как и Кейл, т.е. RealView ? По отзывам - намного хуже...
|
|
|
|
|
Nov 25 2009, 09:35
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Модератору... Какого... Неужели запись флеша из программы - это для начинающих ? А если я как начинающий - бутлоадер снесу нахрен ? Цитата(etoja @ Nov 25 2009, 12:29)  Если там это и написано, то где-то между строк
|
|
|
|
|
Nov 25 2009, 09:35
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(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); }
|
|
|
|
|
Nov 25 2009, 09:38
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(evgen2 @ Nov 25 2009, 12:30)  Какого... Неужели запись флеша из программы - это для начинающих ? Все вопросы, которые описаны с документации - к начинающим. Все вопросы связанные с незнанием основ языков - к начинающим. Все вопросы, которые многократно поднимались на форуме - к начинающим. Цитата А если я как начинающий - бутлоадер снесу нахрен ? Поскольку Вы документацию НЕ читаете, то сообщаю - снести штатный загрузчик Вам не удастся - для этого надо знать, как это сделать Moderator: Это Ваш первое и последнее обсуждение действий модератора в основных ветках форума. Ознакомитесь с правилами форума в этой части.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 25 2009, 09:41
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 30-09-08
Из: Санкт-Петербург
Пользователь №: 40 583

|
Цитата(evgen2 @ Nov 25 2009, 13:35)  Какого... Неужели запись флеша из программы - это для начинающих ? А если я как начинающий - бутлоадер снесу нахрен ? На сходный вопрос представители NXP ответили мне следующее: В большинстве кристаллов (особенно более поздних) загрузчик прошит в ROM памяти, и не может быть стерт/заменен пользователем. Для остальных кристаллов hex-файл загрузчика есть на сайте NXP и его можно записать по JTAG в случае чего. Конкретно по кристалам узнавать у техподдержки поставщиков.
|
|
|
|
|
Nov 25 2009, 09:54
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 12:38)  Поскольку Вы документацию НЕ читаете, то сообщаю - снести штатный загрузчик Вам не удастся - для этого надо знать, как это сделать  Отвечаю как пользователю: Мой опыт говорит об обратном. Чтобы что-то сломать - не обязательно знать, как это работает. И очень часто, даже слишком часто, приходилось слышать: "этого не может быть, потому что не может быть никогда", причем применительно к тематике этого форума, а не "вообще". А что касается документации - раз уж вы документацию читаете - ткните носом, где в документации описан алгоритм определения сектора для записи своих данных. Цитата(KRS @ Nov 25 2009, 12:35)  Вам надо только константы заменить, номера страниц и т.п. Так вот это-то как раз и непонятно - вот у меня есть список секторов. Где-то в них записана программа с данными, которая грузится при включении питания. Как мне определить - что занято, что свободно ?
|
|
|
|
|
Nov 25 2009, 09:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dr.Alexey @ Nov 25 2009, 12:41)  В большинстве кристаллов (особенно более поздних) загрузчик прошит в ROM памяти, и не может быть стерт/заменен пользователем. Может. И совсем не через JTAG. У производителя лежат прошивки ВООТ в комплекте с загрузчиком, который снимает дополнительную защиту с сектора. Для овладения сокровенными знаниями, можете дизассемблировать либо этот загрузчик, либо официальную библиотеку для управления дополнительной защитой. Цитата(evgen2 @ Nov 25 2009, 12:54)  А что касается документации - раз уж вы документацию читаете - ткните носом, где в документации описан алгоритм определения сектора для записи своих данных. Вы хоть сами поняли, что спросить хотите? Цитата Так вот это-то как раз и непонятно - вот у меня есть список секторов. Где-то в них записана программа с данными, которая грузится при включении питания. Как мне определить - что занято, что свободно ? Все свободны, ибо боотсектор Вам не доступен.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 25 2009, 10:11
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 12:59)  Вы хоть сами поняли, что спросить хотите?
Все свободны, ибо боотсектор Вам не доступен. Если все свободны, то куда девается программа, которую я прошиваю ?
|
|
|
|
|
Nov 25 2009, 10:31
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(KRS @ Nov 25 2009, 13:22)  А вы код свой выложите, записи во флеш. Да я еще ничего не писал, я просто спрашиваю, у меня в голове никак не уложится. Я пишу на писюке программу, заливаю ее во флеш, она во флеше занимает какие-то сектора. Теперь я изнутри хочу записать во флеш какие-то параметры. Мне предлагают писать в один из 11 для 128К или 28 для 512К секторов. Как мне не убить свою программу ?
|
|
|
|
|
Nov 25 2009, 10:43
|

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

|
Цитата(evgen2 @ Nov 25 2009, 12:31)  Теперь я изнутри хочу записать во флеш какие-то параметры. Мне предлагают писать в один из 11 для 128К или 28 для 512К секторов. Как мне не убить свою программу ?  И этот человек, который не знает, в какие адреса попала его программа, возмущается, что вопрос перенесли в ветку для начинающих. Позабавило. 1)Прочитайте документацию на ваш линкер. От корки до корки. 2)Попросите линкер сгенерировать вам карту памяти (.map). Медитируйте над ней. 3)Попросите линкер зарезервировать какой-то из сегментов для ваших данных. Он будет следить за тем, чтобы в этот сегмент не попал никакой код или другие даные.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 25 2009, 11:21
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 13:47)  Про "Вашу" спрашиваете у своей программы, где она кончается. И не пеняйте на Фирму NXP - она о Вашем творчестве не знает ничего. Общий подход к делу - заводите некий сегмент с лежащей в нем переменой и линкуете его последним. По адресу этой переменной и узнаете где кончается Ваша программа. Вопрос обсуждался многократно, особенно когда начинают писать свои загрузчики. У некоторых компиляторов-линкеров такого типа механизм встроен на халяву. В поиск. Ну значит - таки не все свободны. И на NXP я не пеняю. Хотя вот...вроде бы число циклов записи во флеш ограничено. Где это в доке написано - не вижу в упор... Цитата(Сергей Борщ @ Nov 25 2009, 13:43)   И этот человек, который не знает, в какие адреса попала его программа, возмущается, что вопрос перенесли в ветку для начинающих. Позабавило. ну так ежели не<s>трахаться</s> иметь дела с ассемблером и не пытаться ужаться в 512 байт RAM с 8-битным кодом, то про это знать вовсе не обязательно во всяком случае - пока не припрет.
|
|
|
|
|
Nov 25 2009, 11:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(evgen2 @ Nov 25 2009, 14:17)  И на NXP я не пеняю. А это кто писал Цитата где в документации описан алгоритм определения сектора для записи своих данных. Цитата Где это в доке написано - не вижу в упор... Тяжелый случай  . А поиск в PDF не по плечу? Запустите в Data Sheet поиск "erase cycles".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 25 2009, 15:23
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 14:25)  А это кто писал Ну так не написано ж. Цитата(zltigo @ Nov 25 2009, 14:25)  Тяжелый случай  . А поиск в PDF не по плечу? Запустите в Data Sheet поиск "erase cycles". Вы не поверите. Нет такой буквы. Ни в UM10211 (дока на LPC2364-78), ни в UM10360 (дока на 17xx)
|
|
|
|
|
Nov 25 2009, 15:42
|

Местный
  
Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267

|
Цитата(evgen2 @ Nov 25 2009, 18:23)  Ну так не написано ж. Вы не поверите. Нет такой буквы. Ни в UM10211 (дока на LPC2364-78), ни в UM10360 (дока на 17xx) Зато написано "endurance"... И "retention time" заодно.
|
|
|
|
|
Nov 25 2009, 15:59
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 18:32)  Поверю  . Читаем еще раз я писал "Data Sheet" а не "User Manual". Все параметры на чипы указываются в Data Sheet-ах. тьфу ты...виноват. Во многих других местах даташиты=узермануалу. Хотя чего бы не написать эту цифру в мануале - что, жаба душит лишнюю строчку написать ? Или в даташит отправить.. Цитата(zltigo @ Nov 25 2009, 18:32)  Так и НЕ ДОЛЖНО ничего быть написано про Вашу программу - нечего на зеркало пенять. Раз это мануал для юзера - должно быть написано. Хотя бы - "смотрите в инструкцию для вашего линкера/компилера куда он чего складывает"
|
|
|
|
|
Nov 25 2009, 19:01
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Nov 25 2009, 19:04)  Это для Юзера, а не для Плинтуса. Юзер - не робот и память человеческая ограничена склерозом.
|
|
|
|
|
Dec 5 2009, 16:19
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(meister @ Dec 5 2009, 19:02)  Очевидно, что, всего-то, всю программу придется загнать в SRAM. Флэш во время стирания-записи недоступна. - пишется в пустой сектор
- Если не пользовать эзернет - запись работает
В принципе - и фиг бы с ним, можно и загнать. Вопрос - как ? есть ли средство для укрепления, а наставить мы как нибудь сами наставим примеры ?
|
|
|
|
|
Dec 5 2009, 18:55
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(zltigo @ Dec 5 2009, 20:42)  Не не надо никуда никого загонять вообще. Условия исполнения IAP кода описаны у NXP вполне четко. Притормозить MAС на время и все. Э...В описалове IAP вроде про MAC ничего не написано. А как MAC притормозить ? Сейчас попробуем это многобуквие почитать :-/
|
|
|
|
|
Dec 5 2009, 19:44
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(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 - Dec 5 2009, 20:20
|
|
|
|
|
Dec 6 2009, 00:25
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(evgen2 @ Dec 6 2009, 00:46)  Бредятина.
Чего я только не делал, в том числе и прерывания запрещал... Бывает... Цитата(evgen2 @ Dec 6 2009, 00:46)  Сейчас вот вернул запрещение через VIC - и о чудо.... И это бывает. Нужно применять научный метод. Соблюдать чистоту эксперимента. Тогда чудеса пропадут.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|