Полная версия этой страницы:
Write/Read data in flash ARM7
S1LENCE
Jan 2 2011, 22:58
Здравствуйте,
у меня стоит задача на контроллере LPC2148 по усарту читать и записывать константы во флэш, как это лучше всего сделать? с помощью IAP, или можно ли как-то проще?
Спасибо,
Иван.
DpInRock
Jan 3 2011, 02:15
Других способов не существует.
S1LENCE
Jan 3 2011, 07:50
А можно примерчик?
Бо я с этой архитектурой только знакомлюсь.
Спасибо
toweroff
Jan 3 2011, 10:42
на сайте производителя есть примеры IAP для LPC2000
S1LENCE
Jan 11 2011, 18:47
А как занести переменную по определенному адресу (сектор)?
С константой ясно, например
#define a 100 @ 0x10000000
А переменную как объявлять?
Спасибо
skripach
Jan 12 2011, 05:02
Цитата
Бо я с этой архитектурой только знакомлюсь.
С поиском бы лучше ознакомились. Хотя бы вот
http://electronix.ru/forum/index.php?showt...l=iap*&st=0
S1LENCE
Jan 18 2011, 12:22
Спасибо всем, немного освоил 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
Jan 18 2011, 13:11
Думаю, лучше всего жёстко задать размещение данных. Если отдать это линкеру, данные будут "плавать", и как работать с IAP'ом, непонятно. Хотя, если все блоки по 32 байта (или сколько там минимальный размер для программирования? забыл...), можно и автоматически размещать...
Задать размещение можно вот так:
#include <absacc.h>
volatile const unsigned short usBuild __at (FIRMWARE_BUILD_ADR) = 0xFFFF;
Волатайл - это борьба с компилятором. Он сильно умный, вместо обращения к обычной const может подставить её значение.
aaarrr
Jan 18 2011, 13:17
Цитата(S1LENCE @ Jan 18 2011, 15:22)

Вот только последний момент остался, подскажите что нужно и где написать в scatter-файле чтобы правильно данные разместить по нужному адресу
Оформить данные в отдельную секцию (см. #pragma arm section), секцию разместить в требуемом регионе в scatter'е.
Цитата(esaulenka @ Jan 18 2011, 16:11)

Если отдать это линкеру, данные будут "плавать", и как работать с IAP'ом, непонятно.
Куда это они будут плавать, если адрес секции жестко привязан?
esaulenka
Jan 18 2011, 13:24
> Куда это они будут плавать
Если в эту секцию натолкать десяток отдельных переменных - я не дам никаких гарантий, что они все не перемешаются.
Правильное решение, видимо, создать в этой секции одну структуру со всеми требуемыми данными - и заниматься фигнёй с ручным выравниванием не надо, и излишней самодеятельности от линкера можно избежать.
ar__systems
Jan 18 2011, 13:36
Цитата(esaulenka @ Jan 18 2011, 08:24)

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

Правильное решение, видимо, создать в этой секции одну структуру со всеми требуемыми данными - и заниматься фигнёй с ручным выравниванием не надо, и излишней самодеятельности от линкера можно избежать.
Именно. Хотя замечу все же, что самодеятельности со стророны линкера быть не может - он действует по правилам и в соответствии с link order, а вот C-компилятор действительно никак не гарантирует определенную последовательность размещения данных.
S1LENCE
Jan 18 2011, 15:13
Так а записать во флэш с помощью IAP можно только минимум 512 байт (256 у меня не вышло почему-то - пишет не правильно задано количество байт).
Для этого прийдется создать буфер на 512 байт - вначале считать все данные с памяти - потом изменить пару байт и записать?
esaulenka
Jan 18 2011, 16:35
Во-первых, всё-таки минимум 256. Должно это работать.
А во-вторых "изменить пару байт и записать" нельзя. Писать надо в стёртый сектор, а минимальный размер сектора - 4 килобайта.
Кто-то обещал лёгкую жизнь?
andrewlekar
Jan 19 2011, 05:56
Я всё-таки предпочитаю ручное размещение данных. Отдельный файлик заголовочный и там смещения от страницы eeprom всех данных. Структура тут немного неестественно смотрится, хотя и такое решение тоже не идеально.
Я читаю флэш блоками по 256 байт. Но это можно делать только если есть минимум 2 сектора. 2-й сектор стираешь и блоками переливаешь туда данные из первого, попутно заменяя там нужные данные. Потом сектора меняешь местами. У меня для увеличения ресурса флэша используется 8 секторов по 4К и хитрая система определения самого нового сектора.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.