Перейти к содержанию
    

Прочитать-то просто: int x = nv_parms.seg_a.s.variable;

Но Вы, кажется, не понимаете, как работает флеш. Записать значение по любому адресу в ней можно без проблем, но только один раз и в чистую (все биты равны единице). При попытке повторной записи туда же другого значения старое не затрется - те биты, что были ранее сброшены в ноль, так и останутся. Нужно снова проинициализировать (стереть) память перед записью нового значения, а сделать это можно только со всей страницей целиком, а не с отдельным байтом.

 

пытаюсь после манипуляций описаных выше (в частности flash_write_int16()) прочитать записанное значение

 

int x = nv_parms.seg_a.s.variable;

вывожу 'x' на дисплей: нули((

 

P.S. дисплей выводит правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define __infomem___ Pragma("location=\"INFO\"")

Подмена на __infomem___ прагмы "location="INFO"" . Просто для удобства чтения и модификации. Но тут могут быть зарыты грабли. В частности, этот текст может быть несовместим с вышеописанной процедурой. Надо смотреть распределение флеш памяти для конкретного кристалла. Секция INFO включает в себя сегменты A, B (C, D в зависимости от кристалла)

 

__infomem__ const struct info_mem_s nv_parms

Разместить стуктуру nv_parms типа info_mem_s в памяти в секции INFO. Здесь надо проверить, как расположены в памяти входящие в INFO сегменты INFOA, INFOB (C, D). Компилятор расположит структуру nv_parms в начале секции INFO, а в серии 2хх там расположена секция D, например, в то время как flash_replace16 подразумевает, что данные хранятся в секции В. Можно не париться и прямо указать Pragma("location=\"INFOB\"")

 

flash_write_int16((int *) &(nv_parms.seg_a.s.variable), nv_parms.seg_a.s.variable & ~(1 << 2));

 

>>получается: обявили константу во флеши и затем записали на её место что-то...верно?

Не совсем так. Скорее жестко привязали имя и местоположение структуры к определенному адресу памяти. Делают так, потому что TI специально выделяют зону флеш-памяти именно для этих целей. У нее уменьшен размер страницы и увеличено количество возможных перезаписей по сравнению с основной страницей

 

 

JTAG есть? Давайте ВЕСЬ код, относящися к теме, тип кристалла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказки. Всё заработало. Кристалл F47187

непонятно только почему не работает конструкция

 

void flash_write_int16(int16_t *ptr, int16_t value)
{
   _DINT();
   FCTL3 = FWKEY;                      /* Lock = 0 */
   FCTL1 = FWKEY | WRT;
   *((int16_t *) ptr) = value;         /* Program the flash */
}

 

когда применяю её вместо flash_replace16()

Изменено пользователем Zelepuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказки. Всё заработало. Кристалл F47187

непонятно только почему не работает конструкция

 

void flash_write_int16(int16_t *ptr, int16_t value)
}

 

когда применяю её вместо flash_replace16()

Возможно, потому что вы оставили флеш в режиме записи?

По завершении записи надо дать команды

FCTL1 = FWKEY;

FCTL3 = FWKEY | LOCK;

 

Еще одна вещь, о которой не надо забывать - если собака работает, перед записью во флеш ее надо отключать, а то взбрыкнуть может капитально.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что тут комментировать? Стандартная процедура, о которой говорили выше - сохранить где-то содержимое страницы, стереть ее и записать повторно, за исключением модифицируемой переменной. Просто тут для временного хранения используется другая страница флеши. Имеет ли это смысл? Трудно сказать, разве что катастрофически припрет со свободной RАМ. Все остальное в минусе - временные затраты, энергия, ресурс флеши. Чтобы выбрать оптимальный для Вас вариант, надо знать гораздо больше о количестве сохраняемых переменных, частоте их изменения, и куче других параметров.

 

если предположить что таких переменных для хранения не более десяти. Частота изменения около 15 минут.

 

-наверное лучше написать функцию которая сразу меняет 10 переменных во флеши, чтобы как-то сбереч ресурс флеши?

-при перезаписи каждые 15 минут и количестве циклов флеши 100 000(как у MSP430) получается имеем всего 25000 часов такой работы, после чего флешь загнётся...

 

наверное лучше на какую-то внешнюю ПЗУ перейти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

-при перезаписи каждые 15 минут и количестве циклов флеши 100 000(как у MSP430) получается имеем всего 25000 часов такой работы, после

наверное лучше на какую-то внешнюю ПЗУ перейти.

Не так все плохо. Там 255 ячеек памяти в инфо области, прежде чем ее стирать можно заполнить 25 - 10 блоками настроек в завистимости от их типа, что уже дает 250000-500000 часов работы, а если вы еще заранее знаете, что часть из них будет меняться очень редко, то можно их сгруппироать и выиграть еще больше.

Или поставить кондер побольше по питанию и держать быстро меняющиеся настройки в ОЗУ, а во флеш их писать при пропадании питания.

Изменено пользователем =DS=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не так все плохо. Там 255 ячеек памяти в инфо области, прежде чем ее стирать можно заполнить 25 - 10 блоками настроек в завистимости от их типа, что уже дает 250000-500000 часов работы...

 

можно по подробнее об этом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно по подробнее об этом?

имеется ввиду такая последовательность:

- стереть страницу

- записать данные (10 байт) со смещением 0x00 (начало страницы),

- через 15 мин записать данные (10 байт) со смещением 0x0A,

- через 15 мин записать данные (10 байт) со смещением 0x14,

- ... так 50 раз

- страница заполнилась, стирание всей страницы

 

это для обычной страницы по 512 байт (не INFO),

для INFO размер 64 байта

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...