|
LPC2103 - сохранение данных во флэш (IAP), Запись во флэш в процессе работы |
|
|
|
May 7 2007, 12:48
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Уже несколько дней пытаюсь разобраться с сохранением данных во флэш памяти (ибо EEPROMа то уже нет  ). Написал в соответствии с документацией необходимые функции для работы с флэш (In Application Programming). Запись происходит успешно, но есть 2 больших"НО": 1. Запись осуществляется в момент запуска приложения, даже не доходя до места вызова соответствующих функций (смотрел в отладчике - указатель еще стоит на main, а во флэш уже данные которые я планировал записать через несколько десятков команд). 2. Если есть переменная типа "const", лежащая по некому адресу внутри сектора флэш куда ведется запись, то это место не перезаписывается. Если кто нибудь использовал флэш в этом или других МК для энергонезависимого хранения данных (ну как епром раньше), буду очень признателен если поможете разобраться с этим. Заранее спасибо.
|
|
|
|
|
 |
Ответов
(1 - 12)
|
May 7 2007, 14:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Юрий Санвальд @ May 7 2007, 15:48)  1. Запись осуществляется в момент запуска приложения, даже не доходя до места вызова соответствующих функций "Само" ничего не происходит. Скорее всего эти данные у вас объявлены как инициализированные константы и они записываются на свои места как и положено одновременно с программой. Цитата(Юрий Санвальд @ May 7 2007, 15:48)  2. Если есть переменная типа "const", лежащая по некому адресу внутри сектора флэш куда ведется запись, то это место не перезаписывается. Естественно. Стирается ведь весь сектор целиком. Вот тут есть статья на эту тему. Я писал кусок кода для 2214 (но они должны быть очень похожи) на основе чьего-то ответа на аналогичный вопрос. Выделил отдельный сектор под изменяемые данные, это позволяет на время перезаписи использовать буфер ОЗУ минимального (а не на весь сектор) размера и не заботится, что затрется что-то лишнее. Использую две структуры - Config_flash и Config_ram. Перед началом работы вызываю ReadConfig(), который копирует из Config_flash в Config_ram. Далее все действия с Config_ram и когда необходимо сохранить изменения - UpdateConfig(). Конечно, этот код все еще несколько кривоват, но для начала вполне сойдет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 8 2007, 05:16
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 8-11-04
Из: Томск
Пользователь №: 1 070

|
Немного не в тему. Сколько времени занимает перезапись минимально возможной области (256 байт). Не нашел в пдф, может кто замерял?
|
|
|
|
|
May 8 2007, 10:10
|
Участник

Группа: Свой
Сообщений: 72
Регистрация: 8-11-04
Из: Томск
Пользователь №: 1 070

|
Цитата(zltigo @ May 8 2007, 09:10)  Не нормируют  , правда для LPC28xx - поминается стирание 400ms. А конкретные замеры ничего не дадут. Время плавать может изрядно и закладываться на измеренные значения нельзя. А если еще добавить к этому, что NXP официально обеспечивает работу только через IAP, что позволяет ему легко и просто при желании FLASH память принципиально менять.... Н-да, несколько печально. Особенно в свете того, что в момент обращения к IAP необходимо запретить прерывания.
|
|
|
|
|
May 8 2007, 11:04
|

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

|
Цитата(iit @ May 8 2007, 13:10)  Н-да, несколько печально. Особенно в свете того, что в момент обращения к IAP необходимо запретить прерывания. Ну насчет прерываний, если посмотрите по ранее приведенной ссылке, то там есть радостный отчет о работе в определенных условиях с разрешенными прерываниями. Ну а вообще - I2C EEPROM стоит копейки, имеет больший ресурс и обслуживается без напряга контроллера - поставить и забыть.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 10 2007, 07:57
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Хм, возможно я уже надоел, но всплыла еще одна неприятность - первая команда по записи сектора через ИАП выполняется успешно (что нужно было записать, то во флэше и лежит), но если потом снова записать в этот сектор, то некоторые биты просто обнуляются П.С. в поиске нашел темы, где обсуждалось подобное( http://electronix.ru/forum/index.php?showt...5593&hl=IAP ) - но решения вопроса там не предлагалось, может кто то сталкивался и решал эту проблему?
Сообщение отредактировал Юрий Санвальд - May 10 2007, 07:59
|
|
|
|
|
May 10 2007, 08:34
|

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

|
Цитата(Юрий Санвальд @ May 10 2007, 10:57)  Хм, возможно я уже надоел, но всплыла еще одна неприятность Ну ссылка на "неприятность" давалась и наступать на грабли вовсе было не обязательно. Цитата но решения вопроса там не предлагалось, может кто то сталкивался и решал эту проблему? Черным по белому там изложены ограниченияя при которых дозапись работоспособна. Проверял. Либо пользуйте, как можно, либо не используйте вообще.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|