Можно ли использовать флэш-память программы микроконтроллера для хранения пользовательской конфигурации?

9

Многие микроконтроллеры, например PIC18F , имеют флэш-память программ: «Флэш-память программ доступна для чтения и записи во время нормальной работы». Означает ли это, что я могу хранить некоторые пользовательские конфигурации в памяти программы?

student1
источник

Ответы:

12

Да, ты можешь. Я делал это много раз.

Тем не менее, есть некоторые недостатки, связанные с использованием отдельной EEPROM:

  1. Количество записей времени жизни во флэш-память программы значительно меньше данных EEPROM.

  2. Процессор выйдет на обед во время стирания и записи.

  3. Вспышка программы стирается блоками. Вы не можете просто обновить один байт. Я обычно использую схему блочного кэширования, чтобы справиться с этим.

Олин Латроп
источник
Отлично, вы, кажется, как-то знаете, что мой вопрос действительно «зачем нужна EEPROM, в то время как вы можете использовать память программы как для программ, так и для пользовательских данных» :)
student1
Олин, все ли Flash стирается при записи новой версии прошивки в PIC? Есть ли хороший способ предотвратить стирание пользовательской конфигурации (или данных калибровки) во Flash во время загрузки прошивки? Речь идет об удобстве при разработке прошивки. Я предположил бы, что пользовательская конфигурация будет сохранена в самом последнем блоке или Flash.
Ник Алексеев
6
@Nick: Это зависит от программиста PIC, который вы используете. Многие, в том числе и все мои, стирают данные, поэтому данные калибровки будут уничтожены. Я несколько раз писал специальное приложение для программирования, которое считывало данные калибровки, выполняло массовое стирание, а затем выписывало данные калибровки обратно как часть обычного процесса программирования. Некоторые программисты Microchip могут обновлять только части памяти программы. Обратите внимание, что если вы включили защиту кода, программист должен выполнить массовое удаление.
Олин Латроп
На не Гарвардских процессорах (я имею в виду MSP430) вы можете копировать код в ОЗУ, а также переходить в ОЗУ и работать, пока происходит флэш-запись / стирание. Я использовал это для загрузчика, чтобы одновременно писать и получать новые данные с радио.
markrages
@ mark: Да, это также работает на PIC32, где также можно выполнить из оперативной памяти. На самом деле это быстрее.
Олин Латроп
6

Многие PIC18 имеют память EEPROM размером до 1K. К сожалению, PIC18F46J50, на который вы ссылаетесь, нет. Если доступна ЭСППЗУ, то это гораздо лучший выбор, если она достаточно велика для ваших данных, поскольку ЭСППЗУ имеет минимум 1 000 000 циклов стирания / записи, а флэш-память - всего 10 000.

PIC18, как и большинство других микроконтроллеров, использует так называемую архитектуру Гарварда, что означает наличие физически отдельной адресуемой области для программ и данных (т.е. вы можете иметь программный адрес 4 и адрес данных 4, и они не совпадают). Поэтому вы не можете читать или записывать флэш-память, используя обычные методы на C или ассемблере.

Вместо этого в семействе PIC18 вы устанавливаете начальный адрес в 22-битном регистре TBLPTR. Для чтения байтов с флэш-памяти вы используете инструкцию TBLRD. Существует возможность автоматически увеличивать или уменьшать адрес после чтения, вам не нужно делать это вручную.

Для записи во флэш-память необходимо сначала удалить один или несколько 64-байтовых блоков флэш-памяти, которые будут перезаписаны. После повторной установки начального адреса в TBLPTR и значений в некоторых других регистрах для инициализации операции стирания прерывания отключаются, и затем необходимо записать 0x55, а затем 0xAA в регистр; это разблокирует команду стирания и требуется, чтобы предотвратить случайный стирание памяти ошибочным кодом. Наконец, выполняется команда, которая фактически выполняет стирание, с последующим повторным включением прерываний.

Запись во флэш-память аналогична стиранию, за исключением того, что размер блока меньше. Запись фактически выполняется с использованием инструкции TBLWT, которая также позволяет автоматически увеличивать / уменьшать, как инструкция TBLRD.

Помимо сохранения данных конфигурации, запись во флэш-память позволяет обновлять их встроенное ПО в полевых условиях, используя то, что называется «встроенным ПО по беспроводной сети». Вам необходимо иметь фиксированный блок прошивки, обычно в начале памяти программ, который может получать обновление от модуля Bluetooth, Wi-Fi, сотового модуля или даже проводного соединения, и обновлять флэш-память выше определенной точки в программа (например, «забор») с новым кодом. После завершения обновления инициируется сброс и вводится новый код.

Многие другие микроконтроллеры помимо семейства PIC имеют возможность обновлять свою флэш-память; большинство используют некоторую комбинацию регистров конфигурации, указатель адреса и специальные инструкции для выполнения задачи.

tcrosley
источник
Этот метод «прошивки по воздуху» выглядит очень интересно. Устраняет ли это необходимость в системном программировании (ISP)?
ученик1
@ student1 Это не избавляет от необходимости начального программирования микросхемы через интерфейс ISP, потому что вы должны установить микропрограмму на микросхему, чтобы иметь возможность обрабатывать обновления позже. Микроконтроллеры ATmega, используемые на платах Arduino, уже имеют встроенную прошивку такого типа, называемую Bootloader, поэтому вам не нужно использовать интерфейс ISP для загрузки эскизов в Arduino. Однако, если вы хотите обновить сам Bootloader, для этого требуется интерфейс ISP. Этот Bootloader обрабатывает только обновления через USB, поэтому он не является «прошивкой по воздуху».
tcrosley