Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Write/Read data in flash ARM7
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
S1LENCE
Здравствуйте,

у меня стоит задача на контроллере LPC2148 по усарту читать и записывать константы во флэш, как это лучше всего сделать? с помощью IAP, или можно ли как-то проще?

Спасибо,
Иван.
DpInRock
Других способов не существует.
S1LENCE
А можно примерчик?
Бо я с этой архитектурой только знакомлюсь.
Спасибо
toweroff
на сайте производителя есть примеры IAP для LPC2000
S1LENCE
А как занести переменную по определенному адресу (сектор)?
С константой ясно, например
#define a 100 @ 0x10000000

А переменную как объявлять?

Спасибо
skripach
Цитата
Бо я с этой архитектурой только знакомлюсь.

С поиском бы лучше ознакомились. Хотя бы вот http://electronix.ru/forum/index.php?showt...l=iap*&st=0
S1LENCE
Спасибо всем, немного освоил IAP.

Вот только последний момент остался, подскажите что нужно и где написать в scatter-файле чтобы правильно данные разместить по нужному адресу
Среда Кейл
Как сделать чтобы память данных была в IROM2?

Код
LR_IROM1 0x00000000 0x0003FFFF  {  ; load region size_region
  ER_IROM1 0x00000000 0x0003FFFF  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00008000  {; RW data
   .ANY (+RW +ZI)
  }
}

LR_IROM2 0x00040000 0x00008000  {
  ER_IROM2 0x00040000 0x00008000  {; load address = execution address
   .ANY (+RO)
  }
}

esaulenka
Думаю, лучше всего жёстко задать размещение данных. Если отдать это линкеру, данные будут "плавать", и как работать с IAP'ом, непонятно. Хотя, если все блоки по 32 байта (или сколько там минимальный размер для программирования? забыл...), можно и автоматически размещать...

Задать размещение можно вот так:

#include <absacc.h>
volatile const unsigned short usBuild __at (FIRMWARE_BUILD_ADR) = 0xFFFF;

Волатайл - это борьба с компилятором. Он сильно умный, вместо обращения к обычной const может подставить её значение.
aaarrr
Цитата(S1LENCE @ Jan 18 2011, 15:22) *
Вот только последний момент остался, подскажите что нужно и где написать в scatter-файле чтобы правильно данные разместить по нужному адресу

Оформить данные в отдельную секцию (см. #pragma arm section), секцию разместить в требуемом регионе в scatter'е.

Цитата(esaulenka @ Jan 18 2011, 16:11) *
Если отдать это линкеру, данные будут "плавать", и как работать с IAP'ом, непонятно.

Куда это они будут плавать, если адрес секции жестко привязан?
esaulenka
> Куда это они будут плавать
Если в эту секцию натолкать десяток отдельных переменных - я не дам никаких гарантий, что они все не перемешаются.

Правильное решение, видимо, создать в этой секции одну структуру со всеми требуемыми данными - и заниматься фигнёй с ручным выравниванием не надо, и излишней самодеятельности от линкера можно избежать.
ar__systems
Цитата(esaulenka @ Jan 18 2011, 08:24) *
Правильное решение, видимо, создать в этой секции одну структуру со всеми требуемыми данными - и заниматься фигнёй с ручным выравниванием не надо, и излишней самодеятельности от линкера можно избежать.

+1
aaarrr
Цитата(esaulenka @ Jan 18 2011, 16:24) *
Правильное решение, видимо, создать в этой секции одну структуру со всеми требуемыми данными - и заниматься фигнёй с ручным выравниванием не надо, и излишней самодеятельности от линкера можно избежать.

Именно. Хотя замечу все же, что самодеятельности со стророны линкера быть не может - он действует по правилам и в соответствии с link order, а вот C-компилятор действительно никак не гарантирует определенную последовательность размещения данных.
S1LENCE
Так а записать во флэш с помощью IAP можно только минимум 512 байт (256 у меня не вышло почему-то - пишет не правильно задано количество байт).
Для этого прийдется создать буфер на 512 байт - вначале считать все данные с памяти - потом изменить пару байт и записать?
esaulenka
Во-первых, всё-таки минимум 256. Должно это работать.

А во-вторых "изменить пару байт и записать" нельзя. Писать надо в стёртый сектор, а минимальный размер сектора - 4 килобайта.

Кто-то обещал лёгкую жизнь? sm.gif
andrewlekar
Я всё-таки предпочитаю ручное размещение данных. Отдельный файлик заголовочный и там смещения от страницы eeprom всех данных. Структура тут немного неестественно смотрится, хотя и такое решение тоже не идеально.

Я читаю флэш блоками по 256 байт. Но это можно делать только если есть минимум 2 сектора. 2-й сектор стираешь и блоками переливаешь туда данные из первого, попутно заменяя там нужные данные. Потом сектора меняешь местами. У меня для увеличения ресурса флэша используется 8 секторов по 4К и хитрая система определения самого нового сектора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.