![]() ![]() ![]() ![]() ![]()
Раздел: Документация
0 ... 179 180 181 182 183 184 185 ... 195 14.5. Самопрограммирование микроконтроллеров семейства Меда 14.5.1. Общие сведения Все микроконтроллеры семейства имеют возможность самопрограммирования, т. е. самостоятельного изменения содержимого своей памяти программ. Эта особенность позволяет создавать на их основе очень гибкие системы, алгоритм работы которых будет меняться самим микроконтроллером в зависимости от каких-либо внутренних условий или внешних событий. Во всех микроконтроллерах семейства, за исключением модели ATmega48x, вся область памяти программ логически разделена на две секции — секцию прикладной программы (Application Section) и секцию загрузчика (Boot Loader Section). Изменение памяти программ осуществляется программой-загрузчиком, расположенной в одноименной секции. Для загрузки нового содержимого памяти программ, а также для выгрузки старого программа-загрузчик может использовать любой интерфейс передачи данных (USART, SPI, TWI), имеющийся в составе конкретного микроконтроллера. Сразу отмечу, что загрузчик может изменять содержимое обеих секций. Это позволяет ему модифицировать собственный код и даже удалять себя из памяти, если надобность в нем отпадет. Уровень доступа (чтение/запись) к каждой из секций задается пользователем с помощью ячеек защиты BLB02:BLB01 и BLB12:BLB11, описанных в подразделе 14.1.1 этой главы (см. Табл. 14.3 и Табл. 14.4). В модели же ATmega48x изменение содержимого памяти программ может быть осуществлено из любого ее места, т. е. секцией загрузчика, по сути дела, является вся память программ. Переход к программе-загрузчику может осуществляться различным образом. В частности, она может быть вызвана из основной программы командами CALL/JMP. Другим способом является перемещение вектора сброса в начало секции загрузчика. В этом случае запуск программы-загрузчика будет осуществляться автоматически после каждого сброса микроконтроллера. Положение вектора сброса определяется состоянием конфигурационной ячейки BOOTRST. Если в ней содержится 1, вектор сброса располагается в начале памяти программ, по адресу $0000. При запрограм-мированнной ячейке (0) вектор сброса располагается в начале секции загрузчика (адреса — см. Табл. 14.21). Размер секции загрузчика и соответственно размер секции прикладной программы практически во всех микроконтроллерах задается с помощью двух конфигурационных ячеек — BOOTSZ1: BOOTSZO. Исключение составляют лишь модели ATmega48x, в которых разделение на секции отсутствует как таковое. Возможные конфигурации памяти программ всех микроконтроллеров семейства, кроме указанных моделей, приведены в Табл. 14.21. Таблица 14.21. Конфигурация памяти программ
14.5.2. Области RWW и NRWW Помимо разбиения памяти программ на секции, имеется (опять же, кроме моделей ATmega48x) и другое разделение памяти программ. Вся память программ разбита на две области фиксированного размера, называемые «чтение при записи» (Read-While-Write — RWW) и «нет чтения при записи» (No Read-While-Write — NRWW). Размеры этих областей для всех микроконтроллеров семейства приведены в Табл. 14.22. Таблица 14.22. Области RWWhNRWW
Отличие между этими областями заключается в различном поведении центрального процессора при изменении расположенных в них данных: •во время выполнения операции стирания или записи страницы памяти программ, расположенной в области RWW, процессор может осуществлять чтение из области NRWW; •во время выполнения операции стирания или записи страницы памяти программ, расположенной в области NRWW, процессор останавливается до окончания этой операции. Таким образом, во время изменения содержимого страницы памяти программ, расположенной в области RWW, чтение этой области запрещено. Попытка обратиться во время программирования к коду, находящемуся в области RWW (в результате выполнения команд CALL/JMP/LPM или в результате прерывания), может привести к непредсказуемым последствиям. Во избежание этого следует либо запретить прерывания, либо перенести таблицу векторов прерываний в секцию загрузчика, которая всегда находится в области NRWW. Для определения, разрешено чтение из области RWWkhh нет, предназначен флаг RWWSB регистра SPMCR (см. ниже). Флаг, установленный в 1, означает, что область RWW заблокирована для чтения. По окончании операции программирования флаг RWWSB должен быть сброшен программно (см. описание регистра SPMCR). Напротив, код, расположенный в области NRWW, может быть считан во время изменения страницы памяти программ, расположенной в облас- 0 ... 179 180 181 182 183 184 185 ... 195 |