Раздел: Документация
0 ... 181 182 183 184 185 186 187 ... 195 ZPCMSB ZPAGEMSB 1 0
Адрес страницы в памяти Память программ Страница Адрес ячейки на странице Страница 16-битное слово
L I I .Z.D L \£..IX> \ L\oH \ LW.Ll Z. Iс Примечание. Биты Z17 и Z16 располагаются в регистре RAMPZ. PCWORD: 00 01 02 PAGEEND Рис. 14.18. Адресация памяти программ при использовании команды SPM Изменение памяти программ Изменение содержимого памяти программ осуществляется в следующей последовательности: 1.Заполнение временного буфера страницы новым содержимым. 2.Стирание страницы. 3.Перенос содержимого буфера в память программ. Следует заметить, что стирание страницы может выполняться как после заполнения буфера, так и перед его заполнением. Однако, если необходимо изменить только часть страницы, приведенный порядок действий является, по понятным причинам, единственно возможным. В этом случае содержимое ячеек, не требующих изменения, сохраняется в буфере перед очисткой страницы. Для определения момента окончания выполнения операций можно либо опрашивать состояние флага SPMEN регистра SPMCR, дожидаясь его сброса, либо воспользоваться прерыванием «Готовность SPM». Это прерывание генерируется все время, пока флаг SPMEN сброшен. В последнем случае таблица векторов прерываний должна находиться в секции загрузчика, а это прерывание должно быть разрешено установкой флага SPMIE регистра SPMCR. Для стирания страницы памяти программ необходимо занести адрес страницы в регистр Z (секция PCPAGE), записать значение xOOOOOl 1 в регистр SPMCR и в течение последующих четырех тактов выполнить команду SPM. Содержимое регистров R1 и R0 при этом игнорируется. Для занесения слова команды в буфер следует загрузить адрес ячейки в регистр Z (секция PCWORD), а код операции — в регистры R1:R0. После этого необходимо записать значение xOOOOOl 1 в регистр SPMCR и в течение последующих четырех тактов выполнить команду SPM. Очистка буфера осуществляется автоматически, по окончании записи страницы, либо вручную, записью лог. 1 в бит RWWSRE регистра SPMCR. Следует заметить, что запись по одному и тому же адресу в буфере невозможна без его очистки. Запись содержимого буфера в память программ осуществляется аналогично. В регистр Z (секция PCPAGE) заносится адрес страницы, в регистр SPMCR записывается значение xOOOOlOl, и в течение последующих четырех тактов выполняется команда SPM. Содержимое регистров R1 и R0 при этом игнорируется. Изменение ячеек защиты загрузчика Изменение ячеек защиты загрузчика BLB12:BLB11 и BLB02:BLB01 также осуществляется командой SPM. Для этого необходимо загрузить в регистр R0 требуемое значение в соответствии с Рис. 14.19 (сброшенный бит означает программирование соответствующей ячейки).
Рис. 14.19. Содержимое R0 при изменении ячеек защиты загрузчика После этого необходимо записать значение xOOOlOOl в регистр SPMCR и в течение последующих четырех тактов выполнить команду SPM. Содержимое регистра Z при этом игнорируется, однако для совместимости с будущими устройствами рекомендуется записывать в него значение $0001. Во время программирования ячеек защиты можно обращаться к любой области памяти программ. Чтение конфигурационных ячеек и ячеек защиты Помимо программирования микроконтроллера, загрузчик может также считывать содержимое конфигурационных ячеек и ячеек защиты. Так, для чтения байта защиты следует загрузить в регистр Z число $0001, записать в регистр SPMCR значение х0001001 и в течение трех последующих тактов выполнить команду LPM. В результате содержимое байта защиты будет занесено в заданный регистр общего назначения. Соответствие битов регистра ячейкам приведено на Рис. 14.1. Чтение конфигурационных байтов осуществляется аналогично. В регистр Z загружается адрес байта ($0000 — младший байт, $0003 — старший байт, $0002 — дополнительный байт), после чего в регистр SPMCR следует записать значение х0001001 и в течение трех последующих тактов выполнить команду LPM. В результате выполнения команды содержимое выбранного байта конфигурации будет занесено в регистр общего назначения. Соответствие битов регистра конфигурационным ячейкам — см. Табл. 14.5. Пример реализации программы-загрузчика Ниже приведен пример реализации программы-загрузчика, осуществляющей простое копирование страницы памяти программ из ОЗУ в FLASH-память. Этот пример предназначен исключительно для иллюстрации возможностей самопрограммирования микроконтроллеров семейства, поэтому в нем отсутствуют некоторые элементы, обязательные в реальной программе. В частности, отсутствует такая важная вещь, как обработка ошибок. Кроме того, предполагается, что прерывания запрещены или что таблица векторов размещена в секции загрузчика. ; Адрес 1-го байта в ОЗУ передается в указателе Y ; Адрес 1-го байта в FLASH-памяти передается в указателе Z .equ PAGESIZEB = PAGESIZE*2; Размер страницы в байтах .org SMALLBOOTSTART Write page: ; Стереть страницу ldi spmcrval, (1«PGERS) I (1«SPMEN) ; Разрешить адресацию области RWW ldi spmcrval, (1«RWWSRE) I (1«SPMEN) call Do spm ; Передать данные из ОЗУ в буфер страницы ldi looplo,low(PAGESIZEB); Инициализировали счетчик байтов ldi loophi,high(PAGESIZEB) Wrloop: Id r0,Y+ Id rl,Y+ ldi spmcrval, (1«SPMEN) call Do spm 0 ... 181 182 183 184 185 186 187 ... 195
|