Здравствуйте!
В разрабатываемом устройстве требуется проводить калибровку, при которой образовывается большой объём калибровочных данных, около 100 кБ. Я хочу их сохранять по определённым адресам во внутреннюю флеш память микроконтроллера LPC1758, а потом во время работы обращаться к ним по указателю на адрес во флеш-памяти. Получиться ли такое реализовать, или в моих соображениях есть принципиальная ошибка?
ILYAUL
Jun 14 2014, 19:59
Я бы начал с сокращения объёма калибровочных данных .
Сергей Борщ
Jun 15 2014, 07:26
Цитата(kt368 @ Jun 14 2014, 21:25)

Получиться ли такое реализовать, или в моих соображениях есть принципиальная ошибка?
Да, получится. Ошибки в соображениях нет.
toweroff
Jun 15 2014, 07:47
А прикрутить внешнюю eeprom?
Если сами калибровочные данные секрета не представляют, зачем использовать внутреннюю флеш? Это же, как-никак, большой кусок для программы, да и количество перезаписей для нее значительно меньше, чем у EEPROM
Сергей Борщ
Jun 15 2014, 16:09
Цитата(toweroff @ Jun 15 2014, 10:47)

Если сами калибровочные данные секрета не представляют, зачем использовать внутреннюю флеш?
А зачем использовать внешнюю, если свободное место во внутренней позволяет?
Цитата(toweroff @ Jun 15 2014, 10:47)

Это же, как-никак, большой кусок для программы,
Программа может быть и маленькой.
Цитата(toweroff @ Jun 15 2014, 10:47)

да и количество перезаписей для нее значительно меньше, чем у EEPROM
Калибровка часто выполняется один раз при изготовлении и потом иногда один раз после ремонта. Циклов перезаписи там много не требуется. Даже если она делется раз в день, то ресурса внутреннего флеша с головой хватит на гарантийный срок.
Памяти в камне с лихвой - 512 кБ, программа пока занимает 50 кБ, не думаю, что её раздует сильнее, чем до 100-200 кБ. Т.е. 100 кБ для калибровочных данных точно найдётся.
Буду пробовать, потом расскажу что получилось.
toweroff
Jun 15 2014, 18:43
Сергей Борщ, мое предложение, скорее, как еще один вариант
kt368, все там будет нормально, для IAP есть куча примеров под это семейство
Леонид Иванович
Jun 16 2014, 21:27
Цитата(kt368 @ Jun 14 2014, 21:25)

большой объём калибровочных данных, около 100 кБ
Можно кратко рассказать, что это за калибровочные данные? Ничего личного, пацаны интересуются.
Разрабатывается прибор для измерения полного импеданса (как модуля, так и фазы) биологического объекта по тетраполярной методике со следущими характеристиками:
диапазон модулей имзмеряемого импеданса 100...1500 Ом;
диапазон фаз имзмеряемого импеданса 0...-60°;
амплитуде зондируемого тока 0.5...1 мА;
диапазон измерительных частот 1 кГц...5 МГц.
Про погрешность измерения пока говорить рановато, понимаю что 5% не достичь, т.к. очень много паразитных параметров - например, по ТЗ на частоте 5 МГц придётся измерять фазу RC-цепочки, составленной из параллельно соединённых сопротивления в 200 Ом и конденсатора в 5 пФ, при этом модуль этой цепочки будет равен 199.9 Ом, а фаза -1.8°, аналоговой части устройства будет сложновато это адекватно засечь, при том что измерительные электроды подключаются к прибору коаксиальными кабелями длинной около 1м каждый, очень много паразитной гадости набегает. Ясное дело, что кабели согласованы как по входу, так и по выходу, но всё-же.
Прибор основан на измерителе отношения амплитуд и сдвига фаз AD8302. Для оцифровки его выходного сигнала применён 24-х битный АЦП PCM4202. Результаты преобразования усредняются по 2^10 измерениям, но более 16 реальных разрядов извлечь не получается, хотя и питание хорошо отфильтровано малошумящими LDO, и согласование выхода AD8302 со входом АЦП выполнено на качественных ОУ LM833 и THS4531. В общем 16 бит достаточно, но из-за широкой полосы измерительных частот и параметров измеряемых нагрузок, производится калибровка на 20-и частотах, логарифмически распределённых в измерительном диапазоне. Калибровка выполняется для 200 нагрузок, представляющих собой комбинацию одного из 10-и резисторов в диапазоне от 100 до 1500 Ом и 20-и конденсаторов в диапазоне от 10 пФ до 20 нФ.
Также, возможно ошибочно для канала измерения падения напряжения на объекте был выбран разностный усилитель AD8274, т.к. он имеет заметный подъём АЧХ на частотах выше 500 кГц, и запаздывание фазы сигнала, для измерительных целей приходится их компенсировать соответствующими корректировками АЧХ и ФЧХ в канали измерения тока через объект.
В общем, кому интересно, вот изначальные схемы и платы, но на обе платы (цифровая и аналоговая) дополнительно допаяно несколько дополнительных RC-цепочек и электролитических конденсаторов по питанию, что не обозначено в схеме. Здесь нет только схем и плат выносных активных электродов, если кому очень нужно, могу выслать.
З.Ы. прошу сильно не критиковать, было бы больше время - многие моменты поменял бы, наловил уже с некоторыми узлами багов.
У меня возник вопрос относительно использования сохранённых во флеши калибровочных данных.
Допустим, у меня сохранена переменная по заранее (при компиляции) неизвестному адресу, который рассчитывается при калибровке и сохраняется по заранее известному адресу 0xabcd. Теперь я перезапитал МК и хочу использовать эту переменную в расчётах (ясное дело, эта область памяти будет read-only). Сначала я считываю адрес, по которому она расположена (он сохранён во флеши по адресу 0xabcd), сохраняю его в регистр adress. Теперь я хочу чтоб в функции объявлялась эта переменная, и указывалось что она расположена по адресу, сохранённому в регистре adress. Как (если можно) такое сделать?
smalcom
Jun 18 2014, 22:40
Код
const uint32_t& cal_data = reinterpret_cast<uint32_t*>address;
можно и проще
*address или address[0]
Сергей Борщ
Jun 19 2014, 06:12
Цитата(kt368 @ Jun 19 2014, 01:05)

Как (если можно) такое сделать?
Какой язык программирования вы используете? Если C, то вам стоит почитать про указатели. Эти знания вам пригодятся еще очень много-много раз. Информации по указателям в интернете - море, но пересказывать ее здесь - дело неблагодарное.
Язык С, указатели в программе использую довольно часто.
Точно, по-идее просто объявить указатель и в программе инициализировать его адресом моей переменной, находящейся во флеш. И обращаться к переменной по указателю. Что-то я ночью тупил.
Спасибо!
toweroff
Jun 20 2014, 13:24
Проще создать тип-стркутуру, в которой будут собраны вместе все ваши переменные
Потом создать указатель на эту структуру и инициализировать его адресом начала расположения во флеш
Обращаться примерно так:
Код
typedef struct {
int var1;
int var2;
} my_struct;
my_struct *pS = 0xXXXXXXXX;
pS->var1 = 1;
pS->var2 = 2;
Да, именно так я и сделал. Всё работает, вроде-бы.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.