реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> LPC23xx - записать во флеш "из программы"
evgen2
сообщение Nov 25 2009, 01:03
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Граждане, подскажите - возможно ли писать во флеш "изнутри" и если возможно - как это делать аккуратно ?

UPD: вот есть такое безрыбье http://caxapa.ru/lib/lpc2138_paramdata_howto_v11.html
но оно неизвестно какой древности, для другого процессора и без слова "Keil"

Сообщение отредактировал evgen2 - Nov 25 2009, 01:08
Go to the top of the page
 
+Quote Post
etoja
сообщение Nov 25 2009, 06:52
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



1. В юзер мануале всё подробно написано.
2. Приведённый код из сахары отлично работает для гну компилятора.
3. Кеил имеет разные версии компилятора: до поглощения фирмой ARM и после.
4. Компилятор Rowley Crossstudio(IDE+GCC) гораздо лучше Кейла, но мы живём в свободной стране и вам не запрещено корячиться с Кейлом.
Go to the top of the page
 
+Quote Post
Dr.Alexey
сообщение Nov 25 2009, 06:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
etoja
сообщение Nov 25 2009, 07:28
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Цитата(Dr.Alexey @ Nov 25 2009, 09:58) *
Посмотрите user manual ...


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

Проблема состоит в том, что функции IAP требуют передачи параметров через регистры процессора и соответственно ассемблерной вставки в С-программу, что является специфическим для каждого С-компилятора, поскольку не входит в стандарт языка С.
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 25 2009, 08:03
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
Dr.Alexey
сообщение Nov 25 2009, 08:34
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
etoja
сообщение Nov 25 2009, 08:39
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Очевидно, что у вас нет опыта использования IAP для разных компиляторов.
Поэтому шумите и пишете обрывки операторов.
А вы напишите полный работающий текст программы IAP для Кейла.

PS: приведенный на сахаре текст IAP для gcc не будет работать в Кейле.
Приведённый в aplication note AN10256 текст не будет работать ни в Кейле, ни в gcc,
а разработан он для компилятора ARM Developer Suite (ADS1.2)
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 25 2009, 09:08
Сообщение #8


Профессионал
*****

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



Цитата(etoja @ Nov 25 2009, 11:39) *
Очевидно, что у вас нет опыта использования IAP для разных компиляторов.

У меня почему то этот код работает и в GCC и в IAR и в RVCT
кейлом не пользуюсь!
Что я делаю не так wink.gif ?
Go to the top of the page
 
+Quote Post
Dr.Alexey
сообщение Nov 25 2009, 09:08
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
evgen2
сообщение Nov 25 2009, 09:09
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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 ? По отзывам - намного хуже...
Go to the top of the page
 
+Quote Post
etoja
сообщение Nov 25 2009, 09:29
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Цитата(evgen2 @ Nov 25 2009, 12:09) *
...А когда ARM поглотила Keil ?

http://www.arm.com/products/DevTools/RealV...evelopment.html
Go to the top of the page
 
+Quote Post
evgen2
сообщение Nov 25 2009, 09:35
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Модератору...

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

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

Если там это и написано, то где-то между строк
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 25 2009, 09:35
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 25 2009, 09:38
Сообщение #14


Гуру
******

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



Цитата(evgen2 @ Nov 25 2009, 12:30) *
Какого... Неужели запись флеша из программы - это для начинающих ?

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

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

Moderator:
Это Ваш первое и последнее обсуждение действий модератора в основных ветках форума. Ознакомитесь с правилами форума в этой части.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dr.Alexey
сообщение Nov 25 2009, 09:41
Сообщение #15


Участник
*

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



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



На сходный вопрос представители NXP ответили мне следующее:
В большинстве кристаллов (особенно более поздних) загрузчик прошит в ROM памяти, и не может быть стерт/заменен пользователем. Для остальных кристаллов hex-файл загрузчика есть на сайте NXP и его можно записать по JTAG в случае чего. Конкретно по кристалам узнавать у техподдержки поставщиков.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016