Техника самопрограммирования флэш-памяти MSP430
Резюме
Самопрограммируемость Flash становится все более и более важной функцией. Однако при выполнении программирования/стирания Flash памяти программы микроконтроллер не может одновременно выполнять прикладную программу, расположенную в том же массиве памяти. Таким образом, микроконтроллер только с одним встроенным массивом Flash памяти не может одновременно выполнять программу и изменять ее. Проблема может быть решена двумя способами: 1) Команды стирания/программирования Flash памяти перед выполнением должны копироваться в ОЗУ. 2) При выполнении стирания/программирования вычислительное ядро переходит в режим Idle. В данном примере применения описывается, как выполнить операции стирания/программирования Flash памяти, а также приводится необходимое программное обеспечение.
1 Введение
Самопрограммируемость Flash становится все более и более важной функцией. Однако при выполнении программирования/стирания Flash памяти программы микроконтроллер не может одновременно выполнять прикладную программу, расположенную в том же массиве памяти. Таким образом, микроконтроллер только с одним встроенным массивом Flash памяти не может одновременно выполнять программу и изменять ее.
Есть два подхода к решению этой задачи. Первый состоит в том, что команды стирания/программирования Flash памяти перед выполнением копируются в ОЗУ. Второй - в том, что при выполнении стирания/программирования вычислительное ядро переходит в режим Idle.
Все микроконтроллеры семейства MSP430 компании Texas Instruments имеют встроенный контроллер Flash памяти, который позволяет выполнять прикладную программу и изменять содержимое одного и того же модуля Flash памяти.
Этот пример применения описывает способ, который позволяет стирать/программировать Flash память, а также приводятся тексты программных модулей, необходимых для выполнения этих операций.
2 Состав Flash модуля
Состав Flash модуль MSP430:
- Управляющая логика: автомат состояния и задающий генератор управляют стиранием/записью Flash памяти
- Логика защиты Flash: защита от некорректных действий при стирании/записи
- Программируемый источник напряжения: встроенный преобразователь напряжения, который вырабатывающий напряжение, необходимое для программирования Flash памяти
Три 16-разрядных управляющих регистра FCTL1, FCTL2 и FCTL3 полностью управляют Flash модулем (см. рисунок 1). Более детальное описание этих регистров можно найти в руководстве пользователя по микроконтроллерам семейства MSP430 (документ SLAU049).
Рисунок 1. Состав Flash модуля
3 Стирание и программирование Flash памяти
Обычно вычислительное ядро считывает из Flash памяти данные или код прикладной программы. Однако, иногда данные во Flash памяти необходимо изменить при выполнении программы. В течение этой операции стирания-записи (то есть перепрограммирования) Flash памяти управление осуществляется от задающего генератора, имеющегося в модуле Flash. В это время вычислительное ядро не может получить доступа к Flash памяти и, следовательно, программа должна находиться в другом месте, например в ОЗУ, или вычислительное ядро должно перейти в Idle режим. После завершения программирования Flash памяти вычислительное ядро вновь берет управление над ней на себя. Оба эти метода имеют свои преимущества.
В настоящее время микроконтроллеры семейства MSP430 имеют один модуль Flash для хранения данных и прикладной программы. Это означает, что при программировании Flash памяти векторы прерываний недоступны и никакие запросы на прерывание не могут быть обработаны. Поэтому, при модификации Flash памяти все источники прерывания, вплоть до сторожевого таймера, должны быть отключены. Это можно сделать при помощи программы, приведенной на рисунке 2.
dint ; блокировка всех маскируемых прерываний
clr.b &IE1 ; блокировка NMI, ACCV и OF прерываний
mov #5A80h, &WDTCTL ; блокировка сторожевого таймера
Рисунок 2. Программа блокировки всех прерываний и сторожевого таймера
3.1 Программирование Flash памяти с копированием прикладной программы в ОЗУ
При программировании Flash памяти ОЗУ - единственная память, из которой вычислительное ядро может выполнять прикладную программу. Пример программы, приведенный на рисунке 3, копирует функцию программирования Flash памяти в стек для выполнения прикладной программы в из ОЗУ. Когда Flash память становится снова доступной, счетчик команд указывает на Flash память и указатель стека восстанавливается. Бит Busy (бит 0 в FCTL3) указывает доступность Flash памяти. В приложении A приведена прикладная программа flash _ram.s43, которая может выполнять три функции:
- стирание одного сегмента
- программирование одного байта
- программирование одного слова
Выполнение программы из ОЗУ позволяет вычислительному ядру работать в процессе изменения Flash памяти. Это позволяет MSP430 выполнять программирование Flash памяти и, например, принимать данные через UART. Конечно, в этой ситуации обнаружение принятых данных может быть реализовано только путем опроса флага принятия данных UART.
MODULE flash_ww
PUBLIC Flash_ww
RSEG CODE
#define _CPU_ 5 /* 5=MSP430F1121, 6=MSP430F149 device */
#include <Std_def.s43>
;***********************************************************************
; Запись во Flash память слова
; ***********************************************************************
; Запись 1 слова во Flash путем копирования небольшой функции (18 байт)
; в ОЗУ при помощи динамической памяти, расположенной в стеке.
; Определение функции: void Flash_ww( int *Data_ptr, int word )
; скрэтч-регистр: R12 = int *Data_ptr
; R14 - int слово
; R13, R15 - общего назначения
; Предположение: При записи Flash не занята
(Flash _ww_start)
; ***********************************************************************
Flash _ww
dint ; защита стека от повреждения
clr.b &IE1 ; блокировка NMI, ACCV и OF прерываний
mov #5A80h, &WDTCTL ; блокировка сторожевого таймера
mov #Flash_ww_end, R13 ; определение конечного адреса и длины
mov #Flash_ww_length, R15 ; функция, которая будет скопирована в ОЗУ
mov #0A500h, &FCTL3 ; LOCK = 0
copy push @R13 ; копирование функции в ОЗУ
decd R13
dec R15
jnz copy
mov SP,R15
mov #0A540h,&FCTL1 ; WRT = 1
call R15 ; вызов из ОЗУ функции записи Flash
mov #0A500h,&FCTL1 ; WRT = 0
mov #0A510h,&FCTL3 ; LOCK = 1
add #2*Flash_ww_length,SP ; обслуживание стека
ret
;-------------------------Функция записи Flash памяти------------------------
Flash _ww_start
mov R14,0 (R12) ; запись байта во Flash память
wait_bf бит #1, &FCTL3 ; ожидание флага занятости
jnz wait_bf
Flash _ww_end
ret
; вычисление номера слова Flash памяти, которое необходимо записать в ОЗУ
Flash _ww_length EQU (Flash _ww_end-Flash_ww_start+2)/2
ENDMOD
Рисунок 3. Программа копирования кода прикладной программы из Flash памяти в стек
3.2 Прямое перепрограммирование Flash памяти
Flash модуль MSP430 имеет уникальную функцию - самопрограммируемость. Эта функция позволяет перепрограммировать Flash память без копирования программы в другую память. Когда памяти в течение перепрограммирования Flash памяти вычислительное ядро выбирает команды из нее, Flash модуль возвращает вычислительному ядру команду 3FFFh (JMP $). Эта команда "зацикливает" вычислительное ядро до тех пор, пока перепрограммирование Flash памяти не будет закончено. По окончании перепрограммирования Flash модуль возвращает следующую команду, и выполнение программы продолжается.
Как можно увидеть из кода программы, приведенной на рисунке 3, это - самый простой способ перепрограммировать Flash память микроконтроллеров семейства MSP430. Однако у этого метода имеется один недостаток - при перепрограммировании Flash памяти вычислительное ядро находится в режиме останова и никакая программа или подпрограмма обработки прерывания не может в это время выполняться. Кроме того, этот метод позволяет перепрограммировать Flash память только байтами или словами (7 бит в FCTL1 сброшен), а значит не может использоваться режим быстрой записи сегментами. Более полные примеры программ для стирания и записи Flash памяти при помощи этой функции приведены в приложении А (файл Flash _idle.c) и приложении В (файл Flash _test.c).
/ ***********************************************************************/
/* Flash _ww */
/* запись одного слова (16 бит) во Flash память*/
/ ***********************************************************************/
void Flash_ww( int *Data_ptr, int word )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540;/* WRT = 1 */
*Data_ptr=word;/* запись слова */
FCTL1 = 0x0A500;/* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
Рисунок 4. подпрограмма остановки вычислительного ядра при перепрограммировании Flash памяти
4 Демонстрационная программа
Было реализовано два метода перепрограммирования Flash памяти:
- программирование Flash памяти из ОЗУ;
- прямое перепрограммирование Flash памяти.
Файл Flash _ram.s43 содержит программу перепрограммирования Flash памяти из ОЗУ, которая написана на ассемблере и может быть вызвана из C компилятора. Файл Flash _idle.c содержит программу прямого перепрограммирования Flash памяти. Эти файлы содержат одинаковые функции:
- void Flash_wb( char *Data_ptr, char byte );
- void Flash_ww( int *Data_ptr, int word );
- void Flash_clr( int *Data_ptr );
Поскольку они имеют одинаковый формат вызова, то они взаимозаменяемы, что и показано на рисунке 5.
Демонстрационной программе необходимы три следующих файла:
- Flash _ram.s43 или Flash _idle.c - содержат функции перепрограммирования Flash памяти
- Flash _test.c - основная программа, которая вызывает функции перепрограммирования Flash памяти
- Flash _var.s43 - программа, показывающая как определить реальные адреса глобальных переменных языка С в области памяти.
Рисунок 5. Окна проектов программирования Flash памяти из ОЗУ и прямого программирования Flash памяти
5 Заключение
В данном примере применения описаны два метода перепрограммирования Flash памяти и приведены примеры их программной реализации. В том случае, когда необходимо обеспечить функционирование вычислительного ядра (например, прием данных при помощи UART), нужно использовать метод перепрограммирования из ОЗУ. При этом методе необходима дополнительная память. Более простой метод состоит в остановке вычислительного ядра при перепрограммировании Flash память. Длительность записи одного слова приблизительно равняется 80 мкс, а одного сегмента - 12 мс.
Пример программы:
|
|
135Kb Исходный фаил |
|
|
RUS Приложение А: файл flash_ram.s43 |
виртуальный сонник, магия для женщин
|