- •Микроконтроллеры msp430 Введение
- •1. Центральный процессор msp430
- •1.1. Адресное пространство микроконтроллеров msp430f1xx
- •1.2. Регистровый файл
- •1.3. Байтовая и словная формы инструкций.
- •1.4. Режимы адресации
- •1.4.1 Регистровая адресация
- •1.4.2. Индексная адресация
- •1.4.3 Символьная адресация
- •1.4.4 Абсолютная адресация
- •1.4.5. Косвенная адресация
- •1.4.6. Косвенная адресация с автоинкрементом
- •1.4.7 Непосредственная адресация
- •2. Система команд msp микроконтроллеров
- •2.1. Двухадресные команды
- •2.2 Одноадресные команды
- •2.3 Команды переходов
- •2.4. Эмулируемые команды
- •3. Периферийные устройства микроконтроллеров msp430f1xx
- •3.1 Внешние выводы микроконтроллера msp430f149
- •3.2 Система прерываний
- •3.3 Система тактирования
- •3.4 Сторожевой таймер
- •3.5 Аппаратный умножитель
- •3.6 Порты ввода/вывода
- •3.7 Таймер a3
- •3.8 Таймер b7
- •3.9 Интерфейс usart
- •3.9.1 Режим uart
- •3.9.1.1 Передача данных
- •3.9.1.2 Прием данных
- •3.9.1.3 Поддержка коммуникации в многопроцессорных системах
- •3.9.1.4 Обнаружение стартового бита при приеме
- •3.9.1.5 Скорость передачи
- •3.9.1.6 Регистры usart
- •3.9.2 Режим spi
- •3.9.3 Режим i2c
- •3.9.3.1 Общие сведения о шине i2c
- •3.9.3.2 Режимы работы usart в режиме i2c
- •3.9.3.3 Арбитраж
- •3.9.3.4 Тактирование i2c модуля
- •3.9.3.4 Инициализация модуля i2c
- •3.9.3.5 Регистры модуля usart в режиме i2c
- •3.10 Аналоговый компаратор
- •3.11 Аналого-цифровой преобразователь adc12
- •3.12 Flash контроллер
- •3.12.1 Стирание Flash памяти
- •3.12.2 Запись Flash памяти
- •3.12.3 Регистры Flash контроллера
- •3.13 Цифро-аналоговый преобразователь
- •Контроллер dma
3.12.2 Запись Flash памяти
Запись Flash памяти можно осуществлять в режимах байт/слово или блоком, состоящим из 64 байт. Режим записи памяти определяется состоянием бита BLKWRT (Block Write) регистра управления. Программа, осуществляющая запись побайтно/пословно, может располагаться как во Flash памяти, так и в ОЗУ. Запись блока данных может осуществляться только из подпрограммы, расположенной в ОЗУ. Разрешение записи данных во Flash память производиться с помощью бита WRT (Write) регистра управления.
Для записи байта/слова из Flash памяти необходимо выполнить следующие действия:
Запретить все прерывания и сторожевой таймер.
Настроить тактирование Flash контроллера.
Очистить LOCK бит.
Установить бит WRT.
Записать данные по требуемому адресу с помощью словной или байтовой формы инструкции.
Сбросить бит WRT и, если требуется, разрешить прерывания, сторожевой таймер и установить LOCK бит.
Для записи байта/слова из ОЗУ необходимо выполнить следующие действия:
Запретить все прерывания и сторожевой таймер.
Дождаться, пока состояние бита BUSY не станет равно 0.
Настроить тактирование Flash-контроллера и сбросить бит LOCK
Установить бит WRT.
Записать в память слово или байт
Дождаться, пока состояние бита BUSY не станет равно 0.
Сбросить бит WRT и, если требуется разрешить прерывания, сторожевой таймер и LOCK бит.
Время записи одного слова/байта может составить несколько миллисекунд. Существенно сократить это время можно, используя блочный метод записи. Для записи блока данных в память необходимо выполнить следующие действия:
Выполнить пункты 1..3 алгоритма записи байта/слова.
Установить биты WRT и BLKWRT.
Записать требуемые данные.
Дождаться, пока бит регистра управления WAIT не станет равным 0.
Проверить, достигнута ли граница 64-ти байтного блока. Если нет – перейти к п.3.
Сбросить бит BLKWRT в 0.
Дождаться, пока бит BUSY не станет равен 0.
Если требуется запись нового блока перейти к пункту 2.
Сбросить бит WRT и, если требуется, разрешить прерывания, сторожевой таймер и LOC бит.
В том случае, если программа исполняется из ОЗУ и бит BUSY =1, любой доступ к Flash памяти при сброшенном бите WRT аппаратно взводит бит ACCVIFG регистра управления Flash контроллера, что при установленном бите ACCVIE регистра IE1 (см. п. 3.2) вызовет прерывание с вектором, расположенным по адресу FFFCh. Если при всем этом бит WRT=1, поведение процессора непредсказуемо.
В том случае, если необходимо по той, или иной причине преждевременно остановить процесс записи/стирания программа может взвести бит EMEX регистра управления, после чего текущая операция завершается безаварийным образом.
3.12.3 Регистры Flash контроллера
Все регистры управления Flash контроллера – 16-ти битные регистры, защищенные паролем и доступные как для записи, так и для чтения. Во всех регистрах старший байт содержит поле пароля, а младший байт – содержит управляющие биты. К регистрам необходимо обращаться только с помощью словных форм инструкций. При этом для операции записи старший байт должен содержать код пароля – 0A5h, в противном случае аппаратно устанавливается бит KEYV регистра управления и генерируется сброс микроконтроллера. При чтении старший байт регистров всегда содержит код 96h. Т.к. коды в старшем байте регистров управления различны при записи и чтении следует избегать обращения к этим регистрам с помощью команд типа чтение-модификация-запись, таких например, как bis, bic.
Регистры модуля Flash контроллера представлены в таблице 17.
Таблица 17
-
Имя
Назначение регистра
Адрес
Нач.значен.
FCTL1
Регистр управления 1
128h
9600h
FCTL2
Регистр управления 2
12Ah
9642h
FCTL3
Регистр управления 3
12Ch
9618h
IE1
Регистр разрешения прерываний
0h
0
FCTL1 (Flash Control 1) – содержит биты управления Flash контроллера.
15 8
-
FWKEY
7 6 5 3 2 1 0
-
BLKWRT
WRT
-
MERAS
ERASE
-
Биты 15..8 – FWKEY (Flash Write Key) – flash-ключ записи. Поле содержит пароль доступа к регистру. При записи поле должно содержать код 5Ah, при чтении поле содержит код 96h.
Бит 7 – BLKWRT (Block Write) – запись блока. Установка/сброс этого бита разрешает/запрещает режим блочной записи данных в Flash память. Программная установка бита EMEX автоматически сбрасывает этот бит.
Бит 6 – WRT (Write) – запись. Установка/сброс этого бита разрешает/запрещает режим записи в Flash память. Программная установка бита EMEX автоматически сбрасывает этот бит.
Биты 5..3 – зарезервированы.
Бит 2 – MERAS (Mass Erase) - массовое стирание. Совместно с битом ERASE определяет режим стирания Flash памяти. Программная установка бита EMEX автоматически сбрасывает этот бит.
Бит 2 – ERASE – стирание. Совместно с битом MERAS определяет режим стирания Flash памяти. Программная установка бита EMEX автоматически сбрасывает этот бит.
-
MERAS
ERASE
Режим
0
0
Режим стирания выключен
0
1
Стирание сегмента
1
0
Стирание всей памяти программ
1
1
Стирание памяти программ и информационной памяти
Бит 0 – зарезервирован.
FCTL2 (Flash Control 2) – содержит биты управления Flash контроллера.
15 8
-
FWKEY
7 6 5 0
-
FSSEL1, 0
FN5..0
Биты 15..8 – FWKEY (Flash Write Key) – flash-ключ записи. Поле содержит пароль доступа к регистру. При записи поле должно содержать код 5Ah, при чтении поле содержит код 96h.
Биты 7,6 – FSSEL (Flash controller clock Source Select) – выбор тактирования Flash контроллера. По умолчанию биты содержат код 01b.
-
FSSEL1
FSSEL0
Источник
0
0
ACLK
0
1
MCLK
1
0
SMCLK
1
1
SMCLK
Биты 5..0 – FN (Flash controller clock divider Number) – делитель частоты тактирования Flash контроллера. С помощью этих бит назначается делитель частоты, выбранной битами FSSEL. При этом действительный коэффициент деления определяется как FN+1. Т.е. значение FN=0 – задает коэффициент делении 1, FN=1 – коэффициент деления 2 и т.д. Частота тактирования Flash контроллера должна находиться в пределах 257 – 476 kHz. По умолчанию биты содержат код 000010b – т.е. коэффициент деления 3.
FCTL3 (Flash Control 3) – содержит биты управления Flash контроллера.
15 8
-
FWKEY
7 6 5 4 3 2 1 0
-
-
EMEX
LOKC
WAIT
ACCVIFG
KEYV
BUSY
Биты 15..8 – FWKEY (Flash Write Key) – flash-ключ записи. Поле содержит пароль доступа к регистру. При записи поле должно содержать код 5Ah, при чтении поле содержит код 96h.
Биты 7,6 – зарезервированы.
Бит 5 – EMEX (Emergency Exit) - аварийный выход. Программная установка этого бита останавливает процесс стирания/записи Flash памяти.
Бит 4 – LOCK – блокировка. Установка/сброс этого бита блокирует/разблокирует возможность стирания и записи Flash памяти. По умолчанию установлен в 1.
Бит 3 – WAIT – ожидание. Бит доступен только для чтения. Устанавливается аппаратно для информирования о готовности Flash памяти к записи нового байта/слова. По умолчанию установлен в 1.
Бит 2 – ACCVIFG – (Access Violation Interrupt Flag) – флаг прерывания нарушения доступа к Flash памяти. Устанавливается аппаратно при доступе к Flash памяти во время стирания/записи. Сбрасываться должен программно.
Бит 1 – KEYV – (Flash security Key Violation) – ключ нарушения безопасности Flash. Устанавливается аппаратно, если при записи данных в регистр управления Flash контроллера был задан неверный пароль. Сбрасываться должен программно.
Бит 0 – BUSY – генератор Flash контроллера занят. Устанавливается/сбрасывается аппаратно для индикации состояния тактового генератора Flash контроллера – занят/готов к работе.
IE1 (Interrupt Enable 1) – содержит бит разрешения прерывания при установки флага ACCVIFG (см. п.3.2).
ПРИМЕР
Содержимое блока ОЗУ с начальным адресом 400h, записать в Flash сегмент данных с начальным адресом 1000h. Тактовая частота MCLK = 8 MHz.
Для удобства работы по программированию Flash-памяти разработаем универсальную программу, программирующую любой сектор содержимым определенного блока ОЗУ. Для этого в подпрограмму перед вызовом необходимо передать параметры: начальный адрес источника данных (ОЗУ) через регистр R12 и адрес сегмента программируемой Flash памяти через регистр R14. Для более быстрого процесса программирования будем использовать блочный метод. Для этого разрабатываемая подпрограмма должна выполнить следующие действия:
скопировать код, собственно выполняющий операции программирования, из Flash памяти программ в ОЗУ;
отдать управление на подпрограмму в ОЗУ;
задать режим работы Flash контроллера;
стереть заданный сегмент Flash памяти;
запрограммировать сегмент Flash памяти;
вернуться в основную программу.
При копировании кода подпрограммы в ОЗУ необходимо позаботиться о том, чтобы данная область не была занята данными, с которыми оперирует основная программа. Поэтому, безопасное копирование можно осуществить в стековую область памяти с адресами меньшими, чем текущее содержимое указателя стека SP.
Тактирование Flash контроллера будем осуществлять от частоты MCLK. Потребуем, чтобы тактовая частота Flash контроллера составляла 400 kHz, тогда делитель частоты должен содержать код 8000 kHz/400 kHz – 1 =19.
Для удобства работы с подпрограммой желательно, чтобы она сама определяла размер сегмента при программировании. Это можно определить по адресу сегмента Flash памяти, переданному в подпрограмму через R14. Если этот адрес меньше 1100h, значит размер сегмента 128 байт (2 блока по 64 байт), в противном случае размер 512 байт (8 блоков по 64 байта).
#include <msp430x14x.h>
ORG 2000h
main: mov #WDTPW+WDTHOLD, &WDTCTL ; запрет WatchDog
mov #0A00h, SP ; установка указателя стека
. . .
mov #400h, R12 ; начальный адрес источника
mov #1000h, R14 ; начальный адрес Flash сегмента
call #SectProg ; вызов подпрограммы программирования
. . .
; *****************************************
; Подпрограмма программирования сегмента
;******************************************
SectProg:
push SR ; сохраняем статусный регистр
dint ; запрещаем прерывания
mov SP, R13 ; настраиваем указатель копирования приемника
sub #2, R13 ; на два байта ниже указателя стека
mov #WriteEnd+2, R15 ; настраиваем указатель копирования источника
;
spr1: decd R13 ; цикл копирования подпрограммы WriteStart
decd R15 ; в ОЗУ от старших адресов к младшим
mov @R15, 0(R13)
cmp #WriteStart, R15
jne spr1
;
mov #2, R15 ; контроль размера сегмента,
bic #3Fh, R14 ; если Info Flash – R15= 2 блока,
cmp #1100h, R14 ; иначе R15= 8 блоков
jlo spr2
mov #8, R15
spr2: call R13 ; передача управления в ОЗУ
pop SR ; восстановление режима прерывания
ret
; **************************************
; Код, копируемый в ОЗУ
WriteStart:
; Стирание сегмента
ws1: bit #BUSY, &FCTL3 ; ожидание готовности Flash контроллера
jnz ws1
mov #FWKEY+FSSEL0+19, &FCTL2 ; настройка частоты Flash контроллера
mov #FWKEY, &FCTL3 ; сброс LOCK бита
mov #FWKEY+ERASE, &FCTL1 ; режим стирания сегмента
mov #0, 0(R14) ; инициация стирания сегмента
ws2: bit #BUSY, &FCTL3 ; ожидание готовности
jnz ws2
; Программирование сегмента
ws3: mov #FWKEY+BLKWRT+WRT, &FCTL1 ; режим блочной записи
mov #64, R13 ; счетчик байт в блоке
ws4: mov @r12+, 0(R14) ; запись данных во Flash
incd R14 ; инкремент указателя Flash
ws5: bit #WAIT, &FCTL3 ; запись произведена?
jz ws5
decd R13 ; декремент счетчика записей в блоке
jne ws4 ; блок записан ?
mov #FWKEY, &FCTL1 ; сброс записи блока
ws6: bit #BUSY, &FCTL3 ; Flash контроллер готов?
jnz ws6
dec r15 ; все блоки записаны ?
jne ws3 ; если нет – ветвление,
WriteEnd: ret ; иначе - конец подпрограммы
. . .
ORG 0FFFEh
DC16 main
END
Следует заметить, что подпрограмма программирования Flash занимает 78 байт ОЗУ, использует только регистры R12…R15 и может использоваться как библиотечная функция для программ, написанных на языке C.
