|
|
  |
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 в случае чего. Конкретно по кристалам узнавать у техподдержки поставщиков.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|