Флэш-память в микроконтроллере 8051F340 стирается

Ну, я надеюсь, что этот вопрос подходит для Stackoverflow (если иначе, я уже хочу извиниться)

У меня есть микроконтроллер can C8051F340 от Silabs. Я написал небольшой интерфейс, который хранит информацию в энергонезависимой флэш-памяти от УК. Теперь, как и в описании, я сохраняю все данные между адресами 0x0200 - 0x0300. Чтобы скопировать туда свои данные, я просто использую memcpy.

char xdata *ptr_selection       = 0x0210;
// Some other code here
memcpy (ptr_selection, writeBuffer, sizeof (writeBuffer));

Что ж, само копирование работает хорошо (я посмотрел на флэш-память, и она правильно сохранила мои данные). Если я сейчас отключу свой UC и снова подключу его примерно через 5 секунд, данные все еще будут там. Но если я оставлю его отключенным, мои данные более или менее «сбрасываются» - это означает, что они получают каждый раз почти одни и те же «значения сброса». так что я делаю неправильно? Я имею в виду, что данные флэш-памяти не являются энергозависимыми или я что-то не так понял?


person Toby    schedule 20.11.2011    source источник


Ответы (2)


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

Для записи во флэш-память вам необходимо следовать определенному протоколу, чтобы разблокировать схему программирования флэш-памяти, затем стереть область, в которую вы будете записывать, а затем записать байты с помощью инструкций MOVX, как описано в разделе 12 таблицы данных.

В этом примечании по применению Silicon Labs "Запись во флэш-память из микропрограммы" описан процесс в деталях.

person tcrosley    schedule 20.11.2011
comment
Да, согласно даташиту, мне нужно его разблокировать (там описана процедура), но как мне выбрать пункт назначения? Я имею в виду, что может быть только один адрес 0x0200?! И как мне это сделать на Си? Там в любом случае? - person Toby; 21.11.2011
comment
Ладно, помогла ссылка на примечание к применению от silabs. Там я попытался реализовать пример для F340 в своем коде. Но на самом деле, если я вызываю функцию FLASH_ByteWrite, ничего не происходит -> если я отлаживаю и вхожу в нее, я вижу, что второй параметр вообще не изменяется... так что, например. если я вызову FLASH_ByteWrite(0x0200, 0xFF), а затем войду в функцию, переменная для второго параметра будет равна нулю в самой функции..? - person Toby; 21.11.2011
comment
Что касается вашего вопроса об инструкции MOVX, в примечании к приложению говорится: Когда бит PSWE (PSCTL.0) установлен на логическую 1, MOVX записывает коды операций в целевую флэш-память, а не во внешнюю память (XRAM). Когда и PSWE, и PSEE (PSCTL.0 и PSCTL.1) установлены на логическую 1, коды операций записи MOVX стирают страницу флэш-памяти, содержащую целевой адрес. - person tcrosley; 21.11.2011
comment
Не уверен, почему ваш вход в вызов функции будет неправильным параметром. Однако я сомневаюсь, что вы используете 0x200 для флэш-адреса для данных, который обычно находится прямо в середине места, где находится ваш код, если только вы не изменили свой скрипт компоновщика. Вы должны выбрать адрес в верхней части вашей флэш-памяти, например 0xF000. - person tcrosley; 21.11.2011
comment
Да, вы правы, 0x0200 было не лучшей идеей, но согласно техническому описанию и AP 0x2000 должно быть правильным. На самом деле вы очень помогли мне в продвижении вперед - у меня все еще осталась одна странная проблема. Я использую в качестве примера функции из AP для F340. Он компилируется без проблем, но, как я уже сказал, у него есть проблемы с передачей параметров функции... Например: если я вызываю функцию так, как она задумана, она не работает - если я создаю глобальную переменную для передачи аргументов функции, она работает ....Я не знаю, почему это...??? - person Toby; 21.11.2011
comment
Хорошо, теперь это работает, я все еще не могу отлаживать прямо в функции, но, по крайней мере, если я смотрю на память, я вижу, что она изменяется - так что для меня это достаточно близко ^^ . Спасибо за вашу помощь!! - person Toby; 21.11.2011

Флэш-память не похожа на обычную память SRAM, память SDRAM.

Вы не можете просто написать ему. Максимум, что можно - читать с него как с обычной памяти (только если у вас NOR flash).

Но если вы хотите записать в него, вы должны в первую очередь стереть его (установить все биты в 1). Только после этого вы можете написать ему. Обычно стирание производится по секторам. Они называются стирающими секторами. См. техническое описание вашего микроконтроллера об их размере.

PS

Согласно паспорту вашего процессора, для записи необходимо использовать специальную инструкцию. Убедитесь, что memcpy использует его внутри.

person fghj    schedule 20.11.2011