Микроконтроллеры MSP430
Микроконтроллеры MSP430
Содержание
Введение
. Центральный процессор
MSP430
.1 Адресное пространство
микроконтроллеров MSP430F1xx
.2 Регистровый файл
.3 Байтовая и словная формы
инструкций
.4 Режимы адресации
.4.1 Регистровая адресация
.4.2. Индексная адресация
.4.3 Символьная адресация
.4.4 Абсолютная адресация
.4.5 Косвенная адресация
.4.6 Косвенная адресация с
автоинкрементом
.4.7 Непосредственная
адресация
. Система команд MSP
микроконтроллеров
.1 Двухадресные команды
.2 Одноадресные команды
.3 Команды переходов
.4 Эмулируемые команды
. Периферийные устройства
микроконтроллеров MSP430F1xx
.1 Внешние выводы
микроконтроллера MSP430F149
.2 Система прерываний
.3 Система тактирования
.4 Сторожевой таймер
.5 Аппаратный умножитель
.6 Порты ввода/вывода
.7 Таймер A3
.8 Таймер B7
.9 Интерфейс USART
.9.1 Режим UART
.9.1.1 Передача данных
.9.1.2 Передача данных
.9.1.3 Поддержка коммуникации
в многопроцессорных системах
.9.1.4 Обнаружение стартового
бита при приеме
.9.1.5 Скорость передачи
.9.1.6 Регистры USART
.9.2 Режим SPI
.9.3 Режим I2C
.10 Аналоговый компаратор
.11 Аналого-цифровой
преобразователь ADC12
.12 Flash контроллер
.12.1 Стирание Flash памяти
.12.2 Запись Flash памяти
.12.3 Регистры Flash
контроллера
Введение
Микроконтроллеры
семейства MSP430 - серия 16-ти разрядных микроконтроллеров фирмы Texas Instruments (www.ti.com). Американская фирма TI является
мировым лидером по производству цифровых сигнальных процессоров. Ею также
производятся микроконтроллеры индустриального применения, аналоговые и цифровые
микросхемы широкого применения.
Микроконтроллеры
семейства MSP430 имеют одинаковое 16-разрядное процессорное ядро и
отличаются друг от друга объемом встроенной памяти программ и данных, набором
периферийных устройств, количеством внешних выводов.
Как
и AVR микроконтроллеры, MSP реализует RISC
(Reduced Instruction Set Computer) идеологию (всего 27 базовых команд). Однако, а
отличие от AVR, данная серия построена по фон-неймановской (von Neumann) архитектуре, предполагающей, что память программ и
память данных находятся в одном адресном пространстве. Основными чертами
рассматриваемых микроконтроллеров являются широкий набор встроенных
периферийных устройств, высокая производительность процессора и крайне низкая
мощность потребления, что делает их идеальными для применения в портативных
измерительных индустриальных и биомедицинских приборах.
В
настоящее время имеется 5 групп микроконтроллеров MSP430:
· MSP430C3xx - имеет производительность до 4
миллионов инструкций в секунду (4 MIPS), память программ - ПЗУ до 32 kB, память данных (ОЗУ)- до 1 kB, имеется аппаратная поддержка ЖК индикаторов. В настоящее время эта
серия считается устаревшей и в новых разработках не используется.
· MSP430F1xx - имеет производительность 8 MIPS, Flash память
программ до 60 kB, ОЗУ- до 2 kB (ОЗУ модели MSP430F1610
- 10 kB);
· MSP430F4xx - производительность 8 MIPS, Flash
память программ до 120 kB,
ОЗУ-до 8 kB, имеется аппаратная поддержка ЖКИ;
· MSP430F2xx - производительность 16 MIPS, Flash
память программ до 120 kB,
ОЗУ-до 8 kB, имеет усиленную по отношению к MSP430F1xx периферию;
· MSP430F5xx - новейшая серия, анонсированная во
2 квартале 2008г, имеет производительность до 25 MIPS, Flash память программ до
256 kB, ОЗУ-до 16 kB, имеет усиленную по отношению к MSP430F2xx периферию;
Новейшие микроконтроллеры, имеющие объем встроенной Flash памяти больше 64 kB, оснащены усиленным процессорным
ядром MSP430X, поддерживающим 20-ти разрядную арифметику и имеют
расширенную систему команд. В данном курсе будут рассматриваться только
микросхемы группы MSP430F1xx .
Микроконтроллеры серии MSP430F1xx строятся по модульному принципу, включая в себя набор
однотипных функциональных устройств.
Все микроконтроллеры серии содержат следующие функциональные модули:
память программ типа Flash
;
память данных RAM (Random Access Memory);
- сторожевой таймер (Watch Dog Timer);
- супервизор питания;
аналоговый компаратор;
16-разрядный таймер A с
тремя модулями захвата/сравнения (Capture/Compare);
- перестраиваемый RC - генератор DCO (Digitally Controlled
Oscillator).
Модели микроконтроллеров внутри семейства отличаются друг от друга
объемами встроенной памяти и набором дополнительных периферийных устройств. В
таблице 1 сведены характеристики микроконтроллеров серии MSP430F1xx.
В таблице 1 приняты следующие обозначения:
· Int (interrupt) - количество источников прерывания;
· I/O (input/output) - количество внешних линий портов ввода/вывода;
· Mul (multiplier) - наличие аппаратного умножителя;
· #CC (capture/compare) - количество модулей захвата/сравнения;
· ADC# (Analog to Digital Converter) - разрядность аналого-цифрового
преобразователя;
· DAC (Digital to Analog Converter) - количество цифро-аналоговых
преобразователей;
· DMA (Direct Memory Access) - количество каналов контроллера
прямого доступа в память.
Таблица 1
Модель
|
Flash, kB
|
RAM, B
|
Int
|
I/O
|
Mul
|
TimerB
|
UART/SPI
|
ADC
|
DAC
|
DMA
|
Выв. корпуса
|
MSP430F1101
|
1
|
128
|
7
|
14
|
-
|
-
|
-
|
-
|
-
|
-
|
20
|
MSP430F1121
|
4
|
256
|
7
|
14
|
-
|
-
|
-
|
-
|
-
|
-
|
20
|
MSP430F122
|
4
|
256
|
9
|
24
|
-
|
-
|
1
|
-
|
-
|
-
|
28
|
MSP430F123
|
8
|
256
|
9
|
24
|
-
|
-
|
1
|
-
|
-
|
-
|
28
|
MSP430F1222
|
4
|
256
|
10
|
24
|
-
|
-
|
1
|
ADC10
|
-
|
-
|
28
|
MSP430F1232
|
8
|
256
|
10
|
24
|
-
|
-
|
1
|
ADC10
|
-
|
-
|
28
|
MSP430F133
|
8
|
256
|
15
|
54
|
-
|
3CC
|
2
|
ADC12
|
-
|
-
|
64
|
MSP430F135
|
16
|
512
|
15
|
54
|
-
|
3CC
|
2
|
ADC12
|
-
|
-
|
64
|
MSP430F147
|
32
|
1k
|
15
|
54
|
+
|
7CC
|
2
|
ADC12
|
-
|
-
|
64
|
MSP430F148
|
48
|
2k
|
15
|
54
|
+
|
7CC
|
2
|
ADC12
|
-
|
-
|
64
|
MSP430F149
|
60
|
2k
|
15
|
54
|
+
|
7CC
|
2
|
ADC12
|
-
|
-
|
64
|
MSP430F155
|
16
|
512
|
16
|
54
|
-
|
3CC
|
1
|
ADC12
|
2
|
3
|
64
|
MSP430F156
|
24
|
1k
|
16
|
54
|
-
|
3CC
|
1
|
ADC12
|
2
|
3
|
64
|
MSP430F157
|
32
|
1k
|
16
|
54
|
-
|
3CC
|
1
|
ADC12
|
2
|
3
|
64
|
MSP430F167
|
32
|
1k
|
16
|
54
|
+
|
7CC
|
2 +I2C
|
ADC12
|
2
|
3
|
64
|
MSP430F168
|
48
|
2k
|
16
|
54
|
+
|
7CC
|
2 +I2C
|
ADC12
|
2
|
3
|
64
|
MSP430F169
|
60
|
2k
|
16
|
54
|
+
|
7CC
|
2 +I2C
|
ADC12
|
2
|
3
|
64
|
MSP430F1610
|
32
|
5k
|
16
|
54
|
+
|
7CC
|
2 +I2C
|
ADC12
|
2
|
3
|
64
|
MSP430F1611
|
48
|
10k
|
16
|
54
|
+
|
7CC
|
2 +I2C
|
ADC12
|
2
|
3
|
64
|
1.
Центральный процессор MSP430
1.1 Адресное
пространство микроконтроллеров MSP430F1xx
Т.к. MSP микроконтроллеры построены по фон-неймановской архитектуре, все
классы памяти, включающие Flash-память программ, ОЗУ, регистры управления
периферийных устройств, отображены на единое адресное пространство общей
емкостью 64 килобайта. Типовое распределение памяти приведено на рис.1.
Рисунок 1. Распределение памяти микроконтроллеров MSP430F1xx
Младшие адреса памяти занимает область SFR (Special Function
Registers) в которой находятся несколько
8-битных регистров, предназначенных для конфигурации некоторых периферийных
устройств.
В диапазоне адресов FFh -
10h находятся регистры управления
8-битных периферийных устройств, таких как порты ввода/вывода, UART и т.д. К этим регистрам, также как и
к регистрам SFR, необходимо обращаться, используя
только байтовые формы инструкций.
В диапазоне адресов 1FFh -
100h находятся регистры управления
16-битных периферийных устройств, таких как таймеры, АЦП и т.д. К этим
регистрам необходимо обращаться, используя только словные (16-ти разрядные)
формы инструкций.
Начиная с адреса 200h,
располагается ОЗУ памяти данных. Верхняя граница этой области зависит от
физического объема памяти для данной модели. Так для устройств, снабженных ОЗУ
объемом 2 kB, верхняя граница имеет адрес 9FFh. К ОЗУ данных можно обращаться,
используя как байтовую, так и словную форму инструкций.
Область BSL (Bootstrap Loader) представляет собой ПЗУ, в которой записаны
специальные отладочные подпрограммы, предназначенные для загрузки
пользовательских программ через встроенный последовательный порт. Правила
работы с BSL в данном документе рассматриваться
не будут.
К области BSL примыкает Flash память данных. Эта память может
программироваться так же, как и основная память программ. Различие заключается
в том, что стирание этой памяти осуществляется сегментами меньшего размера.
Старшие адреса занимает Flash
память программ. Адрес начала этого класса памяти зависит от физического объема
памяти для данной модели. Для моделей, имеющих общий объем памяти программ 60 kB, эта область примыкает к Flash памяти данных и ее начальный адрес
равен 1100h.
Последние 32 байта адресного пространства также реализованы как Flash память и предназначены для хранения
векторов прерывания.
1.2 Регистровый
файл
Все микроконтроллеры семейства MSP430 имеют в своем составе регистровый файл, состоящий из 16 16-ти
разрядных регистров. Регистровый файл не отображается на общее адресное
пространство, поэтому к регистрам можно обращаться только по их именам - R0, R1, … R15.
Большинство регистров из регистрового файла могут выступать как источник или
приемник данных, или использоваться в качестве указателей. Регистры с индексами
от R0 до R3 имеют специальные предназначения, в то время как регистры R4-R15 являются регистрами общего назначения.
Регистр R0 является программным счетчиком (Program Counter) и к нему можно также обращаться по имени PC. Регистр PC содержит адрес команды, которую должен выполнить процессор в
данный момент. Так как все команды процессора имеют четное количество байт,
младший бит этого регистра всегда имеет значение 0.
Регистр R1 является указателем стека (Stack Pointer) и к нему можно обращаться по имени SP. Стек - это область памяти ОЗУ,
предназначенная, главным образом, для хранения адресов возврата из подпрограмм.
Стек также может использоваться для временного хранения содержимого регистров и
ячеек памяти. В MSP контроллерах
используется падающая модель стека, т.о. ячейки памяти стека заполняются от
старших адресов к младшим. Регистр SP всегда содержит адрес последней (с младшим адресом) ячейки стека, в
которую производилась запись. В начале прикладной программы необходимо
инициализировать регистр SP.
Т.к. при сохранении данных на стеке, например с помощью команды PUSH, содержимое SP всегда уменьшается на 2, необходимо чтобы его начальное
значение было бы четным. Обычно SP
настраивают так, чтобы он указывал на самую верхнюю область ОЗУ. Для моделей,
содержащих 2 килобайта памяти данных, в регистр SP записывается значение, равное 0A00h.
Регистр R2 является статусным регистром (Status Register) и к нему можно обращаться по имени SR. Регистр SR содержит, во-первых, биты управления режимами работы
центрального процессора и, во-вторых, флаги, сигнализирующие о результате
последней операции. Структура регистра SR представлена ниже.
Зарезервировано
|
V
|
SCG1
|
SCG0
|
OSCOFF
|
CPUOFF
|
GIE
|
N
|
Z
|
C
|
Регистр SR содержит следующие биты:
· Бит 8: V (oVerflow) - переполнение. Устанавливается
аппаратно если в результате последней операции зарегистрировано арифметическое
переполнение, т.е. произошел перенос в старший, знаковый бит. Если переполнения
не было, бит аппаратно сбрасывается.
· Биты 7 и 6: SCG1, SCG0 - (System Clock Generator) - предназначены для управления
системным тактовым генератором. Назначение этих бит будет рассмотрено позже (п.3.3).
· Бит 5: OSCOFF
- выключение осциллятора. Устанавливается программно для отключения тактового
генератора. В этом случае останавливается центральный процессор и вся
тактируемая периферия. Уровень электрического потребления падает до долей
микроампер.
· Бит 4: CPUOFF
- выключение центрального процессора. Программная установка этого бита
отключает тактирование центрального процессора, при этом периферийные
устройства могут находиться в активном режиме. Комбинация состояний битов 7…4
дает возможность гибкого управления режимами пониженного потребления всего
микроконтроллера. Различные режимы потребления будут рассмотрены ниже (п.3.3).
· Бит 3: GIE (Global Interrupt Enable) - глобальное разрешение прерываний.
Устанавливается/сбрасывается программно для разрешения/запрещения всех
прерываний процессора.
· Бит 2: N (Negative) - бит фиксации отрицательного
результата. Устанавливается аппаратно, если в качестве результата последней
операции было получено отрицательное значение, в противном случае -
сбрасывается. Фактически в бит N
переписывается старший значащий бит результата: 15-й бит для словной формы или
7-й бит для байтовой формы данных.
· Бит 1: Z (Zero) - бит фиксации нулевого результата.
Устанавливается аппаратно, если в качестве результата последней операции было
получено нулевое значение, в противном случае - сбрасывается.
· Бит 0: С (Carry)
- бит переноса. Устанавливается аппаратно, если результат последней операции не
умещается в разрядной сетке операции (16 бит для словной формы или 8 бит для
байтовой данных), в противном случае сбрасывается.
Все биты флагов в регистре SR
также могут устанавливать/сбрасываться программно.
Регистр R3 является генератором констант. Он используется неявно
ассемблером для генерации часто используемых констант: 0, 1, 2, 4, 8, -1. Для
этого при кодировании ассемблер достаточно хитроумно используют различные
способы адресации к регистрам R2 и R3. Использование в коде команды ссылки на
регистр R2 при генерации констант становится
возможным, т.к. использование R2 в
качестве регистра-указателя не имеет смысла.
Использование генератора констант в некоторых случаях приводит к
сокращению объема кода программы и увеличению скорости исполнения определенных
фрагментов программы. Программисту нет необходимости задумываться об
использовании данных констант, подстановку нужного кода производит ассемблер
автоматически. Вместе с тем, программист не должен явно использовать регистр R3 в своих программах.
Регистры R4 - R15 программист может использовать
свободно по своему усмотрению.
1.3 Байтовая
и словная формы инструкций.
-ти разрядное арифметико-логическое устройство процессора имеет
возможность оперировать как с 16-ти разрядными, так и с 8-ми разрядными
данными. Для того чтобы показать, с данными какой разрядности должен работать
процессор, большинство команд (инструкций процессора) имеют байтовую (8 бит) и
словную (16 бит) формы. Для этого используются суффиксы ‘b’ (byte) и ‘w’ (word), записываемые после мнемоники
инструкции и отделенные от нее десятичной точкой. Например, запись ‘mov.b’ определяет байтовую, а запись ‘mov.w’ -
словную форму команды ‘mov’.
В том случае, если после мнемоники команды суффикс вообще не ставится, по умолчанию,
подразумевает словная форма.
Все ячейки памяти ОЗУ могут быть рассмотрены как массив байт, в случае
обращения к ним с использования байтовой формы инструкции или как массив слов -
для словной формы. То же самое можно сказать о Flash памяти, т.к. для микроконтроллеров с фон-неймановской
архитектурой, по крайней мере, чтение данных из памяти программ, ничем не
отличается от чтения ОЗУ. Однако адресация памяти в MSP микроконтроллерах всегда производится побайтно. При
этом младшие байты 16-ти разрядных слов всегда должны иметь четные адреса, а
старшие байты - адрес на единицу больше адреса его младшего байта. Адрес 16-ти
разрядной ячейки памяти совпадает с адресом ее младшего байта. Например,
словная ячейка памяти с адресом 200h состоит из младшего байта, который также имеет адрес 200h, и старшего байта с адресом 201h. Использование словных инструкций
применительно к ячейкам памяти с нечетными адресами может вызвать либо ошибку
трансляции при явном определении адреса, либо непредсказуемое поведении процессора
при косвенной адресации.
Регистры регистрового файла не имеют деления на старший и младший байты и
всегда воспринимаются как 16-ти разрядные. Однако это не значит, что к ним не
применимы байтовые формы инструкций, при этом регистр может выступать как в
качестве источника данных, так и в качестве приемника. В том случае, если
регистр выступает в качестве источника в байтовой инструкции, используется
только содержимое его младших 8-ми бит, при этом содержимое всего регистра не
меняется. Если регистр используется как приемник, данные записываются в его
младшие 8 разрядов, при этом старшие разряды обнуляются.
Пример.
Пусть изначально регистр R4
содержит шестнадцатеричное значение 1234h, байт с адресом 200h - ABh, а байт с адресом 201h - значение 89h.
Если при этих исходных данных содержимое регистра R4 переслать как байт (команда mov.b) по адресу 200h, то
содержимое этой ячейки станет 34h.
Содержимое ячейки по адресу 201h не
изменится.
Если содержимое R4
переслать как слово (команда mov.w), ячейка с адресом 200h будет содержать значение 34h, а 201h - 12h.
Если байт с адресом 200h
пересылается в R4, регистр после
операции будет содержать значение ABh. Если использовать словную пересылку, содержимое регистра будет равно 89ABh.
1.4 Режимы
адресации
Микроконтроллеры MSP
имеют ортогональную систему команд. Это означает, что каждая команда может
адресовать данные, используя любой доступный режим адресации. Поэтому, прежде
чем рассматривать систему команд, необходимо описать все режимы адресации к
данным. Как указывается в технической документации Texas Instruments, MSP микроконтроллеры поддерживают следующие режимы
адресации к данным:
регистровый;
индексный;
символьный;
абсолютный;
косвенный;
косвенный с автоинкрементом;
непосредственный.
При этом для источника данных доступны все режимы адресации, а для
приемника - только четыре первых режима. Следует заметить, однако, что
символьный и абсолютный режимы адресации являются частными случаями более
общего индексного режима, а непосредственный кодируется с помощью автоинкрементного
косвенного режима.
Иллюстрацию работы различных режимов адресации будем проводить на примере
инструкции ‘mov’ (переслать). Данная команда
относится к группе двух-операндных команд и производит пересылку содержимого
операнда-источника по адресу операнда-приемника. Следует помнить, что каждая
инструкция на языке ассемблера записывается в одной строке, при этом сначала
записывается мнемоника команды, затем через пробелы или символы табуляции
указывается операнд-источник и, через запятую, операнд-приемник.
1.4.1
Регистровая адресация
В регистровой адресации операндом-источником и/или операндом-приемником
является регистр регистрового файла. Признаком регистровой адресации является
имя регистра, записанное в качестве операнда.
Пример:R5, R10 - содержимое регистра R5 (как слово) пересылается в
регистр R10.
mov.b SP, R5 - содержимое
младшего байта указателя стека пересылается в регистр R5.
mov PC, R7 - в регистре R7 запоминается текущее состояние
программного счетчика.
1.4.2
Индексная адресация
С помощью индексной адресации производится обращение к ячейке памяти,
адрес которой вычисляется как сумма содержимого регистра и постоянного
смещения. Признаком индексной адресации является использование одного из
операндов в виде X(Rn), где n - индекс используемого регистра (n=0..15), а X -
произвольное целое число, записанное в десятичной или шестнадцатеричной форме,
и находящееся в диапазоне 0..65535 (0..FFFFh).
Пример:
mov
12(R5), 100h(R8) - содержимое
ячейки памяти (как слово), адрес которой равен сумме содержимого регистра R5 и константы 12 (десятичное)
переслать в ячейку памяти, адрес, которой равен сумме содержимого регистра R8 и константы 100h (шестнадцатеричное).
Рассмотрим этот пример более подробно. Пусть на момент выполнения этой
команды содержимое R5 = 200h, а содержимое R8 = 456h.
Тогда адрес источника равен 200h+12 = 200h+0Ch = 20Ch
Адрес приемника равен 456h+100h = 556h
Таким образом, при данных начальных условиях, исполнение этой команды
приведет к пересылке содержимого слова по адресу 20Ch в ячейку памяти с адресом 556h.
В одной команде можно комбинировать регистровый и индексный способы
адресации.
Например
mov.b 8(R10), R5 -
содержимое байта по адресу, равному сумме содержимого R10 и константы 8, записывается в регистр R5.
mov.w R12, 0(R14) -
содержимое регистра R12 записывается в
ячейку памяти (слово), адрес которой содержится в R14.
1.4.3
Символьная адресация
Признаком символьной адресации является упоминание символьного имени
ячейки памяти как операнда-приемника и/или операнда-источника. В качестве
символьного имени ячейки памяти используется метка, описанная в сегменте кода
или данных при написании программы.
Пример:Lab1,
R5
. . .: dw 10
Содержимое ячейки памяти, помеченной как Lab1, пересылается в регистр R5. Адрес Lab1
зарезервирован с помощью директивы компилятора dw (define word). В данном случае по адресу,
соответствующему метке Lab1,
располагается константа 10.
Символьная адресация является частным случаем индексной адресации, где в
качестве базового регистра используется PC, а постоянное смещение рассчитывается ассемблером на этапе
трансляции как разность адресов ячейки памяти Lab1 и текущего адреса команды, которая использует
символьную адресацию.
Предположим, что данная команда занимает ячейки памяти программ, начиная
с адреса 1234h, а метка Lab1 соответствует адресу 23AEh. Тогда смещение относительно PC можно рассчитать как 23AEh - 1234h =
117Ah, и данная команда будет
оттранслирована как mov 117Ah(PC), R5
Таким образом, после исполнения команды в регистр R5 будет записано значение 10.
Использовать символьный режим адресации имеет смысл тогда, когда
необходимо получить перемещаемый, т.е. адресно-независимый программный код.
Этот прием применяется, например, в случае, если программе необходимо
перепрограммировать часть собственной Flash памяти. В этом случае управляющая подпрограмма должна выполняться не из Flash памяти, а из ОЗУ. Для этого
необходимо, чтобы подпрограмма программирования сначала располагалась во Flash, после чего ее тело необходимо
скопировать в ОЗУ, и передать ей управление. Находясь в ОЗУ, подпрограмма может
очистить Flash, возможно включая ту область, откуда
она была скопирована. Таким образом, перемещаемый программный модуль,
работающий относительно PC,
может быть транслирован в привязке к одним адресам, а исполняться из другой
области памяти.
1.4.4 Абсолютная адресация
Абсолютной адресацией пользуются при обращении к ячейкам памяти, имеющим
фиксированные и известные на момент трансляции адреса. С помощью абсолютной
адресации обычно обращаются к регистрам управления периферийных устройствами
или ячейкам памяти ОЗУ, в том случае, если не используются перемещаемые
программные модули. Признаком абсолютной адресации является символ ‘&’,
после которого записывается адрес требуемой ячейки памяти. Пример: mov &200h, 10(R5)
В данном примере используется абсолютная адресация для источника и
индексная адресация для приемника. Команда выполняет пересылку слова,
расположенного по адресу 200h в
ячейку памяти, адрес которой вычисляется как сумма содержимого R5 и смещения 10.
Абсолютная адресация также является частным случаем индексной адресации,
в котором в качестве базового регистра используется генератор констант. При
этом трансляция проводится с таким режимом, что в регистр R3 аппаратно подставляется нулевое
значение. Таким образом, данная команда транслируется как mov 200h(R3), 10(R5)
При этом содержимое R3 на
момент выполнения команды равно 0. Если быть более точным, то транслятор
подставляет в коде команд ссылку (косвенная адресация) не на R3, а на R2. Программист, однако, может не вникать в нюансы
кодирования, автоматически проводимым ассемблером, и просто использовать символ
‘&’ для обозначения абсолютного режима адресации.
.4.5 Косвенная адресация
Косвенная адресация применима только к операнду-источнику. Признаком
косвенной адресации является символ ‘@’ за которым следует имя регистра. В этом
случае в качестве операнда-источника используется содержимое ячейки памяти,
адрес которой содержится в данном регистре.
Пример: mov.w @R12, &200h
Содержимое ячейки памяти (слово), адрес которой содержится в регистре R12, пересылается в ячейку памяти с
абсолютным адресом 200h. По
своей логике эта команда эквивалентна команде mov.w 0(R12), &200h, однако команды, использующие косвенную адресацию вместо
индексной, занимают в памяти меньше места и исполняются быстрее.
1.4.6
Косвенная адресация с автоинкрементом
Этот режим адресации применим только к операнду-источнику. Для
обозначения режима используется нотация косвенной адресации, где после записи
операнда-источника записывается символ ‘+’. Действие этого режима аналогично
работе простой косвенной адресации, однако после выполнения команды, содержимое
регистра указателя увеличивается на 1 для байтовой формы, или на 2 - для
словной. Пример mov.b @R6+, R10
В данной команде содержимое ячейки памяти (байт), адрес которой
содержится в регистре R6,
пересылается в регистр R10,
после чего содержимое R6
увеличивается на 1.
Предположим, что на момент исполнения команды, регистр R6 содержал значение 21Ah, тогда в регистр R10, будет переслано содержимое ячейки
с адресом 21Ah, а сам регистр после исполнения
команды будет содержать значение 21Bh. Если использовать команду mov.w, то содержимое R6 оказалось бы равным 21Ch.
Данный режим адресации удобно использовать для циклической обработки
содержимого массивов, т.к. после выполнения команды регистр-указатель
автоматически содержит адрес следующей ячейки памяти.
1.4.7
Непосредственная адресация
Данный режим применяется только для операндов-источников и предназначен
для использования констант, определенных на этапе компиляции программы. Для
обозначения этого режима используется символ ‘#’, за которым следует численное
значение самой константы.
Пример mov #1234, R12
В этом примере число 1234 загружается в регистр R12.
Абсолютная адресация не является самостоятельным типом. При кодировке
данной команды ассемблер заменяет эту инструкцию следующей последовательностью:
mov @PC+, R12
dw
1234
В данной реализации код команды mov занимает в памяти два байта. После вычитывания кода команды содержимое
регистра PC автоматически увеличивается на 2,
после чего PC содержит адрес, по которому
располагается константа 1234. Согласно алгоритму работы косвенной адресации,
содержимое ячейки памяти, адрес которой находится в PC (т.е. значение 1234), пересылается в R12, после чего содержимое PC опять увеличивается на 2, т.к. задан
режим с автоинкрементом. Таким образом, после исполнения команды PC будет содержать адрес следующей за
директивой dw инструкции.
Следует заметить, однако, что в том случае, если в качестве константы в
программе указано одно из значений, генерируемых генератором констант,
ассемблер автоматически подставит более короткий код, со ссылкой на регистры R2/R3 в зависимости от значения этой константы.
2. Система
команд MSP микроконтроллеров
Все команды MSP можно разделить на основные (базовые) и эмулированные.
Основные команды - это инструкции, которые собственно исполняет процессор.
Эмулированные команды представляют собой мнемоники, которые на этапе компиляции
автоматически заменяются ассемблером на ту или другую команду из основного
набора. Всего имеется 27 базовых команд и 24 эмулируемых.
Базовые команды условно делятся на 3 группы: это двухадресные команды,
одноадресные команды и команды переходов.
Для описания действий процессора при исполнении инструкций введем
некоторые обозначения:
src (source) - операнд источник, может быть
представлен любым типом адресации;
dst (destination) - операнд приемник, может быть
представлен регистровым, индексным, символьным или абсолютным режимами
адресации;
label
- метка в теле программы;
LSB (less significant bit) - младший значащий бит;(most significant bit) - старший
значащий бит;
+ операция арифметического сложения;
операция арифметического вычитания;
& операция ЛОГИЧЕСКОЕ И;
| операция ЛОГИЧЕСКОЕ ИЛИ;
^ операция ИСКЛЮЧАЮЩЕЕ ИЛИ;
~ операция ЛОГИЧЕСКОЙ ИНВЕРСИИ;
ß записать.
2.1
Двухадресные команды
Ø Команда: MOV - MOVe - пересылка.
Синтаксис: mov src, dst
Операция: dst ß src
Описание: Содержимое src
записывается в dst
Флаги: Не модифицируются
Пример: Переслать содержимое R8 в ячейку памяти, адрес которой хранится в R12
mov R8, 0(R12)
Ø Команда: ADD - прибавить
Синтаксис: add src, dst
Операция: dst ß dst+src
Описание: Содержимое src прибавляется к содержимому dst
Флаги: флаги CZNV модифицируются согласно результату операции
Пример: Прибавить число 35 к содержимому ячейки памяти с адресом 200h#35, &200h
Ø Команда: ADDC - ADD with Carry - прибавить с учетом переноса
Синтаксис: addс src, dst
Операция: dst ß st+src+С
Описание: К содержимому dst прибавляется содержимое src и флаг C.
Флаги: флаги CZNV модифицируются согласно результату операции
Ø Команда: SUB - SUBtract
- вычесть
Синтаксис: sub src, dst
Операция: dstßdst-src
Описание: Из содержимого dst вычитается содержимое src
Флаги: флаги CZNV модифицируются согласно результату операции
Пример : Из содержимого R12
вычесть содержимое ячейки памяти с адресом 22Ah&22Ah, R12
Ø Команда: SUBC -
SUBtract with Carry - вычесть c учетом переноса
Синтаксис: subс src, dst
Операция: dstßdst-src-1+C
Описание: Из содержимого dst вычитается содержимое src и инверсия C
Флаги: флаги CZNV модифицируются согласно результату операции
Ø Команда: CMP - CoMPare - сравнить
Синтаксис: cmp src, dst
Операция: dst-src
Описание: Из содержимого dst вычитается содержимое src, результат никуда
не заносится
Флаги: флаги CZNV модифицируются согласно результату операции
Пример : Сравнить содержимое ячейки памяти, адрес которой находится в
регистре R12 с числом 100#100, 0(R12)
Ø Команда: DADD - Decimal ADDition - сложение операндов в BCD
формате с учетом переноса
Синтаксис: dadd src, dst
Операция: dst ßdst + src + C
Описание: Команда используется в предположении, что оба операнда имеют
двоично-десятичную кодировку - BCD (Binary Coded Decimal). BCD кодировка используется в основном
для подготовки числовых данных, поразрядно выводимых на индикатор.кодировка
предполагает, что в каждом полубайте операнда может находиться число в
диапазоне 0 - 9. При сложении двух BCD чисел результатом исполнения команды
является также правильное BCD число.
Флаги: флаги CZNV модифицируются согласно результату операции
Пример : Пусть R5 содержит значение 1234h, а R6 - 6789h. При выполнении
командыR5, R6
регистр R6 получит значение 8023h. Т.е. шестнадцатеричные цифры
трактуются как десятичные. В противоположность этому при тех же исходных условиях
командаR5, R6
загрузит в R6 значение 79BDh. Это происходит потому, что
h+6789h=4660+26505=31165=79BDh
Ø Команда: AND - логическое И
Синтаксис: and src, dst
Операция: dstß dst & src
Описание: В операнд приемник записывается значение побитной операции ЛОГИЧЕСКОЕ
И между содержимым источника src и приемника dst.
Флаги: флаги ZN модифицируются согласно результату операции, С = ~Z, V=0
Пример: Сбросить 7, 6 и 4 биты в регистре R12
and #2Fh, R12
Ø Команда: BIT - BIt Test - тестирование бит
Синтаксис: bit src, dst
Операция: dst & src
Описание: Выполняет те же действия, что и команда AND, однако результат
никуда не записывается
Флаги: флаги ZN модифицируются согласно результату операции, С = ~Z, V=0
Пример: Проверить состояние младшего бита регистра R12
bit
#1, R12
Ø Команда: BIS - BIt Set - установка бит
Синтаксис: bis src, dst
Операция: dst ß src | dst
Описание: В приемнике dst устанавливаются в единицы те биты, которые были
установлены в источнике src. Фактически выполняется операция ЛОГИЧЕСКОЕ ИЛИ.
Флаги: Не модифицируются
Пример: Установить 7-й и 1-й бит в регистре R12.b #82h, R12
Ø Команда: BIC - BIt Clear - сброс бит
Синтаксис: biс src, dst
Операция: dst ß ~src & dst
Описание: В приемнике dst сбрасываются в ноль те биты, которые были
установлены в источнике src. Фактически выполняется операция ЛОГИЧЕСКОЕ И между
приемником и битовой инверсией источника
Флаги: Не модифицируются
Ø Команда: XOR - eXlusive OR - «исключающее или»
Синтаксис: xor src, dst
Операция: dst ß src ^ dst
Описание: В операнд приемник записывается значение побитной операции
ИСКЛЮЧАЮЩЕЕ ИЛИ между содержимым источника и приемника.
Флаги: флаги ZN модифицируются согласно результату операции,
С = ~Z,=1, если оба операнда отрицательные, в противном случае V=0.
Все двухадресные команды поддерживают как байтовую, так и словную форму.
Объем памяти, занимаемый двухадресными командами, а также скорость их
исполнения не зависит от конкретной команды, а определяется исключительно
режимом адресации приемника и источника. В таблице 2 приведены значения скорости
исполнения команды и объем памяти, занимаемый командой, в зависимости от режима
адресации источника/приемника. В числителе приведена скорость исполнения в
машинных циклах, в знаменателе - объем памяти в байтах.
Таблица 2
|
Регистровый
|
Индексный
|
Символьный
|
Абсолютный
|
Регистровый
|
1 / 2
|
4 / 4
|
4 / 4
|
4 / 4
|
Индексный
|
3 / 4
|
6 / 6
|
6 / 6
|
6 / 6
|
Символьный
|
3 / 4
|
6 / 6
|
6 / 6
|
6 / 6
|
Абсолютный
|
3 / 4
|
6 / 6
|
6 / 6
|
6 / 6
|
Косвенный
|
2 /2
|
5 / 4
|
5 / 4
|
5 / 4
|
Косв. с автоинк.
|
2 / 2
|
5 / 4
|
5 / 4
|
5 / 4
|
Непосредственный
|
2 /4
|
5 / 6
|
5 / 6
|
5 / 6
|
2.2
Одноадресные команды
Ø Команда: RRC - Rotate Right through Carry - вращение вправо
через перенос
Синтаксис: rrc src
Операция: C à MSB à .. LSB àC
Описание: Содержимое операнда источника сдвигается на один бит вправо,
значение бита переноса записывается в старший значащий бит, младший бит
записывается в бит переноса. Поддерживает байтовую и словную форму. Для словно
формы MSB - 15-й бит, для байтовой - 7-й.
Операнд может иметь любой тип, кроме непосредственного.
Флаги: флаги СZNV
модифицируются согласно результату операции,
Пример: Сдвинуть вправо содержимое ячейки памяти, адрес которой
содержится в R5
rrc @R5
Ø Команда: RRA - Rotate Right Arithmetically - арифметический сдвиг вправо
Синтаксис: rra src
Операция: MSB à MSB à .. LSB àC
Описание: Содержимое операнда источника сдвигается на один бит вправо,
значение старшего бита не изменяется, младший бит записывается в бит переноса.
Поддерживает байтовую и словную форму. Для словно формы MSB - 15-й бит, для байтовой - 7-й.
Операнд может иметь любой тип, кроме непосредственного.
Флаги: флаги СZNV
модифицируются согласно результату операции,
Пример: сдвинуть вправо содержимое регистра R5
rra R5
Ø Команда: PUSH - поместить
Синтаксис: push src
Операция: SPßSP-2
@SPßsrc
Описание: Содержимое операнда источника src записывается в стек.
Поддерживает байтовую и словную форму, но в любом случае на каждую команду
расходуется два байта стека.
Флаги: Не модифицируются
Пример: Поместить на стек число 1234
push
#1234
Ø Команда: SWPB -
SWaP Byte - перестановка
Синтаксис: swpb src
Описание: Меняет местами старший и младший байты источника. Не
поддерживает байтовую форму. Не поддерживает непосредственную адресацию.
Флаги: Не модифицируются
Пример: Поменять местами байты в регистре R9
swpb R9
Ø Команда: CALL -
вызов
Синтаксис: call src
Операция: SP ß SP-2
@SP ß PC ß src
Описание: Вызывает подпрограмму на исполнение. Для этого сначала
сохраняет на стеке адрес возврата, после чего осуществляет переход на начало
подпрограммы. Не поддерживает байтовую форму.
Флаги: Не модифицируются
Пример:
call #proc - вызов подпрограммы помеченной
меткой proc
call proc - вызов
подпрограммы, адрес которой содержится в ячейке памяти с именем proc
call r5 - вызов
подпрограммы, адрес которой содержится в регистре R5
call @R5+ - вызов подпрограммы, адрес
которой содержится в ячейке памяти, адрес которой в свою очередь, содержится в
регистре R5, после чего содержимое R5 увеличивается на 2.
Ø Команда: RETI -
RETurn from Interrupt - возврат из подпрограммы обработки
прерывания
Синтаксис: reti
Операция: SR ß @SP
SP ß SP+2
PC ß @SP
SP ß SP+2
Описание: Завершает подпрограмму обработки прерывания. Для этого сначала
восстанавливает из стека содержимое статусного регистра, зафиксированное перед
вхождением в прерывании, и передает управление на прерванный фрагмент
программы.
Флаги: восстанавливаются.
Ø Команда: SXT - Sign eXTend - расширение знака
Синтаксис: sxt src
Описание: Копирует 7-й бит операнда в его старшие биты. Команда
используется для преобразования байта в слово. Не поддерживает байтовую форму.
Не поддерживает непосредственную адресацию.
Флаги: флаги ZN модифицируются согласно результату операции, С = ~Z, V=0
Данные об объеме памяти, занимаемой командами, и скорость их исполнения
приведена в таблице 3. Формат данных в таблице - такой же как в таблице 2.
Таблица 3
|
RRA,RRC,
SWPB,SXT
|
PUSH
|
CALL
|
Регистровый
|
1 / 2
|
3 / 2
|
4 / 2
|
Индексный
|
4 / 4
|
5 / 2
|
5 / 4
|
Символьный
|
4 / 4
|
5 / 4
|
5 / 4
|
Абсолютный
|
4 / 4
|
5 / 4
|
5 / 4
|
Косвенный
|
3 / 2
|
4 / 2
|
4 / 2
|
Косв. с автоинк.
|
3 / 2
|
5 / 2
|
5 / 2
|
Непосредственный
|
-
|
4 / 4
|
5 / 4
|
Команда RETI в памяти занимает 2 байта и
исполняется за 5 тактов.
.3 Команды
переходов
Команды переходов могут быть условными и безусловными. Условные переходы
выполняются на основе анализа состояния битов в статусном регистре SR. Переход осуществляется относительно
содержимого регистра PC на
расстояние от -511 до 512 слов.
Для некоторых команд условных переходов ассемблер поддерживает
альтернативную нотацию.
Ø Команда: JNE/JNZ - Jump if Not Equal / Jump if Not Zero -прыжок если не равно / прыжок если не ноль
Синтаксис: jne label
jnz label
Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=0
осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: Очистить 30 байт ОЗУ начиная с адреса 200h
mov
#200h, R5 ; настраиваем указатель на начало блока ОЗУ
Loop: mov.b #0, 0(R5) ;
пересылаем число 0 в текущую ячейку ОЗУ
add
#1, R5 ; наращиваем указатель
cmp
#200h+30, R5 ; проверяем достиг ли указатель границы
; блока ОЗУ
jne Loop ; Если нет - переход на начало цикла.
Ø Команда: JQE/JZ - Jump if Equal / Jump if Zero -прыжок если равно / прыжок если
ноль
Синтаксис: jeq label
jz label
Описание: Тестируется состояние бита Z статусного регистра SR. Если Z=1
осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: Тестировать 7-й бит в регистре R10
bit #80h, R10BitIsZero
. . . .:
Ø Команда: JN - Jump if Negative -прыжок
если минус
Синтаксис: jn label
Описание: Тестируется состояние бита N статусного регистра SR. Если N=1
осуществляется переход на метку label.
Флаги: Не модифицируются
Пример: В регистр R12
записать сумму всех положительных значений в блоке ОЗУ с начальным адресом 2A0h и размером 50 байт.
mov
#0, R12 ; обнуляем сумму
mov #2A0h, R10 ;
настраиваем указатель на начало блока ОЗУ
mov
#50, R11 ; инициализируем счетчик циклов
loop: mov.b @R10+, R8 ; читаем данные во временный
регистр
cmp
#0, R8 ; сравниваем с 0
jn skip ; если минус, пропустить следующую
команду
add R8, R12 ; накапливаем сумму
skip: sub #1, R11 ; считаем количество циклов
jnz loop ; если не все значения, переход на
начало цикла
Ø Команда: JC/JHS - Jump if Carry set / Jump if Higher or Same -прыжок если флаг С установлен / прыжок если выше или
равно
Синтаксис: jc label
jhs label
Описание: Тестируется состояние бита C статусного регистра SR. Если C=1
осуществляется переход на метку label.
Команда JHS обычно используется после сравнения
беззнаковых операндов.
Флаги: Не модифицируются
Ø Команда: JNC/JLO - Jump if Carry Not set / Jump if Lower -прыжок если флаг С сброшен / прыжок
если ниже
Синтаксис: jnc label
jlo label
Описание: Тестируется состояние бита C статусного регистра SR. Если C=0
осуществляется переход на метку label.
Команда JLO обычно используется после сравнения
беззнаковых операндов.
Флаги: Не модифицируются
Пример: В регистр R15
записать количество единичных бит, содержащихся в регистре R12.
mov
#16, R13 ; загружаем счетчик бит
mov
#0, R15 ; обнуляем регистр результата
loop: rrc R12 ; сдвиг данных в бит C
jnc skip ; если C=0, пропустить след. команду
add
#1, R15 ; увеличить результат
skip: sub #1, R13 ; все биты сдвинуты?
jne loop ; если нет - переход на начало цикла
Тот же результат можно получить, если в приведенном фрагменте две команды
jnc skip
add
#1, R15
заменить одной:
addc #0, R15
Ø Команда: JGE - Jump if Greater or Equal -прыжок если больше или равно
Синтаксис: jge label
Описание: Если результат операции N^V равен 0,
осуществляется переход на метку label.
Команда JGE обычно используется после сравнения
знаковых операндов.
Флаги: Не модифицируются
Пример: В регистр R12
записать максимальное знаковое значение, содержащееся в блоке памяти ОЗУ со
стартовым адресом 200h и
размером 100 слов.
mov
#-32768, R12 ; инициализируем R12 наименьшим значением
mov
#200h, R15 ; настраиваем указатель на начало блока
mov
#100, R13 ; инициализируем счетчик циклов
loop: cmp @R15+, R12 ;
сравниваем текущее слово с текущим
; максимумом
mov
-2(R15), R12 ; иначе меняем текущий максимум
skip: sub #1, R13 ; проверяем окончание цикла
jne loop ; если цикл не закончен, переход на
начало
; цикла
Ø Команда: JL -
Jump if Less -прыжок если меньше
Синтаксис: jl label
Описание: Если результат операции N^V равен 1,
осуществляется переход на метку label.
Команда JGE обычно используется после сравнения
знаковых операндов.
Флаги: Не модифицируются
Ø Команда: JMP -
Jump -прыжок
Синтаксис: jmp label
Описание: Безусловный переход на метку label
Флаги: Не модифицируются
Все команды переходов в памяти занимают 2 байта и исполняются за два
цикла.
.4
Эмулируемые команды
Как уже указывалось выше, программист может свободно использовать
эмулированные команды, однако на этапе трансляции ассемблер автоматически
заменяет ее аналогом из базового набора. Использование эмулируемых команд в
ряде случаев делает текст программы более понятным и наглядным. Флаги в
статусном регистре модифицируются в соответствии с замещающими командами.
Ø Команда: ADC - Add Carry - прибавить перенос
Синтаксис: adc dst
Эмуляция: addc #0, dst
Описание: Если бит С регистра SR равен 1, операнд увеличивается на 1. Значение 0 подставляется из
генератора констант.
Ø Команда: SBC - SuBtract Carry - вычесть перенос
Синтаксис: sbc dst
Эмуляция: sbc #0, dst
Описание: Если бит С регистра SR равен 0, операнд уменьшается на 1. Значение 0 подставляется из генератора
констант.
Ø Команда: DADC -
Decimal Add Carry - прибавить перенос к BCD операнду
Синтаксис: dadc dst
Эмуляция: dadd #0, dst
Описание: Если бит С регистра SR равен 1, BCD операнд
увеличивается на 1. Значение 1 подставляется из генератора констант.
Ø Команда: INC - INCrement - увеличить
Синтаксис: inc dst
Эмуляция: add #1, dst
Описание: Операнд увеличивается на 1. Значение 1 подставляется из
генератора констант.
Ø Команда: INCD -
INCrement Double - увеличить дважды
Синтаксис: incd dst
Эмуляция: add #2, dst
Описание: Операнд увеличивается на 2. Значение 2 подставляется из
генератора констант.
Ø Команда: DEC - DECrement - уменьшить
Синтаксис: dec dst
Эмуляция: sub #1, dst
Описание: Операнд уменьшается на 1. Значение 1 подставляется из
генератора констант.
Ø Команда: DECD -
DECrement Double - уменьшить дважды
Синтаксис: decd dst
Эмуляция: sub #2, dst
Описание: Операнд уменьшается на 2. Значение 2 подставляется из
генератора констант.
Ø Команда: INV - INVersion - инверсия
Синтаксис: inv dst.b dst
Эмуляция:
xor #0FFFFh, dst.b #0FFh, dst
Описание: Состояние всех бит операнда инвертируется. Значение FFFFh/FFh, что соответствует -1 подставляется из генератора
констант.
Ø Команда: RLC - Rotate Left trough Carry - вращение влево через перенос
Синтаксис: rlc dst
Эмуляция: addc dst, dst
Описание: Все биты аргумента сдвигаются влево на один бит, в младший бит
записывается содержимое бита C,
старший бит операнда записывается в бит C.
Ø Команда: RLA - Rotate Left Arithmetically - сдвиг влево арифметический.
Синтаксис: rla dst
Эмуляция: add dst, dst
Описание: Все биты аргумента сдвигаются влево на один бит, в младший бит
записывается 0, старший бит операнда записывается в бит C.
Пример: Двоичное значение, содержащееся в регистре R12 преобразовать в BCD формат. Результат поместить в R15.
mov
#16, R13 ; Загрузка счетчика бит
mov
#0, R15 ; очистка R15
loop: rla R12 ; сдвиг влево исходного числа
dadd R15, R15 ; сдвиг результата влево с
учетом C и
; BCD коррекция
dec R13 ; Если
сдвинуты не все биты,
jne loop ; переход на начало цикла
Ø Команда: TST - TeST - тестирование (на ноль и минус)
Синтаксис: tst dst
Эмуляция: cmp #0, dst
Описание: Содержимое операнда сравнивается с нулем, по результату
сравнения устанавливаются флаги Z и N.
Ø Команда: POP -
вытолкнуть
Синтаксис: pop dst
Эмуляция: mov @SP+, dst
Описание: В операнд dst
загружаются данные из стека, указатель стека перемещается на следующую позицию.
Ø Команда: BR - BRanch - ветвление
Синтаксис: br src
Эмуляция: mov src, PC
Описание: Осуществляет безусловный переход на произвольное адресное
расстояние при использовании любого режима адресации.
Пример:
br #Lab ; переход наметку Lab
br Lab ; переход по адресу, содержащемуся в
ячейке,
; помеченной как Lab
br R10 ; переход по адресу,
содержащемуся в регистре R10
br
&200h ; переход по адресу, содержащемуся в
ячейке с адресом 200h
br @R10 ; переход по адресу,
содержащемуся в ячейке,
; адрес которой содержится в R10
br 4(R10) ; переход по адресу,
содержащемуся в ячейке,
; адрес которой равен сумме содержимого R10 и смещения 4
br @R10+ ; переход по адресу,
содержащемуся в ячейке, адрес которой
; содержится в R10, после чего содержимое R10 увеличивается
; на 2.
Ø Команда: RET - RETurn - вернуться
Синтаксис: ret
Эмуляция: mov @SP+, PC
Описание: Осуществляет переход по адресу, сохраненному в стеке, после
чего передвигает указатель стека на следующую позицию. Этой командой должна
завершаться каждая подпрограмма.
Ø Команда: CLR - CLeaR - очистить
Синтаксис: clr dst
Эмуляция: mov #0, dst
Описание: Очищает операнд приемник. Значение 0 подставляется из
генератора констант.
Ø Команда: CLRС -
CLeaR Carry - очистить флаг C
Синтаксис: clrc
Эмуляция: bic #1, SR
Описание: Очищает флаг C в
статусном регистре. Значение 1 подставляется из генератора констант.
Ø Команда: SETС -
SET Carry - установить флаг C
Синтаксис: setc
Эмуляция: bis #1, SR
Описание: Устанавливает флаг C в статусном регистре. Значение 1 подставляется из генератора констант.
Ø Команда: CLRZ -
CLeaR Zero - очистить флаг Z
Синтаксис: clrz
Эмуляция: bic #2, SR
Описание: Очищает флаг Z в статусном
регистре. Значение 2 подставляется из генератора констант.
Ø Команда: SETZ -
SET Zero - установить флаг Z
Синтаксис: setz
Эмуляция: bis #2, SR
Описание: Устанавливает флаг Z в статусном регистре. Значение 2 подставляется из генератора констант.
Ø Команда: CLRN -
CLeaR Negative - очистить флаг N
Синтаксис: clrn
Эмуляция: bic #4, SR
Описание: Очищает флаг N в
статусном регистре. Значение 4 подставляется из генератора констант.
Ø Команда: SETN -
SET Negative - установить флаг N
Синтаксис: setn
Эмуляция: bis #4, SR
Описание: Устанавливает флаг N в статусном регистре. Значение 4 подставляется из генератора констант.
Ø Команда: DINT -
Disable INTerrupts - запретить прерывания
Синтаксис: dint
Эмуляция: bic #8, SR
Описание: Очищает флаг GIE в
статусном регистре. Все маскируемые прерывания процессора запрещаются. Значение
8 подставляется из генератора констант.
Ø Команда: EINT -
Enable INTerrupts - разрешить прерывания
Синтаксис: eint
Эмуляция: bis #8, SR
Описание: Устанавливает флаг GIE в статусном регистре. Все маскируемые прерывания процессора разрешаются.
Значение 8 подставляется из генератора констант.
Ø Команда: NOP - No OPeration - нет операции
Синтаксис: nop
Эмуляция: mov R3, R3
Описание: Не выполняет никаких операций. Используется для организации программной
задержки на один такт.
3.
Периферийные устройства микроконтроллеров MSP430F1xx
.1 Внешние
выводы микроконтроллера MSP430F149
Каждый микроконтроллер серии MSP кроме процессорного ядра и встроенной памяти имеет в своем составе ряд
периферийных устройств. Большинство из них для обеспечения своего
функционирования должны иметь внешние выводы для общения с внешним миром. Почти
все выводы, связанные с периферийными устройствами, разделяются с параллельными
портами ввода/вывода. Поэтому все внешние выводы имеют, как минимум, две
альтернативные функции. В качестве примера назначения внешних выводов
рассмотрим модель MSP430F149.
Микроконтроллер MSP430F149 имеет в своем составе следующие
периферийные устройства:
Flash
память программ объемом 60 kB +
256 B информационной памяти;
ОЗУ данных объемом 2 kB;
6 двунаправленных 8-битных портов ввода/вывода;
2 тактовых генератора для подключения внешних резонаторов, плюс
встроенный RC генератор DCO;
аппаратный умножитель 16х16 бит;
супервизор питания;
сторожевой таймер WatchDog;
16-ти битный таймер А3 с тремя модулями захвата/сравнения (СС модули);
16-ти битный таймер В7 с семью модулями захвата/сравнения;
2 универсальных синхронно-асинхронных последовательных приемо-передатчика
USART;
8-канальный 12-ти разрядный АЦП;
аналоговый компаратор.
Микросхема MSP430F149 упакована в миниатюрный
пластиковый квадратный корпус с 64 выводами QFP (Quad Flat Pack). Название, назначение и номера
выводов представлены в таблице 4. В колонке Ввод/Вывод приняты обозначения: I - вход, O - выход, I/O - двунаправленный, S - вывод питания
Таблица 4
Наименование
|
№ вывода
|
Ввод/ Вывод
|
Назначение
|
AVCC
|
64
|
S
|
Аналоговое питание для АЦП
|
AVSS
|
62
|
S
|
Аналоговая земля для АЦП
|
DVCC
|
1
|
S
|
Питание для цифровой части
|
DVSS
|
63
|
S
|
Цифровая земля
|
P1.0/TACLK
|
12
|
I/O
|
Бит 0 порта1 ; Вход
тактирования для Таймера А
|
P1.1/TA0
|
13
|
I/O
|
Бит 1 порта1 ; Вход/Выход
модуля 0 захвата/сравнения Таймера А
|
P1.2/TA1
|
14
|
I/O
|
Бит 2 порта1 ; Вход/Выход
модуля 1 захвата/сравнения Таймера А
|
P1.3/TA2
|
15
|
I/O
|
Бит 3 порта1 ; Вход/Выход
модуля 2 захвата/сравнения Таймера А
|
P1.4/SMCLK
|
16
|
I/O
|
Бит 4 порта1 ; Выход
сигнала тактирования SMCLK
|
P1.5/TA0
|
17
|
I/O
|
Бит 5 порта1 ; Выход модуля
сравнения 0 Таймера А
|
P1.6/TA1
|
18
|
I/O
|
Бит 6 порта 1 ; Выход
модуля сравнения 1 Таймера А
|
P1.7/TA2
|
19
|
I/O
|
Бит 7 порта 1 ; Выход
модуля сравнения 2 Таймера А
|
P2.0/ACLK
|
20
|
I/O
|
Бит 0 порта 2 ; Выход
сигнала тактирования ACLK
|
P2.1/TAINCLK
|
21
|
I/O
|
Бит 1 порта 2 ; Вход
тактирования для Таймера А
|
P2.2/CAOUT/TA0
|
22
|
I/O
|
Бит 2 порта 2; Выход
Аналогового компаратора; Вход/Выход модуля 0 захвата/сравнения Таймера А
|
P2.3/CA0/TA1
|
23
|
I/O
|
Бит 3 порта 2 ; Вход
аналогового компаратора; Выход модуля сравнения 1 Таймера А
|
P2.4/CA1/TA2
|
24
|
I/O
|
Бит 4 порта 2 ; Вход
аналогового компаратора; Выход модуля сравнения 2 Таймера А
|
P2.5/ROSC
|
25
|
I/O
|
Бит 5 порта 2 ; Вывод для
подключения внешнего резистора DCO
|
P2.6/ADC12CLK
|
26
|
I/O
|
Бит 6 порта 2 ; Вход
внешнего тактирование АЦП
|
P2.7/TA0
|
27
|
I/O
|
Бит 7 порта 2 ; Выход
модуля сравнения 0 Таймера А
|
P3.0/STE0
|
28
|
I/O
|
Бит 0 порта 3 ; Разрешение
работы передатчика SPI0
|
P3.1/SIMO0
|
29
|
I/O
|
Бит 1 порта 3 ; Вход/выход
приемник-передатчика SPI0
|
P3.2/SOMI0
|
30
|
I/O
|
Бит 2 порта 3 ; Вход/выход
приемник-передатчика SPI0
|
P3.3/UCLK0
|
31
|
I/O
|
Бит 3 порта 3 ; Вход
внешнего тактирования USART/SPI 0
|
P3.4/UTXD0
|
32
|
I/O
|
Бит 4 порта 3 ; Выход
передатчика UART 0
|
P3.5/URXD0
|
33
|
I/O
|
Бит 5 порта 3 ; Вход
приемника UART 0
|
P3.6/UTXD1
|
34
|
I/O
|
Бит 6 порта 3 ; Выход
передатчика UART 1
|
P3.7/URXD1
|
35
|
I/O
|
Бит 7 порта 3 ; Вход
приемника UART 1
|
P4.0/TB0
|
36
|
I/O
|
Бит 0 порта 4; Вход/Выход
модуля 0 захвата/сравнения Таймера B
|
P4.1/TB1
|
37
|
I/O
|
Бит 1 порта 4; Вход/Выход
модуля 1 захвата/сравнения Таймера B
|
P4.2/TB2
|
38
|
I/O
|
Бит 2 порта 4; Вход/Выход
модуля 2 захвата/сравнения Таймера B
|
P4.3/TB3
|
39
|
I/O
|
Бит 3 порта 4; Вход/Выход
модуля 3 захвата/сравнения Таймера B
|
P4.4/TB4
|
40
|
I/O
|
Бит 4 порта 4; Вход/Выход
модуля 4 захвата/сравнения Таймера B
|
P4.5/TB5
|
41
|
I/O
|
Бит 5 порта 4; Вход/Выход
модуля 5 захвата/сравнения Таймера B
|
P4.6/TB6
|
42
|
I/O
|
Бит 6 порта 4; Вход/Выход
модуля 6 захвата/сравнения Таймера B
|
P4.7/TBCLK
|
43
|
I/O
|
Бит 7 порта 4; Вход
внешнего тактирования Таймера B
|
P5.0/STE1
|
44
|
I/O
|
Бит 0 порта 5; Разрешение
работы передатчика SPI1
|
P5.1/SIMO1†
|
45
|
I/O
|
Бит 1 порта 5; Вход/выход
приемник-передатчика SPI1
|
P5.2/SOMI1†
|
46
|
I/O
|
Бит 2 порта 5; Вход/выход
приемник-передатчика SPI1
|
P5.3/UCLK1†
|
47
|
I/O
|
Бит 3 порта 5; Вход
внешнего тактирования USART/SPI 1
|
P5.4/MCLK
|
48
|
I/O
|
Бит 4 порта 5; Выходной
сигнал тактирования MCLK
|
P5.5/SMCLK
|
49
|
I/O
|
Бит 5 порта 5; Выходной
сигнал тактирования SMCLK
|
P5.6/ACLK
|
50
|
I/O
|
Бит 6 порта 5; Выходной
сигнал тактирования ACLK
|
P5.7/TBOUTH
|
51
|
I/O
|
Бит 7 порта 5; Вход
переключения выходов Таймера В в треть состояние
|
P6.0/A0
|
59
|
I/O
|
Бит 0 порта 6; Аналоговый
вход 0 АЦП
|
P6.1/A1
|
60
|
I/O
|
Бит 1 порта 6; Аналоговый
вход 1 АЦП
|
P6.2/A2
|
61
|
I/O
|
Бит 2 порта 6; Аналоговый
вход 2 АЦП
|
P6.3/A3
|
2
|
I/O
|
Бит 3 порта 6; Аналоговый
вход 3 АЦП
|
P6.4/A4
|
3
|
I/O
|
Бит 4 порта 6; Аналоговый
вход 4 АЦП
|
P6.5/A5
|
4
|
I/O
|
P6.6/A6
|
5
|
I/O
|
Бит 6 порта 6; Аналоговый
вход 6 АЦП
|
P6.7/A7
|
6
|
I/O
|
Бит 7 порта 6; Аналоговый
вход 7 АЦП
|
RST/NMI
|
58
|
I
|
Вход внешнего сброса; Вход
немаскируемого прерывания
|
TCK
|
57
|
I
|
Вход тактирования JTAG
интерфейса
|
TDI/TCLK
|
55
|
I
|
Вход данных JTAG
интерфейса
|
TDO/TDI
|
54
|
I/O
|
Вход/выход данных JTAG
интерфейса
|
TMS
|
56
|
I
|
Вход тестового режима JTAG
интерфейса
|
VeREF+
|
10
|
I
|
Вход внешнего опорного
напряжения АЦП
|
VREF+
|
7
|
O
|
Выход встроенного опорного
напряжения АЦП
|
VREF−/VeREF−
|
11
|
I
|
Общий провод опорного
напряжения АЦП
|
XIN
|
8
|
I
|
Вход тактового генератора LFXT1
|
XOUT
|
9
|
O
|
Выход тактового генератора LFXT1
|
XT2IN
|
53
|
I
|
Вход тактового генератора XT2
|
XT2OUT
|
52
|
O
|
Выход тактового генератора XT2
|
3.2 Система
прерываний
Прерывания микроконтроллера генерируются внешними и/или внутренними
событиями, такими как, перепад напряжения на внешних портах, переполнение
таймера, получение байта данных на входе USART, окончание преобразования АЦП и др.
В MSP микроконтроллерах прерывания могут
быть маскируемыми, немаскируемыми (системные сбросы) и условно немаскируемыми.
Для возникновения маскируемого прерывания необходимо, чтобы это прерывание было
разрешено индивидуальным битом разрешения, а также бит GIE в статусном регистре SR, был установлен в 1. Немаскируемые прерывания не имеют бит
индивидуального разрешения, и не зависят от состояния бита GIE. Условно немаскируемые прерывания
имеют биты индивидуального разрешения, но не зависят от состояния GIE.
Причиной немаскируемых прерываний могут быть:
включение питания микроконтроллера;
срабатывания WatchDog таймера;
внешний сигнал RESET.
Причиной условно немаскируемых прерываний могут быть:
активный уровень на внешнем выводе NMI;
срыв генерации тактового генератора;
доступ к Flash памяти во
время ее программирования.
Маскируемые прерывания генерируются периферийными модулями.
Для обслуживания прерываний используются подпрограммы обработки
прерываний ISR (Interrupt Service Routine), начальные адреса которых сведены в таблицу векторов
прерываний. Таблица векторов прерываний занимает самую верхнюю область Flash памяти программы и состоит из 16
слов (для MSP430F2xxx - 32 слова,
для MSP430F5xx - 64 слова). В
каждом слове (векторе) должен быть записан адрес ISR, на которую будет передано управление в случае
возникновения прерывания. Каждый вектор прерывания соответствует одному или
нескольким источникам прерывания. Прерывание вызывается установкой (как
правило, аппаратной) флага требования прерывания того или иного устройства.
В том случае, если прерывание берется, флаг требования прерывания
сбрасывается автоматически, если он является единственным для данного вектора,
в противном случае, этот флаг необходимо сбрасывать программно в ISR. В этом случае в ISR необходимо программное тестирование
флагов для определения источника, вызвавшего прерывание.
При одновременном возникновении нескольких прерываний управление
передается по вектору, имеющему более высокий приоритет. В MSP микроконтроллерах вектора с большим
адресом имеют более высокий приоритет. Различные модели MSP контроллеров могут иметь различные
таблицы векторов прерываний. Назначения векторов прерываний для модели MSP430F149 приведены в таблице 5.
Таблица 5
Приоритет
|
Адрес
|
Источник
|
Тип
|
15 высший
|
FFFEh
|
Reset, WatchDog,
включен.питания
|
Немаскир.
|
14
|
FFFCh
|
NMI, авария осциллят., доступ к Flash
|
Услов. немаск.
|
13
|
FFFAh
|
Модуль СС0 таймера B7
|
Маскир.
|
12
|
FFF8h
|
Модули СС1-СС6 таймера В7,
переполнение таймера B7
|
Маскир.
|
11
|
FFF6h
|
Аналоговый компаратор
|
Маскир.
|
10
|
FFF4h
|
WatchDog таймер в режиме интервального таймера
|
Маскир.
|
9
|
FFF2h
|
Приемник USART0
|
Маскир.
|
8
|
FFF0h
|
Передатчик USART0
|
Маскир.
|
7
|
FFEEh
|
АЦП
|
Маскир.
|
6
|
FFECh
|
СС0 таймера А3
|
Маскир.
|
5
|
FFEAh
|
СС1,СС2 таймера А3,
переполнение таймера А3
|
Маскир.
|
4
|
FFE8h
|
Параллельный порт P1
|
Маскир.
|
3
|
FFE6h
|
Приемник USART1
|
Маскир.
|
2
|
FFE4h
|
Передатчик USART1
|
Маскир.
|
1
|
FFE2h
|
Параллельный порт P2
|
Маскир.
|
0 низший
|
FFE0h
|
Зарезервирован
|
Маскир.
|
При возникновении прерываний процессор выполняет следующие действия:
1) если процессор находился в активном режиме, он завершает исполнение
текущей инструкции; если процессор находился в остановленном режиме - он
переходит в активное состояние;
2) программный счетчик PC, указывающий на следующую инструкцию, сохраняется в стеке;
) статусный регистр SR
сохраняется в стеке;
) вырабатывается прерывание с наивысшим приоритетом;
) сбрасывается флаг требования прерывания, если данному вектору
соответствует единственному источник;
) все биты статусного регистра SR кроме SCG0
сбрасываются в 0; т.к. бит GIE=0
дальнейшие маскируемые прерывания запрещаются;
) в программный счетчик PC загружается содержимое выбранного вектора прерывания.
Как правило, индивидуальные биты разрешения и флаги требования прерывания
сосредоточены в регистрах управления периферийных устройств. Однако ряд битов,
ответственных за исполнение прерываний находятся в регистрах, расположенных в
области SFR. Ко всем регистрам в области SFR можно обращаться, используя только
байтовые формы инструкций. Рассмотрим содержимое этих регистров.
Ø Регистр IE1 (Interrupt Enable) - разрешение прерываний, адрес
- 0, начальное значение 0.
UTXIE0
|
URXIE0
|
ACCVIE
|
NMIIE
|
-
|
-
|
OFIE
|
WDTIE
|
· Бит 7 -
UTXIE0 (USART0 Transmit Interrupt Enable) - разрешение прерывания от передатчика USART0.
· Бит 6 - URXIE0 (USART0 Receive Interrupt Enable) - разрешение прерывания от приемника USART0.
· Бит 5 - ACCVIE (Access Violation Interrupt Enable) - разрешение прерывания при нарушении доступа к Flash памяти (см. п. 3.12.2).
· Бит 4 - NMIIE (NMI Interrupt Enable) - разрешение прерывание от внешнего входа NMI (Non Masked
Interrupt).
· Бит 3,2 - зарезервированы.
· Бит 1 - OFIE (Oscillator Fault Interrupt Enable) - разрешение прерывание при аварии
осциллятора.
· Бит 0 - WDTIE
(WatchDog Timer Interrupt Enable) разрешение прерывания от сторожевого таймера, если
он работает в режиме интервального таймера.
Все биты регистра IE1 устанавливаются/сбрасываются программно для
разрешения/запрещения соответствующих прерываний.
Ø Регистр IE2 (Interrupt Enable) - разрешение прерываний, адрес
- 1, начальное значение 0.
-
|
-
|
UTXIE1
|
URXIE1
|
-
|
-
|
-
|
-
|
· Биты 7,6 - зарезервированы.
· Бит 5 - UTXIE1 (USART1 Transmit Interrupt Enable) - разрешение прерывания от передатчика USART1.
· Бит 4 - URXIE1 (USART1 Receive Interrupt Enable) - разрешение прерывания от приемника USART1.
· Биты 3,2,1,0 - зарезервированы.
Все биты регистра IE2 устанавливаются/сбрасываются программно для
разрешения/запрещения соответствующих прерываний.
Ø Регистр IFG1 (Interrupt Flag) - флаги прерываний, адрес - 2,
начальное значение 82h.
UTXIFG0
|
URXIFG0
|
-
|
NMIIFG
|
-
|
-
|
OFIFG
|
WDTIFG
|
· Бит 7 -
UTXIFG0 (USART0 Transmit Interrupt Flag) - флаг требования прерывания от передатчика USART0. Устанавливается аппаратно при готовности USART0 передать очередной байт данных, или программно.
Сбрасывается аппаратно записью новые данные в буфер передатчика USART0.
· Бит 6 - URXIFG0
(USART0 Receive Interrupt Flag) - флаг требования прерывания от приемника USART0. Устанавливается аппаратно, если USART0 принял очередной байт данных, или
программно. Сбрасывается чтением данных из буфера приемника.
· Бит 5 - зарезервирован.
· Бит 4 - NMIIFG
(NMI Interrupt Flag) - флаг требования прерывание от внешнего входа NMI. Устанавливается аппаратно, если на
входе NMI был зарегистрирован активный фронт,
или программно. Вызывает переход на ISR с адресом FFFCh.
Сбрасывается программно.
· Бит 3,2 - зарезервированы.
· Бит 1 - OFIFG
(Oscillator Fault Interrupt Flag) - флаг требования прерывание при аварии осциллятора.
Устанавливается аппаратно, если в течение интервала времени, приблизительно
равного 50 μs,
отсутствуют импульсы на выходе тактового генератора. Сбрасывается программно.
· Бит 0 - WDTIFG
(WatchDog Timer Interrupt Flag) флаг требования прерывания от сторожевого таймера,
если он работает в режиме интервального таймера. Устанавливается аппаратно при
переполнении таймера или программно. Сбрасывается аппаратно, если берется
прерывание с адресом FFF4h, или программно.
Ø Регистр IFG2 (Interrupt Flag) - флаги прерываний, адрес - 2,
начальное значение 20h.
-
|
-
|
UTXIFG1
|
URXIFG1
|
-
|
-
|
-
|
-
|
· Биты 7,6 - зарезервированы.
· Бит 5 - UTXIFG1 (USART1 Transmit Interrupt Flag) - флаг требования прерывания от передатчика USART1. Устанавливается аппаратно при
готовности USART1 передать очередной байт данных, или
программно. Сбрасывается аппаратно записью новые данные в буфер передатчика USART1.
· Бит 4 - URXIFG1
(USART1 Receive Interrupt Flag) - флаг требования прерывания от приемника USART1. Устанавливается аппаратно, если USART1 принял очередной байт данных, или
программно. Сбрасывается аппаратно чтением данных из буфера приемника.
· Биты 3,2,1,0 - зарезервированы.
Ниже приведен пример структуры программы с использованием прерывания по
приему данных от USART0. Текст
программы приводиться для трансляции компилятором фирмы IAR.
#include <msp430x14x.h> ; включаем стандартный файл определений, чтобы
; можно было обращаться к регистрам и битам по
; их именам
ORG
1100h ; настраиваем счетчик команд на
начало Flash памяти
Start:
mov #0A00h, SP ; настраиваем указатель стека на конец ОЗУ
. . .
bis.b #URXIE0, &IE1 ;
разрешаем прерывание от приемника USART0
. . .
eint ;
глобально разрешаем прерывание
loop: ;
начало рабочего цикла программы
. . .
jmp loop ; конец рабочего цикла программы
RxISR:
; начало подпрограммы обработки прерывания от
; приемника USART0
. . .
reti ;
конец подпрограммы обработки прерывания
ORG 0FFF2h
DW RxISR ; инициализация вектора прерывания
; приемника USART0
ORG 0FFFEh
DW Start ; установка адреса начала программы
END ;
конец программного модуля
.3 Система
тактирования
Внутреннее тактирование микроконтроллеров MSP430 осуществляется с помощью трех различных тактовых
сигналов:
· MCLK - Master Clock -
используется для тактирования процессорного ядра микроконтроллера;
· SMCLK - Sub-Main Clock - используется для тактирования периферийных
устройств;
· ACLK - Auxiliary Clock - вспомогательная
частота, также может использоваться для тактирования периферийных устройств.
В качестве источников для этих частот могут использоваться два встроенных
генератора, предназначенных для работы с внешними резонаторами - LFXT1 и XT2, и управляемый генератор DCO (Digital Controlled Oscillator), выполненный на базе встроенного RC- генератора.
Генератор LFXT1 может
работать в двух режимах - низкочастотном и высокочастотном. В низкочастотном
режиме он адаптирован на прямое подключение стандартного резонатора частотой
32768 Hz. В высокочастотном режиме он может
работать с резонаторами в частотном диапазоне от 450 kHz до 8 MHz.
Частоту генератора DCO
можно перестраивать программно в диапазоне ≈ 120 kHz - 5 MHz.
Следует заметить, однако, что частота, генерируемая DCO, существенно зависит от напряжения питания и
температуры.
В реальных системах для тактирования CPU и быстрой периферии используются, как правило,
высокочастотные сигналы MCLK и
SMCLK соответственно, а для тактирования
медленной периферии - сигнал ACLK с
частотой 32768 Hz. Генератор DCO используется для приложений, не
требующих высокой точности и стабильности генерации временных интервалов.
Рисунок 2. Структурная схема модуля тактирования
Как видно из рисунка, систему тактирования можно гибко настраивать,
исходя из требований прикладной задачи, которая реализуется MSP микроконтроллером. В качестве
источника для частоты MCLK
можно программным образом выбрать частоты, выдаваемые генераторами LFXT1, XT2 или DCO.
Кроме того, входную частоту сигнала MCLK можно снизить, используя предварительный делитель частоты. Наконец, для
уменьшения потребления микроконтроллера, частоту MCLK можно выключить с помощью бита CPUOFF статусного регистра SR. Частоты ACLK и SMCLK
также можно понизить с помощью предварительных делителей, а частоту SMCLK можно выключить с помощью бита SCG1 статусного регистра SR. Генератор DCO использует частоту встроенного RC генератора, который для минимизации
общего потребления так же может быть выключен с помощью бита статусного
регистра SCG0. Так как центральный процессор
тактируется частотой MCLK,
а периферийные устройства частотами ACLK или SMCLK, имеется возможность использования
нескольких режимов пониженного потребления LPM (Low Power Mode) всего микроконтроллера в
зависимости от комбинации бит CPUOFF,
OSCOFF, SCG1, SCG0
статусного регистра.
Различают всего 6 режимов LPM.
Комбинации управляющих бит и описание режимов LPM приведено в таблице 6.
Таблица 6
Режим
|
SCG1
|
SCG0
|
OscOff
|
CPUOff
|
Описание
|
Активный
|
0
|
0
|
0
|
0
|
CPU и периферия активны
|
LPM0
|
0
|
0
|
0
|
1
|
CPU выключено; вся периферия активна
|
LPM1
|
0
|
1
|
0
|
1
|
CPU выключен; DCO выключен, если не
используется для MCLK или SMCLK; вся периферия активна
|
LPM2
|
1
|
0
|
0
|
1
|
CPU, SMCLK , DCO выключены; RC генератор и
ACLK активны
|
LPM3
|
1
|
1
|
0
|
1
|
Активен только ACLK
|
LPM4
|
X
|
x
|
1
|
1
|
CPU и вся периферия остановлены
|
Во всех режимах пониженного потребления, включая LPM4, ОЗУ сохраняет свое содержимое, на портах вывода
удерживается логическое состояние, предшествующее переходу в низко потребляющий
режим.
Уровень потребления микросхемы различен для разных режимов LPM. Его типовое значение при питании в
3 В соответствует следующим значениям:
· Активный - 340 μA/MHz;
· LPM0 - 70 μA/MHz;
· LPM2 - 17 μA/MHz;
· LPM3 - 2 μA/MHz;
· LPM4 - 0.1 μA/MHz.
Выход из режимов LPM0-LPM3 осуществляется по прерыванию от
работающих периферийных устройств или сигналом RESET. Выход из режимов LPM4 может быть осуществлен только по сигналу RESET, т.к. вся периферия заморожена.
Естественно внешний вывод RESET/NMI должен быть сконфигурирован для
функции сброса.
При вхождении в прерывание из режимов LPM процессорное ядро и вся периферия переходит в
активное состояние, т.к. во все биты статусного регистра записываются нули (см.
п. 3.2 ). Интересен тот факт, что при выходе из подпрограммы обработки
прерывания с помощью команды RETI,
режим LPM автоматически восстанавливается,
т.к. в SR загружается из стека его предыдущее
состояние. Если после прерывания, необходимо, чтобы CPU находился в активном режиме, перед выходом из
прерывания необходимо подкорректировать исходное состояние SR, сохраненное в стеке. Это можно
сделать, например, командой bic #CPUOFF, 0(SP)
В этом случае команда RETI
загрузит в SR значение со сброшенным битом CPUOFF.
Кроме битов, расположенных в статусном регистре, на работу модуля
тактирования влияют биты, расположенные в собственных регистрах управления.
Регистры управления модуля тактирования приведены в таблице 7. Ко всем
регистрам следует обращаться с помощью байтовых форм инструкций.
Таблица 7
Наименование
|
Назначение
|
Адрес
|
Началь. Значение
|
BCSCTL1
|
Регистр управления 1
системы тактирования
|
57h
|
84h
|
BCSCTL2
|
Регистр управления 2
системы тактирования
|
58h
|
0
|
DCOCTL
|
Регистр управления DCO
|
56h
|
60h
|
IE1
|
Регистр разрешения
прерывания
|
0
|
0
|
IFG1
|
Регистр флагов прерывания
|
2
|
0
|
Ø BCSCTL1 (Base Clock System Control 1) - регистр управление базовой системы тактирования
1.
XT2OFF
|
XTS
|
DIVA 1,0
|
XT5V
|
RSEL 2,1,0
|
· Бит 7 - XT2OFF - выключение генератора XT2. Устанавливается/сбрасывается программно для запрета/разрешения
работы генератора XT2. По сбросу в
этот бит записывается 1, поэтому по умолчанию генератор XT2 запрещен.
· Бит 6 - XTS (XT1 Select) - выбор режима генератора LFXT1. Устанавливается программно для выбора режима работы
LFXT1:
0 - низкочастотный режим (Low Frequency Mode);
- высокочастотный режим (High Frequency Mode).
· Биты 5 и 4 - DIVA (Divider ACLK) - делитель частоты ACLK. Устанавливают коэффициент делителя для частоты ACLK
DIVA1
|
DIVA0
|
Делитель
|
0
|
0
|
1 / 1
|
0
|
1
|
1 / 2
|
1
|
0
|
1 / 4
|
1
|
1
|
1 / 8
|
Бит 3 - XT5V - всегда должен быть сброшен.
· Биты 2,
1, 0 - RSEL (Resistor Select) - выбор резистора. Комбинация этих бит устанавливает номинал внутреннего
резистора RC генератора, что, в свою очередь,
приводит к перестройке диапазона частоты, генерируемой RC генератором. При сбросе в эту группу бит аппаратно
записывается комбинация 100b, что
соответствует среднему диапазону частот. Зависимость генерируемой частоты DCO от содержимого этих бит будет
рассмотрена позже.
SELM 1,0
|
DIVM 1,0
|
SELS
|
DIVS 1,0
|
DCOR
|
· Бит 7, 6 - SELM (Select MCLK) - выбор источника для MCLK
SELM1
|
SELM0
|
Источник
|
0
|
0
|
DCOCLK
|
0
|
1
|
DCOCLK
|
1
|
0
|
XT2CLK
|
1
|
1
|
LFXT1CLK
|
· Биты 5,
4 - DIVM (Divider MCLK) - делитель частоты MCLK. Устанавливают коэффициент делителя для частоты MCLK
DIVM1
|
DIVM0
|
Делитель
|
0
|
0
|
1 / 1
|
0
|
1
|
1 / 2
|
1
|
0
|
1 / 4
|
1
|
1
|
1 / 8
|
· Бит 3 - SELS (Select SMCLK) - выбор источника для SMCLK
0 - источник
DCOCLK;
- источник
XT2CLK.
· Биты 2 и 1 - DIVS (Divider SMCLK) - делитель частоты SMCLK. Устанавливают коэффициент делителя для частоты SMCLK
DIVS1DIVS0Делитель
|
|
|
0
|
0
|
1 / 1
|
0
|
1
|
1 / 2
|
1
|
0
|
1 / 4
|
1
|
1
|
1 / 8
|
· Бит 0 - DCOR (DCO Resistor) - выбор частотозадающего резистора
для RC генератора DCO
0 - внутренний резистор;
- внешний резистор, подключаемый к порту P2.5.
В том случае, если выбран внутренний резистор, его значение
устанавливается битами RSEL
регистра BCSCTL1.
Ø DCOCTL (DCO Control) - регистр
управление DCO.
· Биты 7, 6 , 5 - DCO -
содержимое этих бит подстраивает частоту DCO внутри диапазона RC генератора. Таким образом, частота DCO зависит как от битов RSEL, так и от рассматриваемых битов. Частоту,
генерируемую DCO, принято обозначать как FDCOXY , где X- значение битов RSEL регистра BCSCTL1, а Y - значение битов DCO регистра DCOCTL. В технической документации приведены типовые
значения частот FDCO при
напряжении питания 3 В
FDCO03
≈ 0.13 MHz
FDCO13
≈ 0.18 MHz
FDCO23
≈ 0.28 MHz
FDCO33
≈ 0.47 MHz
FDCO43
≈ 0.75 MHz
FDCO53
≈ 1.3 MHz
FDCO63
≈ 2.0 MHz
FDCO73
≈ 3.2 MHz
FDCO77
≈ 4.9 MHz
При сбросе в эти биты записывается значение 011b для установки средней частоты генерации DCO. Таким образом, после сброса
микроконтроллера его тактирование осуществляется от генератора DCO с частотой FDCO43 ≈ 0.75 MHz.
· Биты 4, 3, 2, 1, 0 - MOD (Modulator) - смешивает частоты FDCO и FDCO+1 в пропорции, определяемой содержанием этих бит.
Средний период генерируемой частоты можно определить по формуле
T = ((32-MODx)*TDCO + MODx *TDCO+1) / 32,
где TDCO и TDCO+1 - периоды частот FDCO и FDCO+1
соответственно.
Усредненную частоту генерации DCO можно определить по формуле:
F =
32* FDCO* FDCO+1/((32-MODx)*
FDCO+1 + MODx * FDCO)
Регистры IE1 и IFG1, содержащие бит разрешения
прерывания и флаг аварии осцилляторов, был рассмотрен в разделе 3.2.
Многоступенчатая подстройка частоты DCO позволяет достаточно точно (11 двоичных разрядов)
выставить требуемую частоту генерации. Эта техника используется при построении
программно-аппаратного умножителя частоты, что позволяет получить частоту DCO в определенное количество раз больше
чем опорная частота. В качестве опорной частоты, как правило, используется
генератор LFXT1 со стабильным внешним резонатором
32768 Hz, а высокие частоты MCLK и SMCLK генерируются с помощью DCO. Для обеспечения стабильности DCO, необходимо программно организовать
периодическое измерение и подстройку генерируемой частоты таким образом, чтобы
отношение FDCO и LFXT1CLK
оставалось постоянным. Такая техника, несмотря на некоторую сложность
реализации, дает возможность иметь хорошую производительность процессора при
низком потреблении и уровне излучаемых электромагнитных помех.
Для удобства подстройки частоты при организации умножителя может
потребоваться, чтобы номинальная частота DCO соответствовала средним значениям полей DCO и MOD регистра DCOCTL. Для достижения этого можно использовать режим внешнего резистора RC-генератора. Его номинал подбирается
таким образом, чтобы удовлетворить данным условиям.
Следует добавить также, что при перестройке DCO с помощью поля RSEL его частота изменяется в соотношении F RSEL+1 / F RSEL ≈ 1.65
При перестройке DCO с
помощью поля DCO его частота изменяется в соотношении
F DCO+1 / F DCO ≈ 1.12
В качестве демонстрации механизма работы модулятора DCO приведем следующий пример.
Предположим, поля RSEL = 4, DCO = 3 и MOD = 10.
Тогда FDCO43 = 750 kHz, а FDCO44
= 750 *1.12 = 840 kHz
Так как значение поля MOD
отлично от нуля, на выходе DCO
получим периодическую последовательность импульсов, из которых 10 периодов
соответствуют частоте 840 kHz, а
22 периода - частоте 750 kHz.
Усредненная частота определиться как
F=32*750*840/((32-10)*840
+ 10*750)=775.98 kHz
ПРИМЕР .
Проинициализировать тактовую систему MSP430F14x.
Исходные данные:
LFXT1
= 32768 Hz
XT2 =
8 MHz
MCLK =
8 MHz
SMCLK
= 4 MHz
ACLK =
32768 Hz
Для инициализации системы тактирования необходимо выполнить следующие
шаги:
1) Включить генератор XT2;
2) Очистить бит OFIFG
в регистре IFG1;
) Выдержать паузу не менее 50 μs ( см. описание IFG1.OFIFG в п.3.2);
) Проверить состояние бита OFIFG;
) Если OFIFG=1 (генератор
еще не завелся) перейти к пункту 2;
) Настроить MCLK, SMCLK
) Выключить DCO.
bic.b #XT2OFF, &BCSCTL1 ; включить XT2
L1: bic.b #OFIFG, &IFG1 ; сбросить OFIFG;
mov #0FFh, R4 ; программная задержка
L2: dec R4 ; пустыми циклами
jnz L2 ; закончена?
bit.b #OFIFG, &IFG ;
тестирование OFIFG
jnz L1 ; OFIFG=0 ?;
mov #SELM1+SELS+DIVS1,
&BCSCTL2 ; MCLK, SMCLK от XT2,
; для SMCLK - делитель 1 / 2
bis.b #SCG0, SR ; выключить DCO
.4 Сторожевой
таймер
Сторожевой таймер (WatchDog Timer)
предназначен для сброса CPU, в
том случае если программа, в результате каких-либо сбоев, начинает исполнять
несанкционированные команды. Сторожевой таймер, как правило, организуется в
виде свободно бегущего таймера-счетчика, который при его переполнении вызывает
аппаратный сброс всего микроконтроллера. Для исключения непредусмотренного
сброса, программа должна сама периодически сбрасывать этот таймер.
В MSP микроконтроллерах 16-ти битный
сторожевой таймер может работать собственно в режиме WatchDog или в режиме интервального таймера.
В режиме интервального таймера аппаратный сброс при переполнении не
производится. Вместо этого генерируется прерывание с адресом вектора FFF4h.
Период переполнения зависит, во-первых, от частоты тактирования таймера,
и, во-вторых, от коэффициента делителя входной частоты.
Регистры управления модуля сторожевого таймера приведены в таблице 8.
Таблица 8
Наименование
|
Назначение
|
Адрес
|
Началь. Значение
|
WDTCTL
|
Регистр управления
|
120h
|
6900h
|
IE1
|
Регистр разрешения
прерывания
|
0
|
0
|
IFG1
|
Регистр флагов прерывания
|
2
|
0
|
Регистр управления WDTCTL
содержит также биты управления режимом внешнего вывода RESET/NMI. К
этому регистру необходимо обращаться только с помощью словных форм инструкций. Регистры
IE1 и IFG1, содержащие биты разрешения и флаги прерываний
соответственно были рассмотрены в разделе 3.2
Ø WDTCTL (WatchDog Timer Control) - регистр управления сторожевым
таймером.
WDTHOLD
|
WDTNMIES
|
WDTNMI
|
WDTMSEL
|
WDTCNTCL
|
WDTSSEL
|
WDTIS 1,0
|
· Биты 15 - 8 - WDTPW ( WDT Password) - пароль для обращения к регистру WDTCTL. При чтении это поле всегда содержит
значение 69h. При записи в это поле необходимо
записывать значение 5Ah, в
противном случае будет генерироваться системный сброс.
· Бит 7 - WDTHOLD
- остановка сторожевого таймера.
0 - таймер активен;
- таймер остановлен.
· Бит 6 - WDTNMIES (NMI Edge Select) - выбор активного фронта вывода NMI.
0 - активен растущий фронт;
- активен падающий фронт.
· Бит 5 - WDTNMI - определяет функцию вывода RESET/NMI
0 - вывод функционирует как RESET;
- вывод функционирует как NMI.
· Бит 4 - WDTMSEL (WDT Mode Select) - выбор режима сторожевого таймера
0 - сторожевой таймер;
- интервальный таймер.
· Бит 3 - WDTCNTCL (WDT Counter Clear) - сброс сторожевого таймера. Запись логической 1 в
этот бит приводит к сбросу сторожевого таймера. В том случае, если сторожевой
таймер разрешен (WDTHOLD=0)
программа должна периодически устанавливать этот бит во избежание системного
сброса. Этот бит сбрасывается в 0 автоматически, поэтому при чтении содержимое
этого бита всегда 0.
· Бит 2 - WDTSSEL
(WDT Source Select) - выбор источника тактирования.
0 - тактирование осуществляется частотой SMCLK;
- тактирование осуществляется частотой ACLK.
· Бит 1,0 - WDTIS (WDT Interval Select) - выбор интервала переполнения сторожевого таймера.
Комбинация состояния этих бит дает возможность установить период переполнения
счетчика. Если F - частота
тактирования счетчика в Герцах, то период переполнения в секундах определиться
следующим образом:
WDTIS1
|
WDTIS0
|
Интервал
|
0
|
0
|
32768 / F
|
0
|
1
|
8192 / F
|
1
|
0
|
512 / F
|
1
|
1
|
64 / F
|
Следует помнить, что даже в тех приложениях, где планируется использовать
сторожевой таймер, подключать его имеет смысл только тогда, когда вся программы
отлажена. Поэтому обычно на этапе разработке программы его отключают. Сделать
это можно, например, командой
mov #5A80h, &WDTCTL
или#WDTPW+WDTHOLD,
&WDTCTL
ПРИМЕР. Сбросить сторожевой таймер и установить его режим работы для
интервала переполнения в диапазоне 0.1 - 0.5 секунды. Тактирование осуществлять
от ACLK = 32768 Hz.
Если выбрать комбинацию WDTIS
= 01b, то период переполнения определиться
как
T =
8196/32768 = 0.25 s.
Для установки режима и сброса таймера необходимо выполнить команду
mov #WDTPW+WDTCNTCL+WDTSSEL+WDTIS0, &WDTCTL
или более короткий эквивалент этой команды
mov #5A0Dh, &WDTCTL
.5 Аппаратный
умножитель
В системе команд MSP
микроконтроллеров нет команд, производящих умножение и деление. Однако в
старших моделях имеется периферийное устройство, с помощью которого можно
производить 8-ми и 16-ти разрядные операции умножения. Наличие быстрого
аппаратного умножителя с возможностью накопления результата диктуется
необходимостью, в ряде случаев, использования MSP микроконтроллеров для цифровой обработки сигналов в
реальном времени, например для реализации цифровых фильтров.
Встроенный аппаратный умножитель позволяет производить умножение и
умножение с накоплением знаковых и беззнаковых 8-ми и 16-ти битных операндов с
получением 32-ти разрядного результата.
Для того чтобы выполнить операцию умножения необходимо первый операнд
записать в определенный регистр умножителя, в зависимости от того, какая именно
требуется операция, после чего записать второй операнд в специальный регистр.
Практически сразу после этого из регистра результата можно вычитывать продукт
умножения. Операция умножения с накоплением производит перемножение содержимого
регистров первого и второго операндов и сложение полученного произведения с
текущим содержимым регистра результата. Результат умножения сохраняется в трех
16-ти разрядных регистрах - младшего и старшего слова произведения, и регистре
расширения, где фиксируется переполнение при сложении или знак результата.
Регистры аппаратного умножителя приведены в таблице 9
Таблица 9
Наименование
|
Назначение
|
Адрес
|
MPY
|
Регистр первого операнда
для беззнакового умножения
|
130h
|
MPYS
|
Регистр первого операнда
для знакового умножения
|
132р
|
MAC
|
Регистр первого операнда
для беззнакового умножения с накоплением
|
134р
|
MACS
|
Регистр первого операнда
для знакового умножения с накоплением
|
136h
|
OP2
|
Регистр второго операнда
|
138h
|
RESLO
|
Регистр младшего слова
результата
|
13Ah
|
RESHI
|
Регистр старшего слова
результата
|
13Ch
|
SUMEX
|
Регистр расширения суммы
|
13Eh
|
Содержимое регистра SUMEXT
зависит от типа операции. Его возможные состояния показаны в таблице 10.
Таблица 10
Операция
|
Содержимое SUMEXT
|
MPY
|
Всегда 0
|
MPYS
|
0 - если результат
положителен; FFFFh - если результат отрицателен
|
MAC
|
0 - если нет переноса из
15-го бита RESHI; FFFFh - если есть перенос из 15-го бита RESHI
|
MACS
|
0 - если результат
положителен; FFFFh - если результат отрицателен
|
ПРИМЕР.
Вычислить результат выражения R13:R12 = 1234 * R4 + 5678 * R5 ,
где
R13 -
старшее слово результата;
R12 -
младшее слово результата;
R4, R5 - беззнаковые 16-ти разрядные переменные.
mov #1234, &MPYR4, &OP2#5678, &MACR5,
&OP2&RESLO, R12
&RESHI, R13
ПРИМЕЧАНИЕ. Если умножитель используется как в основной программе, так и
в подпрограмме обработки прерывания, может возникнуть ситуация, когда
прерывание происходит во время загрузки и чтения результата основной
программой. В этом случае режим операции и сами операнды могут быть потеряны, и
результат окажется непредсказуем. Для того чтобы избежать подобной ситуации
рекомендуется в основной программе запрещать все прерывания перед загрузкой
данных в умножитель и разрешать прерывания после вычитывания результата.
.6 Порты
ввода/вывода
Модель MSP430F149 имеет 6 двунаправленных 8-ми битных порта ввода/вывода P1 - P6. Каждая линия порта может быть настроена для ввода или
вывода цифровой информации или поддержки работы периферийных устройств. Кроме
того, все линии портов P1 и P2 способны работать как выводы
внешних прерываний. Следует заметить, однако, что прерывания от линий каждого
порта сгруппированы в общий вектор прерывания: для порта P1 - вектор с адресом FFE8h, а для P2 - FFE2h. Поэтому в подпрограмме обработки прерывания необходимо
анализировать флаги прерывания с целью определения его источника.
Работа всех портов регистров ввода/вывода определяется содержимым ряда
регистров управления, при этом каждый бит в этих регистрах соответствует
одноименной линии порта.
Имеются следующие регистры, управляющие всеми портами ввода/вывода (x - индекс порта):
Ø PxSEL (Port Select) - выбирает
функцию линии:
0 - линия предназначена для ввода/вывода;
- линия предназначена для периферийного устройства.
Ø PxDIR (Port Direction) -
направление передачи данных. Как правило, воздействует на линии порта только в
том случае, если соответствующий бит в регистре PxSEL равен 0.
0 - линия настроена на ввод;
- линия настроена на вывод;
Ø PxOUT - вывод. В том случае, если линия настроена вывод,
содержимое битов этого регистра будет задавать логическое состояние внешнего
вывода.
Ø PxIN - ввод. Содержимое бит этого регистра отражает
логическое состояние линий порта. Регистр доступен только для чтения.
Для обеспечения функционирования линий портов P1 и P2 в
качестве источников прерывания имеются ряд дополнительных регистров:
Ø PxIE (Interrupt Enable) -
разрешение прерывания
0 - запрещает прерывание;
- разрешает прерывание.
Ø PxIES (Interrupt Edge Select) - выбор активного фронта прерывания
0 - растущий активный фронт;
- падающий активный фронт.
Ø PxIFG (Interrupt Flag) - флаг
прерывания. Устанавливается
в 1 аппаратно, если на линии порта зарегистрировано событие, определенное
соответствующим битом регистра PxIES.
Сбрасывается в 0 программно.
Полный перечень регистров портов ввода/вывода приведен в таблице 11.
Таблица 11
Регистр
|
Назначение
|
Адрес
|
P1IN
|
Состояние порта P1
|
20h
|
P1OUT
|
Установка порта P1
|
21h
|
P1DIR
|
Направление порта P1
|
22h
|
P1IFG
|
Флаги прерывания порта P1
|
23h
|
P1IES
|
Выбор фронта прерывания
порта P1
|
24h
|
P1IE
|
Разрешение прерывания порта
P1
|
25h
|
P1SEL
|
Выбор функции порта P1
|
26h
|
P2IN
|
Состояние порта P2
|
28h
|
P2OUT
|
Установка порта P2
|
29h
|
P2DIR
|
Направление порта P2
|
2Ah
|
P2IFG
|
Флаги прерывания порта P2
|
2Bh
|
P2IES
|
Выбор фронта прерывания
порта P1
|
2Ch
|
P2IE
|
Разрешение прерывания порта
P1
|
2Dh
|
P2SEL
|
Выбор функции порта P2
|
2Eh
|
P3IN
|
Состояние порта P3
|
18h
|
P3OUT
|
Установка порта P3
|
19h
|
P3DIR
|
Направление порта P3
|
1Ah
|
P3SEL
|
Выбор функции порта P3
|
1Bh
|
P4IN
|
Состояние порта P4
|
1Ch
|
P4OUT
|
Установка порта P4
|
1Dh
|
P4DIR
|
Направление порта P4
|
1Eh
|
P4SEL
|
Выбор функции порта P4
|
1Fh
|
P5IN
|
Состояние порта P5
|
30h
|
P5OUT
|
Установка порта P5
|
31h
|
P5DIR
|
Направление порта P5
|
32h
|
P5SEL
|
Выбор функции порта P5
|
33h
|
P6IN
|
Состояние порта P6
|
34h
|
P6OUT
|
Установка порта P6
|
35h
|
P6DIR
|
Направление порта P5
|
36h
|
P6SEL
|
Выбор функции порта P6
|
ПРИМЕР.
Сконфигурировать порт P1:
линии 0 и 5 - поддержка периферии;
линии 7, 6,4 -вывод;
линии 3 - ввод;
линия 1 - растущий фронт прерывания;
линия 2 - падающий фронт прерывания;
на линиях 7, 6 - выставить 1, на линии 4 -0
Для удобства определения содержимого регистров представим таблицу
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
P1SEL
|
1
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
P1DIR
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
P1OUT
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
P1IE
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
P1IES
|
.b #0C0h, &P1OUT.b #0D0h, &P1DIR.b #21h, &P1SEL.b
#4, &P1IES.b #6, &P1IE
ПРИМЕР
Ожидать растущий фронт на выводе P3.5, после чего инвертировать вывод P1.2
L1: bit.b #20h, &P3IN ; проверяем, P3.5=1 ?
jnz L1 ; если да,
ждем
L2: bit.b #20h,
&P3IN ; P3.5 = 0 ?
jz L2 ; если да, ждем
xor.b #4, &P1OUT ; инвертируем P1.2
.7 Таймер A3
Таймер А3 является 16-ти битным таймером-счетчиком. На его базе
реализованы 3 модуля захвата/сравнения (capture/compare)
- CC0, CC1 и СС2. Каждый из этих модулей может работать либо в режиме
захвата, либо в режиме сравнения.
Модули захвата обычно используются для точного измерения временных
интервалов между какими-либо событиями, например фронтами внешних импульсов.
Для организации работы модуля захвата обычно запускают таймер в режиме
свободного счета, входная логика модуля захвата настраивается на определенный
тип события (растущий/падающий фронт). При возникновении внешнего события,
текущее содержимое таймера автоматически перезаписывается в специальный регистр
захвата. Кроме того, устанавливается флаг требования прерывания модуля захвата,
отреагировать на который программа может несколько позже, но при этом,
содержимое регистра захвата будет точно соответствовать моменту события.
Модули сравнения обычно используются для генерации событий на внешних
выводах микроконтроллера в заданный момент времени. Для этого блок выходной
логики, связанный с внешним выводом, настраивают на тот или иной тип события
(установка, сброс или переключение вывода). В специальный регистр сравнения
записывается значение, соответствующее моменту генерации события. С помощью
цифрового компаратора модуль периодически сравнивает текущее содержимое таймера
и регистра сравнения. При их равенстве вырабатывается внутренний сигнал EQU, который заставляет сработать блок
выходной логики. Кроме того, устанавливается флаг требования прерывания,
который может быть обработан процессором уже после генерации требуемого
события.
Структурная схема таймера А3 приведена на рисунке 3.
Рисунок 3. Структурная схема таймера А3
Текущее содержимое таймера находится в регистре TAR (Timer A Register). Тактирование таймера
осуществляется с помощью одного из источников - внутренние сигналы ACLK или SMCLK, или внешние сигналы, подключаемые к выводам P1.0/TACLK и P2.1/INCLK. Выбрать источник можно с помощью
битов TASSEL в регистре управления таймера.
Выбранная входная частота подается на таймер через делитель DIV, управляемый битами ID регистра управления.
Таймер A обеспечивает несколько режимов
работы:
· Режим продолжительного счета (Continuous) - содержимое регистра TAR увеличивается на 1 при каждом тактирующем импульсе от
0 до FFFFh, после чего таймер переполняется,
его содержимое сбрасывается в 0 и процесс начинается сначала. При переходе
значения TAR FFFFhà0 устанавливается флаг переполнения
таймера TAIFG.
· Режим суммирования (Up) - содержимое регистра TAR
увеличивается на 1 при каждом тактирующем импульсе от 0 до содержимого регистра
сравнения CCR0, после чего содержимое TAR сбрасывается и процесс счета
начинается сначала. Флаг переполнения TAIFG устанавливается при переходе содержимого TAR CCR0à0.
· Режим суммирования-вычитания (Up/Down) - содержимое
TAR сначала увеличивается на 1 от
значения 0 до содержимого CCR0,
после чего направление счета меняется и таймер считает до 0. После достижения
нулевого значения, направление счета опять меняется на противоположное и т.д.
Флаг переполнения таймера TAIFG
устанавливается при переходе TAR 1à0. Обычно этот режим применяется для
широтно-импульсной модуляции PWM.
Режимы работы таймера задаются блоком MODE. На рисунке 4 изображены режимы работы таймера.
Содержимое таймера также может быть очищено программно с помощью бита TACLR регистра управления.
Модули захвата/сравнения имеют идентичную структуру. Т.к. каждый модуль
может работать либо в режиме захвата, либо в режиме сравнения, в них
используется общий регистр CCRx.
Тип события для захвата выделяет блок CC_IN, тип режима сравнения генерирует блок
CC_OUT.
Как видно из рисунка 3, для каждого модуля имеется свой набор входных и
выходных сигналов. Входной сигнал для модулей захвата назначается битами CCIS регистров управления. Внутреннее
подключение входов к потенциалам GND и VCC дает возможность осуществить
программное срабатывание модуля захвата. В качестве второго входа модуля CC1 можно выбрать внутренний сигнал
выхода встроенного аналогового компаратора CAOUT (см. п. 3.10). В качестве второго входа модуля CC2 можно выбрать внутреннюю частоту ACLK. Эта возможность предусмотрена для
реализации умножителя частоты DCO
(см.п.3.3).
Рисунок 4. Режимы работы таймера A3
Подключение выходных сигналов к модулю сравнения производится с помощью
регистров P1SEL и P2SEL (см.п. 3.6). Выход ADC12sc модуля CC1
является внутренним сигналом, предназначенным для автоматического старта
преобразования АЦП при срабатывании модуля сравнения.
Блок выходной логики модуля сравнения CC_OUT можно
запрограммировать на работу в одном из 8-ми возможных режимов:
· 0 - Output - выход устанавливается программно
через специальный бит в регистре управления;
· 1 - Set -
выход устанавливается в 1 при TAR=CCRx и остается в этом состоянии до тех
пор, пока таймер не будет сброшен или не изменен режим;
· 2 - Toggle/Reset - выход переключается на
противоположное состояние при TAR=CCRx, сбрасывается в 0 при TAR=CCR0;
· 3 - Set/Reset - выход устанавливается в 1 при TAR=CCRx, сбрасывается в 0 при TAR=CCR0;
· 4 - Toggle
- выход переключается на противоположное состояние при TAR=CCRx;
· 5 - Reset
- выход сбрасывается в 0 при TAR=CCRx и остается в этом состоянии до тех
пор, пока не будет изменен режим;
· 6 - Toggle/Set - выход переключается на
противоположное состояние при TAR=CCRx и сбрасывается в 0 при TAR=CCR0;
· 7 - Reset/Set - выход сбрасывается в 0 при TAR=CCRx и устанавливается в 1 при TAR=CCR0.
Режимы 2,3,6,7 не используются для CC0.
Согласно таблице 5 модуль CC0
имеет индивидуальный вектор прерывания с адресом FFECh, прерывания от модулей CC1, CC2, а
также переполнение таймера имеют групповой вектор с адресом FFEAh. Для быстрого определения источника
прерывания используется регистр идентификации прерывания TAIV.
Таблица 12
Регистр
|
Назначение
|
Адрес
|
TAR
|
Регистр таймера-счетчика
|
170h
|
TACTL
|
Регистр управления таймера
|
160h
|
TACCR0
|
Регистр захвата/сравнения
СС0
|
172h
|
TACCTL0
|
Регистр управления СС0
|
162h
|
TACCR1
|
Регистр захвата/сравнения
СС1
|
174h
|
TACCTL1
|
Регистр управления СС1
|
164h
|
TACCR2
|
Регистр захвата/сравнения
СС2
|
176h
|
TACCTL2
|
Регистр управления СС2
|
166h
|
TAIV
|
Регистр идентификации
прерывания
|
12Eh
|
Ø TAR (Timer A Register) - регистр таймера А. 16-ти
разрядный регистр текущего содержимого таймера. Регистр доступен как для
записи, так и для чтения с помощью словных форм инструкций.
Ø TACTL (Timer A Control) - содержит биты управления таймера
А. Регистр доступен как для записи, так и для чтения с помощью словных форм
инструкций и содержит следующие биты.
ID 1, 0
|
MC1,0
|
-
|
TACLR
|
TAIE
|
TAIFG
|
· Биты 15
-10 - зарезервированы.
· Биты 9, 8 - TASSEL
(Timer A Source Select) - комбинация состояния этих бит определяет источник
тактирования таймера.
TASSEL1
|
TASSEL0
|
Источник
|
0
|
0
|
TACLK
|
0
|
1
|
ACLK
|
1
|
0
|
SMCLK
|
1
|
1
|
INCLK
|
· Биты 7, 6 - ID (Input Divider) - комбинация состояния этих бит определяет
коэффициент деления входного делителя таймера
ID1ID0Коэффициент
|
|
|
0
|
0
|
1 / 1
|
0
|
1
|
1 / 2
|
1
|
0
|
1 / 4
|
1
|
1
|
1 / 8
|
·
Биты 5, 4 - MC (Mode Select) - комбинация состояния этих бит определяет текущий
режим таймера
MC1MC0Режим
|
|
|
0
|
0
|
Остановлен
|
0
|
1
|
Up
|
1
|
0
|
Continuous
|
1
|
1
|
Up/Down
|
· Бит 3 - зарезервирован .
· Бит 2 - TACLR
(Timer A Clear) - программная установка этого бита вызывает сброс
регистра TAR в 0. Бит сбрасывается в 0
автоматически.
· Бит 1 - TAIE (Timer A Interrupt Enable ) - установка/сброс этого бита разрешает/запрещает
прерывание по переполнению таймера.
· Бит 0 - TAIFG
(Timer A Interrupt Flag) - флаг требования прерывания. Устанавливается
аппаратно при переполнении таймера или программно. Сбрасывается автоматически
чтением регистра TAIV.
Ø TACCR 0, 1, 2 (Timer A
Capture/Compare Register) - 16-ти разрядные регистры захвата/сравнения. В режиме захвата в регистр автоматически записывается
содержимое TAR. В режиме сравнения содержимое этих
регистров автоматически сравнивается с содержимым TAR для генерации внешнего события. Доступны по записи и
чтению с помощью словных форм инструкций.
Ø TACCTL 0, 1, 2 (Timer A Capture/compare Control) - содержат биты управления модулей
захвата/сравнения. Все три регистра имеют идентичную структуру и доступны по
записи и чтению с помощью словных форм инструкций. Регистры содержат следующие
биты
CM1, 0
|
CCIS1,0
|
SCS
|
SCCI
|
-
|
CAP
|
|
OUTMOD 2,1,0
|
CCIE
|
CCI
|
OUT
|
COV
|
CCIFG
|
|
|
|
|
|
|
|
|
|
|
|
|
· Биты 15, 14 - CM (Capture Mode) - режим модуля захвата. Определяют тип события для
срабатывания модуля захвата.
CM1
|
CM0
|
Тип события
|
0
|
0
|
Нет захвата
|
0
|
1
|
Растущий фронт
|
1
|
0
|
Падающий фронт
|
1
|
1
|
Любой фронт
|
· Биты 13, 12 - CCIS (Capture/Compare Input Select) - выбирают сигналы для входа модуля захвата.
CCIS1CCIS0Вход
|
|
|
0
|
0
|
CCIA
|
0
|
1
|
CCIB
|
1
|
0
|
GND
|
1
|
1
|
VCC
|
· Бит 11 - SCS (Synchronize Capture Source) - синхронизация источника захвата. Если этот бит
установить в 1 то захват будет производиться синхронно с тактом таймера, в
противном случае, захват будет произведен в момент обнаружения внешнего
события.
· Бит 10 - SCCI -
(Synchronized Capture/Compare Input) -
синхронизированный вход модуля захвата/сравнения. В этот бит аппаратно
перезаписывается состояние выбранного входа захвата в момент генерации сигнала EQU. Бит доступен только по чтению.
· Бит 9 - зарезервирован
· Бит 8 - CAP (Capture) - установка/ сброс этого бита
выбирает режим захвата или сравнения модуля соответственно.
· Биты 7,6,5 - OUTMOD
(Output Mode) - определяют режим работы выходов модуля сравнения.
OUTMOD2
|
OUTMOD1
|
OUTMOD0
|
Режим
|
Действие
|
0
|
0
|
0
|
Out
|
TACCTLx.OUT
|
0
|
0
|
1
|
Set
|
1 : TAR=CCRx
|
0
|
1
|
0
|
Toggle/reset
|
Переключение : TAR=CCRx,
0 : TAR=CCR0
|
0
|
1
|
1
|
Set/reset
|
1 : TAR=CCRx, 0 : TAR=CCR0
|
1
|
0
|
0
|
Toggle
|
Переключение : TAR=CCRx
|
1
|
0
|
1
|
Reset
|
0 : TAR=CCRx
|
1
|
1
|
0
|
Toggle/set
|
Переключение : TAR=CCRx,
1 : TAR=CCR0
|
1
|
1
|
1
|
Reset/set
|
0 : TAR=CCRx, 1 : TAR=CCR0
|
· Бит 4 - CCIE (Capture/Compare Enable) -
установка/сброс этого бита разрешает/запрещает прерывания от модуля
захвата/сравнения.
· Бит 3 - CCI (Capture/Compare Input) - через этот бит читается состояние входа модуля
захвата, подключенное битами CCIS
этого регистра. Доступен только по чтению.
· Бит 2 - OUT -
содержимое этого бита определяет состояние выхода модуля сравнения, если биты OUTMOD=0.
· Бит 1 - COV (Capture Overflow) - переполнения захвата.
Устанавливается аппаратно, если при срабатывании модуля захвата, предыдущее
захваченное значение таймера не было вычитано из CCRx. Сбрасываться бит должен программно.
· Бит 0 - CCIFG (Capture/Compare Interrupt Flag) - флаг требования прерывания. Устанавливается аппаратно при срабатывании модуля
захвата/сравнения. Для TACCTL0
бит сбрасывается программно или аппаратно при вхождении в прерывание. Для TACCTL1 и TACCTL2 бит сбрасывается чтением регистра TAIV.
Ø TAIV (Timer A Interrupt Vector) - регистр идентификации прерывания для таймера A и модулей TACC1 и TACC2.
Регистр доступен только по чтению. В этом регистре генерируется код,
позволяющий определить источник прерывания. Возможны следующие коды содержимого
TAIV:
· 0 - нет прерываний;
· 2 - установлен флаг TACCTL1.CCIFG;
· 4 - установлен флаг TACCTL2.CCIFG;
· 10 - установлен флаг TACTL.TAIFG
Если установлены несколько флагов одновременно, в регистре будет
генерироваться меньшее значение. Вычитывание из регистра определенного кода
автоматически сбрасывает соответствующий флаг IFG. Использование регистра TAIV дает возможность быстрого ветвления на подпрограмму
обработки прерываний. Типовая последовательность команд для обработки
прерываний различных источников таймера приведена ниже.
cc0: . . . ; ISR для TACCTL0.CCIFG: add &TAIV, PC ; общая ISR для TACCTL1.CCIFG,
Reti ; TACCTL2.CCIFG и TACTL.TAIFG
jmp cc1cc2: . . . ; начало ISR по TACTL.TAIFG
reti ;
можно заменить на “ jmp TimHndl “
cc1: .
. . ; начало ISR по TACCTL1.CCIFG
reti ;
можно заменить на “ jmp TimHndl “
cc2: .
. . ; начало ISR по TACCTL2.CCIFG
reti ;
можно заменить на “ jmp TimHndl “
В данном фрагменте прерывание для модуля TACC0 подпрограмма обработки прерывания описывается
самостоятельно, так как для этого модуля имеется собственный вектор прерывания.
Для модулей TACC1, TACC2 и собственно таймера A, таблица векторов настраивается на единую подпрограмму с
адресом TimHndl. При возникновении прерывания
управление передается на первую команду, которая прибавляет к содержимому PC код TAIV. Если прерывание было от TACCTL1.CCIFG,
то к PC прибавиться 2, и управление будет
передано на команду jmp cc1, которая, в свою очередь, передаст
управление на собственно подпрограмму обработки cc1 для TACCTL1.CCIFG. Таким образом, в подпрограмме
обработки прерывания нет необходимости тестировать состояние флагов прерываний,
поскольку используется вычисляемый переход. Если существует значительная
вероятность того, что флаги прерываний могут быть установлены одновременно,
вместо команд reti имеет смысл выполнить команду
перехода на начало ISR. В этом
случае, процессор будет находиться в прерывании до тех пор, пока не обслужит
все запросы.
ПРИМЕР
Запрограммировать модули сравнения для аппаратной генерации
последовательности импульсов частотой 100 kHz, и длительностью 1 µs. Частота SMCLK
= 8 MHz.
Временная диаграмма генерации импульсов приведена на рис.5. Для
аппаратной генерации импульсов можно использовать UP-режим таймера. Тогда период импульсов будет определяться
содержимым регистра TACCR0. Для
генерации самих импульсов будем использовать модуль TACCR1 и внешний вывод P1.2/TA1.
Модуль сравнения TACCR1 может
работать в режиме Reset/Set.
Параметры T1=1 µS, T2= 1/ (100 kHz)=
10 µS.
Значение, загружаемое в регистр TACCR0 = T2/Δt, где Δt - период тактирования таймера. Т.к.
таймер должен тактироваться частотой SMCLK, то
TACCR0
= 10 µS * 8 MHz = 80.
Значение, загружаемое в TACCR1,
определится как
TACCR1
= 1 µS * 8 MHz = 8.
#include <msp430x14x.h> ; подключаем файл определений
mov
#4, &P1SEL ; настраиваем P1.2/TA1 для поддержки TACCR1
mov
#80, &TACCR0 ; задаем период импульсов
mov
#8, &TACCR1 ; задаем длительность импульсов
mov #OUTMOD_7, &TACCTL1 ; настраиваем TACC1 на режим Reset/set,
; в msp430x14x.h определена константа
; OUTMOD_7=0Eh
mov #TASSEL+MC0+TACLR, &TACLR ;тактирование таймера от SMCLK,
; старт таймера в UP режиме
Рисунок 5. Временная диаграммы генерации импульсов.
.8 Таймер B7
Таймер B7 имеет структуру, аналогичную
таймеру A3, но имеет следующие отличия:
· Разрядность таймера может быть программно задана как 8, 10, 12 или 16 разрядов.
· На базе таймера B реализовано 7 модулей захвата/сравнения - TBCC0 … TBCC6.
· Регистры TBCCRx
имеют буфер по записи и могут быть сгруппированы, т.е. запись данных в один из
регистров приводит к обновлению данных во всех регистрах группы.
· Все выходы модулей сравнения могут быть переведены в
высокоимпедансное состояние.
· Отсутствует бит SCCI в регистрах управления модулей захвата/сравнения.
Общая структурная схема таймера B7 приведена на рисунке 6.
Рисунок 6. Структурная схема таймера B7
Дополнительные возможности таймера B7 дают удобные средства построения на его базе многоканальных
широтно-импульсных (ШИМ) генераторов. В этом случае используется UP или UP/DOWN режимы
таймера. С помощью регистра TBCCR0
модуля сравнения задается несущая частота модуляции, а содержимое TBCCRx определяет длительность генерируемых
импульсов. Изменяя содержимое регистров TBCCRx можно динамически менять ширину импульсов в различных
каналах. С помощью таймера B7
можно, например, реализовать управление шестью ключами, включенных в стойки
инверторов для трехфазной сети. Для качественного регулирования необходимо,
чтобы перестройка всех шести каналов ШИМ проводилась одновременно. Синхронную
перестройку ШИМ генератора на базе таймера A реализовать затруднительно, т.к. программа может изменять
содержимое регистров CCR
только последовательно. Для достижения синхронности в таймере B7 используется буферирование
регистров TBCCRx и объединение их в группы.
В отличии от таймера A,
регистры TBCCRx подключены к компаратору не напрямую,
а через регистры-защелки TBCLx
(Timer B Compare Latch), так, как это показано на рис. 7.
Рисунок 7. Буферизированное подключение TBCCR
Таким образом, компаратор сравнивает текущее содержимое таймера B не с содержимым регистра TBCCRx, а с TBCLx. Прямого доступа к регистрам TBCLx нет, однако данные в них могут переписываться из TBCCRx в ответ на какое-либо событие -
например переход таймера через 0. Это дает возможность в начале периода работы
таймера последовательно записать требуемые значения в регистры TBCCRx, а воспримутся эти значения
синхронно для всех каналов со следующего периода.
Еще одна возможность синхронизации многоканальных ШИМ заключается в
объединении нескольких модулей сравнения в группы. Группа может состоять из
2-х, 3-х или всех 7-ми модулей. Один модуль в группе является ведущим,
остальные - ведомыми. Если программа записывает новые данные в регистры TBCCRx ведомых модулей, эти данные не
воспринимаются (не переписываются в TBCLx) до тех пор, пока не будет произведена запись в TBCCR ведущего модуля. Таким образом, данные из TBCCRx всех модулей группы подхватываются
одновременно в момент записи TBCL
ведущего модуля.
Наконец, внешние выводы всех модулей сравнения могут быть переведены в
высокоимпедансное состояние внешним сигналом, подключенным к выводу P5.7/TBOUTH. Для выключения выходов модулей сравнения необходимо
сконфигурировать вывод P5.7/TBOUTH для поддержки периферийных функций
(через регистр P5SEL) и подать на него потенциал
логической единицы.
Регистры таймера B7
представлены в таблице 13.
Таблица 13
Регистр
|
Назначение
|
Адрес
|
TBR
|
Регистр содержимого таймера
B
|
190h
|
TBCTL
|
Регистр управления таймера
В
|
180h
|
TBCCR0
|
Регистр захвата/сравнения CC0
|
192h
|
Регистр управления CC0
|
182h
|
TBCCR1
|
Регистр захвата/сравнения CC1
|
194h
|
TBCCTL1
|
Регистр управления CC1
|
184h
|
TBCCR2
|
Регистр захвата/сравнения CC2
|
196h
|
TBCCTL2
|
Регистр управления CC2
|
186h
|
TBCCR3
|
Регистр захвата/сравнения CC3
|
198h
|
TBCCTL3
|
Регистр управления CC3
|
188h
|
TBCCR4
|
Регистр захвата/сравнения CC4
|
19Ah
|
TBCCTL4
|
Регистр управления CC4
|
18Ah
|
TBCCR5
|
Регистр захвата/сравнения CC5
|
19Ch
|
TBCCTL5
|
Регистр управления CC5
|
18Ch
|
TBCCR6
|
Регистр захвата/сравнения CC6
|
19Eh
|
TBCCTL6
|
Регистр управления CC6
|
18Eh
|
TBIV
|
Регистр идентификации
прерывания
|
11Eh
|
Ø TBR (Timer B Register) -16-ти разрядный регистр текущего
содержимого таймера. Регистр доступен как для записи, так и для чтения с
помощью словных форм инструкций.
Ø TBCTL (Timer B Control) - содержит биты управления таймера B. Регистр доступен как для записи,
так и для чтения с помощью словных форм инструкций и содержит следующие биты.
- -
|
TBCLGRP1,0
|
CNTL1,0
|
-
|
TBSSEL1,0
|
ID 1, 0
|
MC1,0
|
-
|
TBCLR
|
TBIE
|
TBIFG
|
· Бит 15 - зарезервирован.
· Биты 14, 13 - TBCLGRP (Timer B Compare Latch Group) - группирование загрузки модулей сравнения таймера B.
TBCLGRP1
|
TBCLGRP0
|
Группы
|
Ведущий модуль
|
0
|
0
|
нет
|
нет
|
0
|
1
|
TBCC1+TBCC2 TBCC3+TBCC4 TBCC5+TBCC6
|
TBCC1 TBCC3 TBCC5
|
1
|
0
|
TBCC1+TBCC2+ TBCC3 TBCC4+ TBCC5+TBCC6
|
TBCC1 TBCC4
|
1
|
1
|
TBCC0+TBCC1+TBCC2+ TBCC3+ TBCC4+ TBCC5+TBCC6
|
TBCC1
|
· Биты
12, 11 - CNTL (Counter Length) - длина счетчика.
Комбинация состояния этих бит определяет разрядность таймера B.
CNT1
|
CNT0
|
Разрядность
|
Макс. значение таймера
|
0
|
0
|
16 бит
|
FFFFh
|
0
|
1
|
12 бит
|
FFFh
|
1
|
0
|
10 бит
|
3FFh
|
1
|
1
|
8 бит
|
FFh
|
· Бит 10 - зарезервирован.
· Биты 9, 8 - TBSSEL
(Timer B Source Select) - выбор источника тактирования таймера B.
TBSSEL1
|
TBSSEL0
|
Источник
|
0
|
0
|
TBCLK
|
0
|
1
|
ACLK
|
1
|
0
|
SMCLK
|
1
|
1
|
Инвертированный TBCLK
|
· Биты 7, 6 - ID (Input Divider) - комбинация состояния этих бит
определяет коэффициент деления входного делителя таймера
ID1
|
ID0
|
Коэффициент
|
0
|
0
|
1 / 1
|
0
|
1
|
1 / 2
|
1
|
0
|
1 / 4
|
1
|
1
|
1 / 8
|
· Биты 5, 4 - MC (Mode Select) - комбинация состояния этих бит определяет
текущий режим таймера
MC1MC0Режим
|
|
|
0
|
0
|
Остановлен
|
0
|
1
|
Up
|
1
|
0
|
Continuous
|
1
|
1
|
Up/Down
|
· Бит 3 - зарезервирован .
· Бит 2 - TBCLR (Timer B Clear)
- программная установка этого бита вызывает сброс регистра TBR в 0. Бит сбрасывается в 0 автоматически.
· Бит 1 - TBIE (Timer B Interrupt Enable ) - установка/сброс этого бита
разрешает/запрещает прерывание по переполнению таймера.
· Бит 0 - TBIFG (Timer A Interrupt Flag)
- флаг требования прерывания. Устанавливается аппаратно при переполнении
таймера или программно. Сбрасывается автоматически чтением регистра TBIV.
Ø TBCCTL 0…6 (Timer B Capture/compare Control) - содержат биты управления
модулей захвата/сравнения. Все регистры имеют идентичную структуру и доступны
по записи и чтению с помощью словных форм инструкций. Регистры содержат
следующие биты
CM1, 0
|
CCIS1,0
|
SCS
|
CLLD1,0
|
CAP
|
OUTMOD 2,1,0
|
CCIE
|
CCI
|
OUT
|
COV
|
CCIFG
|
· Биты 15, 14 - CM (Capture Mode) - режим модуля захвата.
Определяют тип события для срабатывания модуля захвата.
CM1
|
CM0
|
Тип события
|
0
|
0
|
Нет захвата
|
0
|
1
|
Растущий фронт
|
1
|
0
|
Падающий фронт
|
1
|
1
|
Любой фронт
|
· Биты 13, 12 - CCIS (Capture/Compare Input Select) - выбирают сигналы для входа
модуля захвата.
CCIS1CCIS0Вход
|
|
|
0
|
0
|
CCIA
|
0
|
1
|
CCIB
|
1
|
0
|
GND
|
1
|
1
|
VCC
|
Для всех модулей, кроме TBCC6, комбинации CCIS - 00b и
01b - идентичны.
· Бит 11 - SCS
(Synchronize Capture Source) - синхронизация источника
захвата. Если этот бит установить в 1 то захват будет производиться синхронно
с тактом таймера, в противном случае, захват будет произведен в момент
обнаружения внешнего события.
· Биты 10, 9 - CLLD (Compare Latch Load)
- загрузка защелок при сравнении.
Комбинация этих бит определяет событие, по которому
содержимое регистров TBCCRx перезаписывается в защелки TBCLx
CLLD1
|
CLLD0
|
Событие
|
0
|
0
|
Запись в TBCCRx (буферизации нет)
|
0
|
1
|
TBR досчитывает до 0
|
1
|
0
|
UP и Continuous режимы: TBR досчитывает до 0 UP/DOWN
режим: TBR досчитывает до TBCL0 или до
0
|
1
|
1
|
TBR досчитывает до TBCLx
|
В том случае если модули сгруппированы (TBCTL.TBCLGRP≠0), перезапись в TBCLx будет производиться по событию,
определенному битами CLLD
ведущего модуля. У ведомых модулей биты CLLD не должны быть равны 0, т.к. буферизация
выключается. Для групповой загрузки необходимо, чтобы была произведена запись
во все регистры TBCCRx, даже в
том случае, если данные остаются неизменными.
· Бит 8 - CAP
(Capture) - установка/ сброс этого бита
выбирает режим захвата или сравнения модуля TBCCx соответственно.
· Биты 7,6,5 - OUTMOD (Output Mode) - определяют режим работы выходов модуля сравнения.
OUTMOD2
|
OUTMOD1
|
OUTMOD0
|
Режим
|
Действие
|
0
|
0
|
0
|
Out
|
TBCCTLx.OUT
|
0
|
0
|
1
|
Set
|
1 : TBR=CCRx
|
0
|
1
|
0
|
Toggle/reset
|
Переключение : TBR=CCRx,
0 : TBR=CCR0
|
0
|
1
|
1
|
Set/reset
|
1 : TBR=CCRx, 0 : TBR=CCR0
|
1
|
0
|
0
|
Toggle
|
Переключение : TBR=CCRx
|
1
|
0
|
1
|
Reset
|
0 : TBR=CCRx
|
1
|
1
|
0
|
Toggle/set
|
Переключение : TBR=CCRx,
1 : TBR=CCR0
|
1
|
1
|
1
|
Reset/set
|
0 : TBR=CCRx, 1 : TBR=CCR0
|
·
Бит 4 - CCIE (Capture/Compare Enable) - установка/сброс этого бита
разрешает/запрещает прерывания от модуля захвата/сравнения.
· Бит 3 - CCI (Capture/Compare Input) - через этот бит читается состояние входа модуля
захвата, подключенное битами CCIS
этого регистра. Бит доступен только по чтению.
· Бит 2 - OUT - содержимое этого бита определяет состояние выхода модуля сравнения,
если биты OUTMOD=0.
· Бит 1 - COV (Capture Overflow) - переполнения захвата.
Устанавливается аппаратно, если при срабатывании модуля захвата, предыдущее
захваченное значение таймера не было вычитано из CCRx. Сбрасываться бит должен программно.
· Бит 0 - CCIFG (Capture/Compare
Interrupt Flag) - флаг требования прерывания. Устанавливается аппаратно при срабатывании модуля
захвата/сравнения. Для TBCCTL0 бит сбрасывается аппаратно при вхождении в прерывание или программно.
Для TBCCTL1 … TBCCTL6 бит сбрасывается чтением регистра
TBIV.
Ø TBIV (Timer B Interrupt Vector) - регистр идентификации прерывания для таймера B. Выполняет функции, аналогичные
функциям регистра TAIV (см.
п.3.7). В регистре TBIV
возможны следующие коды:
· 0 - нет прерываний;
· 2 - установлен флаг TBCCTL1.CCIFG;
· 4 - установлен флаг TBCCTL2.CCIFG;
· 6 - установлен флаг TBCCTL3.CCIFG;
· 8 - установлен флаг TBCCTL4.CCIFG;
· 10 - установлен флаг TBCCTL5.CCIFG;
· 12 - установлен флаг TBCCTL6.CCIFG;
· 14- установлен флаг TBCTL.TAIFG.
3.9
Интерфейс USART
Интерфейс USART
(Universal Synchronous/Asynchronous Receiver-Transmitter) -универсальный
синхронно-асинхронный приемопередатчик - предназначен для обмена данными
между микроконтроллером и внешними устройствами.
Микросхема MSP430F149 содержит два идентичных модуля
- USART0 и USART1. Каждый модуль поддерживает три режима:
· Универсальный асинхронный приемопередатчик UART;
· Синхронный периферийный интерфейс SPI (Serial Peripheral Interface);
· Интерфейс I2C (Inter Integrated Circuits control).
Для всех трех поддерживаемых режимов используется один
набор регистров, однако их содержимое может меняться в зависимости от режима.
Перечень регистров USART
приведен в таблице 13. Ко всем регистрам USART можно обращаться только с помощью байтовых форм
инструкций.
Таблице 13
Имя
|
Назначение регистра
|
Адрес
|
Нач.значен.
|
U0CTL
|
Управление USART0
|
70h
|
1
|
U0TCTL
|
Управление передатчика USART0
|
71h
|
1
|
U0RCTL
|
Управление приемника USART0
|
72h
|
0
|
U0BR0
|
Управление скоростью USART0 мл. байт
|
74h
|
-
|
U0BR1
|
Управление скоростью USART0 ст. байт
|
75h
|
-
|
U0MCTL
|
Управление модулятора USART0
|
73h
|
-
|
U0RXBUF
|
Буфер приемника USART0
|
76h
|
-
|
U0TXBUF
|
Буфер передатчика USART0
|
77h
|
-
|
ME1
|
Разрешение приемника/передатчика
USART0
|
4
|
0
|
E1
|
Разрешение прерывания USART0
|
0
|
0
|
IFG1
|
Флаги прерывания USART0
|
2
|
82h
|
U1CTL
|
Управление USART1
|
78h
|
1
|
U1TCTL
|
Управление передатчика USART1
|
79h
|
1
|
U1RCTL
|
Управление приемника USART1
|
7Ah
|
0
|
U1BR0
|
Управление скоростью USART1 мл. байт
|
7Ch
|
-
|
U1BR1
|
Управление скоростью USART1 ст. байт
|
7Dh
|
-
|
U1MCTL
|
7Bh
|
-
|
U1RXBUF
|
Буфер приемника USART1
|
7Eh
|
-
|
U1TXBUF
|
Буфер передатчика USART1
|
7Fh
|
-
|
ME2
|
Разрешение приемника/передатчика
USART1
|
5
|
0
|
E2
|
Разрешение прерывания USART1
|
1
|
0
|
IFG2
|
Флаги прерывания USART1
|
3
|
20h
|
3.9.1 Режим
UART
В этом режиме USART обеспечивает работу согласно популярным протоколам RS232, RS485 и др. USART подключается к внешним устройствам через два вывода: URXD - вход приемника, UTXD - выход передатчика.
В этом режиме обеспечиваются следующие характеристики:
· Кадр данных длинной 7 или 8 бит с контролем или без
контроля четности;
· Независимые сдвиговые регистры для приемника и
передатчика;
· Независимые буферные регистры для приемника и
передатчика;
· Аппаратная поддержка коммуникационных протоколов для
многопроцессорных систем;
· Программируемая скорость передачи;
· Внутреннее или внешнее тактирование;
· Независимые вектора прерывания для приемника и
передатчика.
Данные передаются/принимаются с помощью кадров, состоящих
из следующей последовательности бит:
· Стартовый бит - всегда низкий уровень;
· 7 или 8 информационных бит;
· Адресный бит, используемый для коммуникации в
многопроцессорных системах (опционально);
· Бит паритета - устанавливается в зависимости от того
четное или нечетное количество логических единиц содержит информационное поле
(опционально);
· Один или два стоповых битов - всегда высокий
уровень.
.9.1.1
Передача данных
Передача данных инициируется записью передаваемых данных в
буферный регистр передатчика UTXBUF. Из буферного регистра данные автоматически перезаписываются в
выходной сдвиговый регистр, который выдвигает их через вывод микроконтроллера
UTXD младшим битом вперед, опционально
дополняя информационные биты адресным битом и/или битом паритета и обрамляя
кадр стартовым и стоповым битами. На линии UTXD каждый бит удерживается в течение времени,
определяемой текущей битовой скоростью, которая, в свою очередь, зависит от
частоты тактирования UART
и содержимого регистра UBR
(USART Baud Rate).
После копирования данных в сдвиговый регистр аппаратно
устанавливается флаг UTXIFGx в регистрах IFG1
или IFG2 (см. п.3.2), информируя
пользователя, что буфер свободен и может принять следующий байт. Не дожидаясь
окончания физической передачи первого кадра, в буфер UTXBUF может быть записан следующий байт.
Как только первый байт, включая стоп-биты, будет выдвинут через вывод UTXD, второй байт, находящийся в UTXBUF, будет автоматически скопирован в
сдвиговый регистр и начнется передача следующего кадра. Таким образом, за
счет буферирования, осуществляется непрерывная передача данных кадр за
кадром.
.9.1.2
Передача данных
Прием последовательных данных производится через вывод URXD микроконтроллера. Приемник UART ожидает перепад напряжения 1→
0 на входе URXD. После того, как перепад
обнаружен, приемник включает свой тактовый генератор и выдерживает время, равное
половине длительности одного бита. По прошествии этого интервала времени
приемник трижды измеряет напряжение на линии. Если хотя бы два результата
измерения оказались нулевыми, принимается решение, что зафиксирован стартовый
бит. Если были зарегистрировано две или более логические единицы, принимается
решение, что перепад на входе URXD
является следствием шумов на линии. В этом случае приемник переходит в фазу
ожидания следующего старт-бита.
В том случае, если был опознан правильный старт-бит, сдвиговый
регистр приемника начинает принимать данные. Через время, равное длительности
одного бита, производится троекратное измерение потенциала на линии. Решение
о состоянии бита производится по мажоритарному принципу. После приема всего
кадра данных производится контроль стоп-бита. Если его значение оказалось
равным нулю, в регистре управления приемника UART выставляется флаг ошибки кадра FE. Если использовался бит паритета и
зафиксирована ошибка четности, выставляется флаг ошибки четности PE.
После приема всего кадра, данные из сдвигового регистра
переписываются в буфер приемника URXBUF, а в регистре IFG1/IFG2 устанавливается флаг URXIFGx, сигнализирующий о принятом байте.
До того как полученный байт будет вычитан из буфера, сдвиговый регистр
способен принимать следующие данные. Однако если данные из буфера не будут
вычитаны к моменту перезаписи байта из сдвигового регистра в буфер приемника,
в статусном регистре приемника устанавливается флаг OE, сигнализируя о потере данных.
.9.1.3
Поддержка коммуникации в многопроцессорных системах
С помощью UART
можно организовать обмен данными между несколькими микроконтроллерами,
используя, например, аппаратный интерфейс RS485. Не вдаваясь в тонкости аппаратной реализации RS485, укажем, что все
микроконтроллеры (абоненты) объединяются в локальную информационную сеть. При
этом каждый передатчик одного абонента может быть соединен с приемниками всех
других абонентов. Передачу всегда ведет один абонент с помощью блоков кадров
(пакетов), а прием этих блоков осуществляют все абоненты сети. Для того чтобы
абонент-получатель определил, что пакет предназначен именно для него, первый
байт пакета, как правило, содержит информацию об адресе получателя. Если
абонент-получатель распознал свой адрес, он принимает весь пакет, в противном
случае пакет игнорируется. Поэтому для производительной работы в локальной
сети необходим эффективный механизм распознавания начала информационного
пакета. Для этих целей UART
микроконтроллеров MSP430
поддерживает два механизма: использование адресного бита (address bit) и режим свободной линии (idle line).
Для режима idle line
необходимо, чтобы пауза вежду последовательно передаваемыми кадрами в пакете
не превышала длительности одного кадра. При получении первого кадра после
паузы в регистре управления приемника аппаратно устанавливается бит RXWAKE, сигнализируя, что принят адресный
байт. Программная установка другого бита этого регистра RXWIE позволяет приемнику игнорировать
все не адресные байты (бит RXIFG
не устанавливается). Таким образом, абонент-получатель нормально
устанавливает бит RXWIE и ожидает
получения первого байта, после чего сравнивает его содержимое с собственным
адресом. Если адрес опознан, он сбрасывает бит RXWIE и принимает далее весь пакет. После приема
адресованного ему пакета бит RXWIE
взводится опять. В том случае, если адрес не опознан, RXWIE не сбрасывается, следовательно,
остальные байты пакета отбрасываются приемником.
Для генерации абонентом-отправителем точного периода
простоя на своей линии UTXD
имеется специальный бит TXWAKE в регистре управления передатчика. Абонент-отправитель должен
дождаться готовности передатчика (бит TXIFG должен быть установлен), установить в 1 бит TXWAKE, после чего записать произвольные
данные в буфер UTXBUF. Т.к. бит
TXWAKE установлен, физически данные
передаваться не будут, но по окончанию длительности передачи кадра будет
взведен флаг TXIFG, после
чего можно передавать адресный байт. Бит TXWAKE сбрасывается автоматически после
передачи паузы.
Логика работы локальной сети в режиме address bit очень похожа на режим idle line с той лишь разницей, что
маркирование адресного байта производится не паузой при передаче пакетов, а
наличием дополнительного бита в кадре, установленного в 1, в то время как все
данные передаются со сброшенным адресным битом. Логика работы с битами RXWAKE и RXWIE аналогична вышеизложенной. Для того чтобы пометить
начало пакета абонент-отправитель должен просто перед посылкой первого байта
установить в 1 бит TXWAKE.
.9.1.4
Обнаружение стартового бита при приеме
В том случае, если необходимо вести прием данных при
выключенном, с целью снижения потребления, тактировании UART, имеется механизм, позволяющий
получить прерывание при поступлении стартового бита на вход приемника. Для
этого используется бит URXSE,
расположенный, как это не странно, в регистре управления передатчика. В том
случае, если URXSE=1,
разрешено прерывание по приему и на линию URXD приходит фронт стартового бита, берется прерывание
с адресом готовности приемника. Подпрограмма обработки прерывания может
определить причину возникновения прерывания по состоянию бита URXIFG. Если этот бит равен нулю,
следовательно, обнаружен фронт старт бита, в противном случае, был принят
очередной символ приемником UART.
Определение фронта старт-бита дает возможность подпрограмме обработки
прерывания активизировать тактировании UART для нормального приема всего кадра.
3.9.1.5
Скорость передачи
Генератор скорости приема/передачи способен создавать
стандартные скорости при нестандартных частотах тактирования UART. Максимальная скорость приема/передачи
составляет одну треть от частоты источника тактирования.
Генерация нужной частоты проводится в две стадии. На первой
стадии используется 16-ти разрядный делитель частоты тактирования UBR, состоящий из двух регистров UBR0 (младший байт) и UBR1 (старший байт). На второй стадии
задействуется 8-ми разрядный модулятор UMCL.
В первом приближении скорость передачи в бодах определяется
по формуле
Baud=BRCLK/N
где
BRCLK
- частота тактирования UART
в герцах;
N -
содержимое регистра UBR.
Программистам, однако, гораздо чаще приходится сталкиваться
с обратной задачей - для заданной частоты тактирования и желаемой скорости
приема/передачи необходимо определить содержимое UBR. Очевидно, что
N=BRCLK/B.
Однако, возможна ситуация, когда вычисленная величина N не является целочисленным
значением. Например, если требуется стандартная скорость Baud=115.2 kb/s
при BRCLK=1 Mhz, получим
N=1000/115.2=8.68
Для загрузки данных в UBR полученное значение придется округлить до 9. В этом
случае действительная скорость приема/передачи составит 111.1 kb/s, в то время как внешнее устройство, подключенное к UART, будет работать на скорости 115.2 kb/s. Отсюда возникает вопрос, насколько точно нужно
согласовывать скорости передатчика на одной стороне и приемника на другой,
чтобы данные принимались без ошибок. В первом приближении можно сказать, что
скорости приемника и передатчика должны быть согласованы с точностью δ
не хуже
δ ≤50%/n, где n -
длина кадра.
Т.е. если используется 10-ти битный кадр (8 бит данных,
старт и стоп биты), погрешность не должна превосходить 5%. Другими словами,
погрешность округления полученного коэффициента деления не должна, в данном
случае, быть больше 5%.
В нашем примере погрешность округления составит δ
= 100% *(9-8.68)/8.68 ≈
3.7 %, следовательно, приемник будет правильно воспринимать данные, посланные
передатчиком.
Отдельный интерес представляет случай, когда необходимо,
чтобы микроконтроллер работал на низкой частоте (типовой случай -
тактирование частотой 32768 Hz)
и, в тоже время, передавал/принимал данные на стандартной скорости, например
9600 b/s. Для этого случая получим N=32768/9600 = 3.41 и погрешность округления
δ =
100%*(3.41-3)/3.41=12.1
%
Действительная скорость передачи составит B = 32768/3 = 10922 b/s. Понятно, что полученные значения является
неприемлемыми.
Для того чтобы получить высокую заданную скорость передачи
данных при низких частотах тактирования используется модулятор. Работа
модулятора управляется данными, записанными в него. По мере передачи/приема
битов сдвиговым регистром, содержимое модулятора также просматривается бит за
битом, начиная с младшего. В том случае, если текущий бит модулятора равен 0,
используется коэффициент деления UBR, в противном случае используется коэффициент деления, равный UBR+1. Таким образом, происходит
подстройка длительности каждого бита в кадре. Если количество битов в кадре
больше 8, как чаще всего и бывает, просмотр содержимого UMCL опять начинается с младшего бита.
Для того, чтобы определить требуемые значения в UBR и UMCL коэффициент деления N представляется формулой
N=UBR+1/n*Σmi
где
UBR
- содержимое регистра UBR:
n -
длина кадра;
mi -
состояние (0 или 1) i-го
бита, записанного в модулятор UMCL.
Другими словами, содержимое UBR и сумма всех единиц в UMCL, отнесенных на длину кадра, должна как можно точнее
соответствовать желаемому коэффициенту деления.
Упрощенная методика определения содержимого UBR и UMCL заключается в следующем. В рассчитанном значении N отбрасывается дробная часть и
определяется количество 1, содержащееся в модуляторе. После этого для
получения кода UMCL эти единицы
более или менее равномерно расставляются в 8-ми битном поле содержимого UMCL. Следует помнить, что для 10-ти
битного кадра 2 младших бита UMCL
будут использованы дважды.
Приведем пример расчета содержимого UBR и UMCL для вышеприведенного случая.
N=32768/9600
= 3.4133
Значение делителя составит UBR0=3, UBR1=0.
Σmi =n*(N-UBR)=10*(3.4133-3)=4.133 ≈ 4
Расставляем единицы
модулятора на длине 10-ти битного поля№
бита кадра
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
№ бита UMCL
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
0
|
1
|
Значение
|
1
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
1
|
0
|
Из приведенных данных видно, что на длине кадра
располагаются 4 единицы, хотя при таком раскладе, UMCL будет содержать только три единицы. Читая код UMCL справа налево, получим значение
01001001b =45h.
Таким образом, получен дробный коэффициент деления M=3+4/10=3.4, при этом ошибка
скорости составит δ = 100% * (3.4133 - 3.4)/3.4133 = 0.39%, а
фактическая скорость B=32768/3.4=9638
b/s.
.9.1.6 Регистры USART
Ø UxCTL (USART Control) - содержит биты управления USART.
PENA
|
PEV
|
SPB
|
CHAR
|
LISTEN
|
SYNC
|
MM
|
SWRS
|
· Бит 7 - PENA
(Parity Enable) -разрешение паритета.
Установка/сброс этого бита включает/выключает контроль четности единиц в
кадре.
· Бит 6 - PEV (Parity Even) - четность паритета.
Установка/сброс этого бита выбирает паритет четности/нечетности в том случае,
если паритет разрешен.
· Бит 5 - SPB (Stop Bit) - состояние этого бита задает
количество стоп-битов в конце кадра:
0 - 1 стоп бит,
- 2 стоп бита.
· Бит 4 - CHAR
(Character) - определяет длину
информационного поля кадра:
0 - 7 битов,
1 - 8 битов.
· Бит 3 - LISTEN - прослушивание. Установка этого бита подключает выход UTXD ко входу URXD внутри USART, что дает возможность приемнику прослушивать данные,
передаваемые собственным передатчиком.
· Бит 2 - SYNC (Synchronous) - должен быть сброшен для задания
режима UART.
· Бит 1 - MM (Multiprocessor Mode) - установка/сброс этого бита
задает режим многопроцессорного протокола:
0 - режим свободной линии - idle line,
- режим адресного бита - address bit.
· Бит 0 - SWRS
(Software Reset) - программный сброс. Установка
этого бита в 1 производит программный сброс аппаратуры USART в исходное состояние, 0 -
разрешает работу USART.
Ø UxTCTL (USART Control) - содержит биты управления
передатчика USART.
-
|
CKPL
|
SSEL1,0
|
URXSE
|
TXWAKE
|
-
|
TEXP
|
· Бит 7 - зарезервирован.
· Бит 6 - CKPL (Clock Polarity) - выбор полярности тактирования
при использовании внешнего тактового сигнала UCLK. Установка этого бита инвертирует тактирующий
сигнал.
· Биты 5,4 - SSEL (Source Select) - комбинация этих бит задает
источник тактирования USART
SSEL1
|
SSEL0
|
Источник
|
0
|
0
|
Внешний UCLK
|
0
|
1
|
ACLK
|
1
|
0
|
SMCLK
|
1
|
1
|
SMCLK
|
·
Бит 3 - URXSE (UART Receive Start Edge) - контроль фронта стартового бита. Установка/сброс
этого бита разрешает/запрещает реакцию на фронт стартового бита (см. п.
3.9.1.4).
· Бит 2 - TXWAKE (Transmitter Wake)
- пробуждение передатчика. При установке этого бита следующий кадр посылается
как адресный. Сбрасывается автоматически.
· Бит 1 - зарезервирован.
· Бит 0 - TXEPT ( Transmitter Empty) - передатчик пуст. Устанавливается
в 1 аппаратно в том случае если UTXBUF и сдвиговый регистр не содержит данных, в противном случае
сбрасывается.
Ø UxRCTL (USART Control) - содержит биты управления
приемника USART.
FE
|
PE
|
OE
|
BRK
|
URXEIE
|
URXWIE
|
RXWAKE
|
RXERR
|
· Бит 7 - FE (Frame Error) - ошибка кадра. Устанавливается аппаратно, если
принятый стоп-бит равен 0. Сбрасывается программно или чтением URXBUF.
· Бит 6 - PE (Parity Error) - ошибка паритета.
Устанавливается аппаратно, если было обнаружено несоответствие единиц в
полученном кадре и состоянием бита паритета. Сбрасывается программно или
чтением URXBUF.
· Бит 5 - OE (Overrun Error) - ошибка переполнения.
Устанавливается аппаратно если при копировании данных из сдвигового регистра
в URXBUF, старые данные не были вычитаны из буфера. Сбрасывается программно
или чтением URXBUF.
· Бит 4 - BRK (Break) - разрыв линии. Устанавливается
аппаратно, если приемник обнаружил 10 или более нулевых битов на входе URXD.
Сбрасывается программно или чтением URXBUF.
· Бит 3 - URXEIE (Receive Erroneous-character
Interrupt Enable) - разрешение прерывания при приеме ошибочного символа.
Устанавливается/сбрасывается для разрешения/запрещения приема ошибочных
символов - т.е. символов, прием которых вызвал установку битов 7,6,5 этого
регистра. Если этот бит сброшен, прием символа с ошибками не устанавливает
флаг URXIFG.
· Бит 2 - URXWIE (Receive Wake-up Interrupt Enable) -
разрешение прерывания при получении адресного байта. При установке этого бита
принимаются (устанавливается флаг URXIFG) только адресные байты. При сбросе
бита принимаются все байты.
· Бит 1 - RXWAKE (Receive Wake-up) - прием адресного
байта. Устанавливается аппаратно при приеме адресного байта. Сбрасывается
аппаратно при приеме байта данных.
· Бит 0 - RXERR (Receive Error) - ошибка приема. Устанавливается аппаратно, если
установлен любой из флагов ошибок (FE,PE,OE,BRK). Сбрасывается чтением
URXBUF.
Ø UxMCTL (USART Control) - содержит биты управления
модулятора USART (см. 3.9.1.5).
Ø UxBR0 (Baud Rate)
- младший байт делителя частоты тактирования UART.
Ø UxBR1 (Baud Rate)
- старший байт делителя частоты тактирования UART.
Ø UxTXBUF (Transmit Buffer) - буферный регистр передатчика.
Ø UxRXBUF (Transmit Buffer) - буферный регистр приемника
Ø ME1 (Module Enable 1) - содержит биты разрешения приемника и передатчика USART0.
·
Бит 7 - UTXE0 (USART0
Transmit Enable). Установка/сброс
этого бита разрешает/запрещает передатчик USART0.
· Бит 6 - URXE0 (USART0 Receive Enable). Установка/сброс этого бита
разрешает/запрещает приемник USART0.
· Биты 5…0 - зарезервированы.
Ø ME2 (Module Enable 2) - содержит биты разрешения приемника и передатчика USART1.
· Биты 7,6 - зарезервированы.
· Бит 5 - UTXE1 (USART1 Transmit Enable). Установка/сброс этого бита
разрешает/запрещает передатчик USART1.
· Бит 4 - URXE1 (USART1 Receive Enable). Установка/сброс этого бита
разрешает/запрещает приемник USART1.
· Биты 3…0 - зарезервированы.
Ø IE1 (Interrupt Enable 1) - содержит биты разрешения прерываний для USART0 (см. п.3.2).
Ø IE2 (Interrupt Enable 2) - содержит биты разрешения прерываний для USART1 (см. п.3.2).
Ø IFG1 (Interrupt Flag
1) - содержит флаги прерываний для USART0 (см. п.3.2).
Ø IFG2 (Interrupt Flag
2) - содержит флаги прерываний для USART1 (см. п.3.2).
ПРИМЕР
Принять 100 байт данных с помощью UART0 и записать их в ОЗУ, начиная с адреса 200h. Скорость передачи данных - 115.2 kb/s, формат - 8 бит, один стоп бит, частота SMCLK - 8 MHz.
Рассчитаем коэффициент деления частоты SMCLK для обеспечения требуемой
скорости.
N=8000/115.2=69.4≈69
Погрешность скорости δ=100% *
(69.4-69)/69.4≈0.6
%, следовательно модулятор можно не использовать.
bis.b #SWRST+CHAR,
&U0CTL ; устанавливаем программный
; сброс, режим 8 бит
mov.b #SSEL1, &U0TCTL ; тактирование от SMCLK
mov.b #69, &U0BR0 ;
установка скорости приема
mov.b #0, &U0BR1.b #0, &U0MCTL.b #URXE0,
&ME1 ; разрешение приема
bic.b #URXIE0, &IE1 ; запрет прерываний
bic.b #SWRST, &U0CTL ; очистка программного сброса
bis.b #40h, &P3SEL ; вывод P3.5/U0RXD для
; поддержки UART0
mov
#200h, R12 ; настраиваем указатель
wait:
bit.b #URXIFG0, &IFG1 ;
ожидание поступления кадра
jz wait
mov.b &U0RXBUF,
0(R12) ; сохранение данных в ОЗУ
inc R12 ;
наращивание указателя
cmp
#200h+100, R12 ; все данные приняты?
jne wait ;
если нет, то цикл
.9.2 Режим SPI
Последовательный периферийный интерфейс SPI (Serial Peripheral Interface) обеспечивает высокоскоростной
синхронный обмен данными между двумя микроконтроллерами или другими внешними
устройствами. В обмене данными всегда принимают участие ведущее (master) и ведомое (slave) устройства. Для интерфейса
используются следующие сигналы:
· SIMO (Slave Input,
Master Output) - вход ведомого, выход ведущего;
· SOMI (Slave Output, Master Input) -выход ведомого, вход ведущего;
· UCLK (USART Clock)
- сигнал тактирования;
· STE (Slave Transmit Enable) - вход разрешение передачи ведомого, опциональный сигнал используется
только в 4-х проводном режиме.
Для обмена данными через интерфейс SPI необходимо одноименные сигналы SIMO, SOMI и UCLK
ведущего и ведомого устройств соединить между собой. Обмен данными начинается
после того, как в буфер ведущего устройства UTXBUF записываются данные. В том случае,
если сдвиговый регистр передатчика пуст, эти данные копируется в него, и
мастер начинает выдвигать их на линию SIMO бит за битом начиная со старшего. При этом ведущее
устройство для каждого информационного бита генерирует синхроимпульс на линии
UCLK. Одновременно с передачей данных,
ведущее устройство принимает данные, присутствующие на линии SOMI, задвигая их в сдвиговый регистр
приемника. После того, как был передан/принят информационный кадр, данные из
сдвигового регистра приемника переписываются в буфер RXBUF.
Устройство, сконфигурированное как ведомое, используя
тактовые импульсы ведущего устройства, принимает от него данные, одновременно
передавая данные своего буфера. Таким образам, после окончания передачи
данных, содержимое буферов ведущего и ведомого устройств меняются местами.
В том случае, если используется 3-х проводной SPI, вывод STE не оказывает влияние на работу интерфейса. При 4-х
проводном интерфейсе логика работы входного сигнала STE заключается в следующем:
· Устройство сконфигурировано как master. Если на вход STE подано напряжение высокого уровня,
интерфейс работает нормально. Если на вход подается логический 0, это
означает, что другое устройство желает стать ведущим, поэтому выводы SIMO и UCLK переключаются на ввод, а SOMI - на вывод.
· Устройство сконфигурировано как slave. Если на вход STE подан логический 0, интерфейс
работает нормально. Если на вход STE подать логическую единицу, все линии SPI переключаются на ввод, и интерфейс выключается.
Битовая скорость определяется содержимым регистров UBR0 и UBR1 ведущего устройства и определяется формулой
Baud=BRCLK/UBR,
где
BRCLK
- частота тактирования USART.
Максимальная битовая скорость, генерируемая мастером не
должна превышать BRCLK/2.
Максимальная битовая скорость для ведомого устройства не должна превышать BRCLK. Модулятор для интерфейса SPI не используется, поэтому
рекомендуется держать содержимое регистра UxMCTL равное 0.
Управление SPI
осуществляется с помощью следующих регистров.
Ø UxCTL (USART Control) - содержит биты управления USART.
-
|
I2C
|
CHAR
|
LISTEN
|
SYNC
|
MM
|
SWRS
|
· Биты 7,6 - зарезервированы.
· Бит 5 - I2C - должен быть установлен в 0, для
работы USART в режиме SPI.
· Бит 4 - CHAR (Character) - определяет длину
информационного поля кадра:
0 - 7 битов,
- 8 битов.
· Бит 3 - LISTEN - прослушивание. Установка этого бита подключает выход SIMO ко входу приемника внутри USART, что дает возможность приемнику
прослушивать данные, передаваемые собственным передатчиком.
· Бит 2 - SYNC (Synchronous) - должен быть установлен в 1 для
задания режима SPI.
· Бит 1 - MM (Master Mode) - установка/сброс этого бита
задает режим ведущего/ведомого устройства SPI.
· Бит 0 - SWRS (Software Reset) - программный сброс. Установка
этого бита в 1 производит программный сброс аппаратуры USART в исходное состояние, 0 -
разрешает работу SPI.
Ø UxTCTL (USART Control) - содержит биты управления
передатчика USART.
CKPH
|
CKPL
|
SSEL1,0
|
-
|
STC
|
TEXP
|
· Бит 7 - CKPH
(Clock Phase) -фаза тактирования на выводе UCLK (см. рис.8).
0 - нормальное тактирование;
- сдвиг тактирования на половину периода длительности
такта.
· Бит 6 - CKPL
(Clock Polarity) - выбор полярности тактирования
тактового сигнала UCLK . (см.
рис.8)
0 - неактивный уровень низкий,
- неактивный уровень высокий.
· Биты 5,4 - SSEL
(Source Select) - комбинация этих бит задает
источник тактирования USART
SSEL1
|
SSEL0
|
Источник
|
Режим
|
0
|
0
|
Внешний UCLK
|
Только slave
|
0
|
1
|
ACLK
|
Только master
|
1
|
0
|
SMCLK
|
Только master
|
1
|
1
|
SMCLK
|
Только master
|
· Бит 3,2 -зарезервированы.
· Бит 1 - STC (Slave Transmit Control) - управление передачей ведомого.
Установка/сброс этого бита задает 3-х проводный (STE запрещен) или 4-х проводный (STE разрешен) режимы работы SPI соответственно.
· Бит 0 - TXEPT (Transmitter Empty)
- устанавливается в 1 аппаратно в том случае если TXBUF и сдвиговый регистр не содержит данных, в противном
случае сбрасывается.
Рисунок 8. Временная диаграмма работы SPI
Ø UxRCTL (USART Control) - содержит биты управления
приемника USART.
·
·
Бит 7 - FE (Frame Error) - ошибка кадра. Устанавливается
аппаратно, если в 4-х проводной конфигурации и режиме master обнаружен перепад 1à0 на линии STE. Сбрасывается программно.
· Бит 6 - зарезервирован.
· Бит 5 - OE (Overrun Error) - ошибка переполнения.
Устанавливается аппаратно если при копировании данных из сдвигового регистра
в URXBUF, старые данные не были вычитаны из буфера. Сбрасывается программно
или чтением URXBUF.
· Биты 4…0 - зарезервирован.
Ø UxBR0 (Baud Rate)
- младший байт делителя частоты тактирования SPI.
Ø UxBR1 (Baud Rate)
- старший байт делителя частоты тактирования SPI.
Ø UxTXBUF (Transmit Buffer) - буферный регистр передатчика.
Ø UxRXBUF (Transmit Buffer) - буферный регистр приемника
Ø ME1 (Module Enable 1) - содержит биты разрешения приемника и передатчика USART0.
· Бит 7 - зарезервирован.
· Бит 6 - USPIE0 (USART0 SPI Enable). Установка/сброс этого бита
разрешает/запрещает USART0
в режиме SPI.
· Биты 5…0 - зарезервированы.
Ø ME2 (Module Enable 2) - содержит биты разрешения приемника и передатчика USART1.
· Биты 7…5 -
зарезервированы.
· Бит 4 - USPIE1 (USART1 SPI Enable). Установка/сброс этого бита
разрешает/запрещает USART1
в режиме SPI.
· Биты 3…0 - зарезервированы.
Ø IE1 (Interrupt Enable 1) - содержит биты разрешения прерываний для USART0 (см. п.3.2).
Ø IE2 (Interrupt Enable 2) - содержит биты разрешения прерываний для USART1 (см. п.3.2).
Ø IFG1 (Interrupt Flag
1) - содержит флаги прерываний для USART0 (см. п.3.2).
Ø IFG2 (Interrupt Flag
2) - содержит флаги прерываний для USART1 (см. п.3.2).
.9.3 Режим
I2C
USART
в режиме I2C обеспечивает интерфейс между микроконтроллером MSP430 и I2C-совместимыми
устройствами, подключенными через 2-х проводную последовательную шину.
Поддержка режима I2C реализована только в USART0. I2C
контроллер обеспечивает следующие характеристики:
· поддержка спецификации I2C v2.1 Philips Semiconductor
- Формат передачи байт/слово;
- 7-разрядный и 10-разрядный режимы адресации устройств;
Общий вызов;
Старт/рестарт/стоп;
Режим ведущий передатчик/ведомый приемник;
Режим ведущий приемник/ведомый передатчик;
Поддержка стандартного режима до 100 кбод и быстрого режима
до 400
кбод;
· Встроенная память FIFO для буферирования чтения и записи
· Программируемый генератор скорости;
· 16-разрядный доступ к данным для увеличения
пропускной способности шины;
· Автоматический подсчет количества байт данных
· Возможность работы в режимах пониженного
энергопотребления;
· Расширенные возможности прерываний
Контроллер I2C имеет достаточно сложную
структуру, его работоспособность обеспечивается рядом дополнительных
регистров управления. В данном документе работа USART в режиме I2C не рассматривается. Для детального
рассмотрения работы контроллера обращайтесь к www.ti.com.
Структурная схема компаратора изображена на рис. 9.
Входы аналогового компаратора могут программно подключаться
к внешним выводам микроконтроллера с помощью битов управления P2CAx. С помощью битов управления CAEX можно менять схему подключения
физических входов компаратора к внешним выводам микроконтроллера, при этом
одновременно производится инвертирование выхода компаратора. В некоторых
случаях использование этого переключателя дает возможность компенсировать
собственное напряжение смещения компаратора.
В состав аналогового компаратора входит источник опорного
напряжения. Опорное напряжение источника можно с помощью управляющего бита CARSEL подключить к одному или другому
входу компаратора. С помощью битом управления CAREF можно выбрать величину опорного напряжения,
соответствующую Vcc/2, Vcc/4 или фиксированному напряжению,
приблизительно равному 0.5 V. С
помощью, битов CAREF можно
также отключить источник опорного напряжения.
Рисунок 9. Структурная схема аналогового компаратора
В том случае если входные аналоговые напряжения меняются
медленно, в момент равенства этих напряжений возможно многократное
срабатывание компаратора. В некоторых случаях этот эффект можно подавить,
подключив на выход компаратора встроенный RC фильтр с помощью бита CAF. Время срабатывания компаратора составляет около
200 ns, если фильтр не включен, и порядка
1.5 µs при включенном фильтре.
Выходной сигнал компаратора можно вывести на внешний вывод
микроконтроллера P2.2/CAOUT/TA0 с помощью установок в регистре P2SEL, или использовать в качестве входа для модуля
захвата/сравнения TACC1 (см. п.
3.7).
С целью минимизации потребления аналоговый компаратор может
быть выключен битом CAON.
В активном режиме компаратор и источник опорного напряжения потребляю ток в
45 µA каждый.
Регистры аналогового компаратора представлены в таблице 14.
Таблица 14
Имя
|
Назначение регистра
|
Адрес
|
Нач.значен.
|
CACTL1
|
Регистр управления 1
|
59h
|
0
|
CACTL2
|
Регистр управления 2
|
5Ah
|
0
|
CAPD
|
Регистр отключения цифровых
формирователей
|
5Bh
|
0
|
Ø CACTL1 (Comparator A Control) - содержит биты управления компаратора.
CAEX
|
CARSEL
|
CAREF1, 0
|
CAON
|
CAIES
|
CAIE
|
CAIFG
|
· Бит 7 - CAEX (Comparator Exchange) - изменение подключения.
0 - неивертирующий вход соответствует выводу CA0,
инвертирующий вход соответствует выводу CA1;
- неивертирующий вход соответствует выводу CA1,
инвертирующий вход соответствует выводу CA0;
· Бит 6 - CARSEL (Comparator Reference Select) - выбор подключения опоры.
0 - опорное напряжение подключено к входу CA0;
- опорное напряжение подключено к входу CA1.
· Биты 5,4 - CAREF (Comparator Reference) - выбор опорного напряжения.
CAREF1
|
CAREF0
|
Напряжение
|
0
|
0
|
Выключен
|
0
|
1
|
0.25 * Vcc
|
1
|
0
|
0.5 * Vcc
|
1
|
1
|
Диод
|
·
Бит 3 - CAON. Установка/ сброс этого бита
включает/выключает аналоговый компаратор
· Бит 2 - CAIES (Comparator Interrupt Edge Select) - выбор фронта прерывания.
0 - прерывание по переходу 0à1 выхода компаратора;
- прерывание по переходу 1à0 выхода компаратора;
· Бит 1 - CAIE (Comparator Interrupt Enable) - разрешение прерывания. Установка/сброс этого бита разрешает/запрещает прерывание от
компаратора.
· Бит 0 - CAIFG (Comparator Interrupt Flag)
- флаг требования прерывания компаратора. Устанавливается аппаратно, если
компаратор переключается согласно содержимому бита CAIES. Сбрасывается аппаратно, если берется прерывание,
или программно.
Ø CACTL2 (Comparator A Control) - содержит биты управления компаратора.
· Биты 7…4 -зарезервированы.
· Бит 3 - P2CA1 - устанавливается/сбрасывается
для подключения/отключения внешнего вывода к цепи CA1.
· Бит 2 - P2CA0- устанавливается/сбрасывается для
подключения/отключения внешнего вывода к цепи CA0.
· Бит 1 - CAF (Comparator Filter) - установка/сброс этого бита
подключает/ отключает встроенный RC фильтр.
· Бит 0 - CAOUT - через этот бит программно читается выходное состояние
компаратора. Бит доступен только по чтению.
Ø CAPD (Comparator Port Disable) - запрещение цифрового буфера порта P2. Назначение битов этого регистра заключается в
следующем. Входные цепи порта P2,
равно как и всех остальных портов, снабжены цепями формирования входных
логических уровней, состоящих из двух КМОП транзисторов. Если входное
напряжение близко к середине напряжения питания, это вызывает протекание
сквозного тока через входные транзисторы, что влечет увеличение общего тока
потребления. Т.к. предполагается, что на входы компаратора может быть подано
любое аналоговое напряжение, с целью снижения потребления имеет смысл
отключать входные буферы для портов P2.3 и P2.4. Логические единицы в 8-ми
битном регистре CAPD запрещают
входные буферы для соответствующих линий порта P2. Следует заметить, что действие регистра CAPD распространяется на весь порт P2. Если в каком-либо бите регистра CAPD взведена 1, соответствующая линия
порта не может использоваться в качестве цифрового входа.
.11
Аналого-цифровой преобразователь ADC12
микроконтроллер
цифровой преобразователь
Модуль ADC12
обеспечивает быстрое преобразование аналоговых напряжений в цифровой код.
Модуль обладает следующими техническими характеристиками:
· разрядность результирующего кода - 12 бит;
· скорость преобразования - до 2*105 преобразований в
секунду;
· максимальная интегральная ошибка преобразования -
менее 2 разрядов;
· встроенное устройство выборки/хранения;
· преобразование инициируется программным обеспечением
или аппаратно от таймеров A
или B;
· встроенный генератор опорного напряжения 1.5 или 2.5
V;
· буферная память преобразования и управления,
позволяющая сохранить до 16 последовательных измерений;
· восемь индивидуально конфигурируемых внешних входных
каналов;
· каналы преобразования для внутреннего температурного
сенсора, аналогового питания и внешних опорных источников.
Структурная схема модуля АЦП приведена на рис. 10.
Основой модуля является 12-ти разрядный блок ADC последовательного приближения.
Тактирование блока осуществляется частотой ADC12CLK,
генерируемой от внутренних частот ACLK, MCLK, SMCLK или специального встроенного генератора ADC12OSC и деленной делителем DIV. Частота генератора ADC12OSC
приблизительно равна 5MHz.
В любом случае частота тактирования ADC12CLK должна находиться в диапазоне 0.45
- 6.3 MHz.
Рисунок 10.
Структурная схема ADC12
Результирующий код АЦП генерируется согласно формуле
NADC = 4096 * (Vin - Vr-)/(Vr+ - Vr-)
где
Vin
- входное напряжение;
Vr+
- опорное напряжение;
Vr--
общий вывод опорного напряжения.
Восемь внешних и четыре внутренних сигнала могут быть
выбраны для аналого-цифрового преобразования. В качестве внешних сигналов
используются выводы порта P6.
Для минимизации токов утечек входных цифровых формирователей порта P6 рекомендуется назначать выводы,
задействованные для АЦ преобразования, для поддержки периферийных функций
через регистр P6SEL. В качестве внутренних входных
сигналов АЦП могут быть использованы напряжения опоры VeREF+, VREF- и напряжения встроенного датчика температуры.
Напряжение на температурном датчике Vt в вольтах определяется формулой
Vt =
kt * T + 0.986
где
kt -
температурный коэффициент датчика, равный 0.00355 V/0C
±3%;
T -
температура в градусах Цельсия.
Требуемый канал измерения выбирается с помощью
мультиплексора MUX, управляемого
битами INCH регистра управления.
Выходной сигнал мультиплексора поступает на вход устройства
выборки/хранения SH (Sample/Hold), предназначенного для фиксации входного сигнала на
время преобразования АЦП. Входной аналоговый сигнал перед началом
преобразования запоминается на внутреннем конденсаторе SH. Для того чтобы конденсатор
зарядился до величины входного напряжения необходимо время ts, величину которого можно оценить
по формуле:
ts > (Rs + Ri) * 9.011 * Ci + 800ns
где - выходное сопротивление источника сигнала;
Ri -
проходное сопротивление мультиплексора, типовое значение 2 kOm;
Ci -
емкость накопительного конденсатора, типовое значение 40 pF.
Внутренний сигнал SAMPCON (Sample/Conversion) управляет периодом выборки SH и началом преобразования. Когда
SAMPCON имеет высокий уровень, выборка активна. Переход сигнала SAMPCON с
высокого уровня на низкий стартует аналого-цифровое преобразование, которому
необходимо 13 тактов частоты ADC12CLK.
Полное время одного преобразования tADC составляет
tADC
= ts + 13 * ADC12CLK
Активизация сигнала SAMPCON может быть осуществлена программно
с помощью бита ADC12SC регистра управления АЦП или
аппаратно при срабатывании модулей сравнения TACC1, TBCC0
или TBCC1. Выбор источника для генерации
сигнала SAMPCON выбирается битами управления SHS. Кроме того, период выборки может
быть задан напрямую этими сигналами или с помощью специального таймера TSH. Переключение между этими двумя
режимами осуществляется с помощью бита управления SPH.
Модуль ADC12
содержит в своем составе встроенный источник опорного напряжения REF. Величину выходного напряжения
можно задать программно с помощью бита управления REF2_5V на
уровне 1.5V или 2.5V. Следует отметить, однако, что действительное
значение этих напряжений может отличаться от номинальных на величину ±100/60 mV для уровней 2.5/1.5 V соответственно. Поэтому для
гарантирования точности преобразования необходимо либо производить калибровку
опорного напряжения, либо использовать внешний источник опоры. При
использовании встроенного опорного напряжения рекомендуется между выводом VREF+ и выводом AVss подключать параллельно соединенные
конденсаторы номиналом 10 µF и
100 nF.
С помощью переключателя, управляемого битами SREF можно подключить в качестве опоры Vr+ внешнее напряжение VeREF+ или аналоговое питание AVcc. С помощью переключателя,
управляемого битом SREF2,
можно в качестве опоры Vr-
подключить внешний сигнал VREF-
или напряжение аналоговой земли. В любом случае напряжение Vr+ должно находиться в диапазоне 1.4V - AVcc, а напряжение Vr- в диапазоне 0 - 1.2 V.
Начало цикла преобразования инициируется срабатыванием
источника запуска АЦП при условии, что бит управления ENC=1. Результаты преобразований
сохраняются в 16-ти регистрах буферной памяти преобразований ADC12MEMx.
Каждый регистр ADC12MEMx конфигурируется соответствующим управляющим
регистром ADC12MCTLx, содержащим информацию о номере входного канала и
источнике опорного напряжения для каждого измерения. Следующие друг за другом
измерения могут последовательно сохраняться в регистрах ADC12MEM0, ADC12MEM1 и т.д. Кроме того, управляющий
регистр ADC12MCTLx содержит бит EOS, определяющий конец серии измерения, когда
используется многоканальные режимы преобразования.
Модуль ADC12
имеет четыре основных режима работы:
· Однократное одноканальное преобразование. Результат
преобразования записывается в регистр ADC12MEMx, номер которого записан в
поле CSTARTADDR регистра управления АЦП. При этом
номер канала преобразования и источник опоры определяется содержимым
соответствующего регистра ADC12MCTLx. Для старта следующего
преобразования необходимо опять переключить ENC в состояние 0à1.
· Однократное многоканальное преобразование. Результат
первого преобразования сохраняется в ADC12MEMx, номер которого записан в поле
CSTARTADDR регистра управления АЦП.
Результаты следующих преобразований сохраняются в следующих регистрах
ADC12MEMx. Последовательность преобразований завершается, когда очередной
результат сохраняется в регистре, для которого бит EOS в соответствующем регистре ADC12MCTLx
установлен в 1. Для старта следующей серии преобразований необходимо
переключить ENC в состояние 0à1.
· Повторяющееся одноканальное преобразование.
Отличается от однократного одноканального преобразования тем, что измерения
автоматически продолжаются после первого преобразования (нет необходимости
переключать содержимое бита ENC).
Содержимое регистра ADC12MEMx необходимо вычитывать до того, как будет
произведено следующее преобразование. Выход из непрерывного процесса
преобразований можно осуществить программной установкой бита ENC в 0.
· Повторяющееся многоканальное преобразование.
Отличается от однократного многоканального преобразования тем, что при
достижении регистра, отмеченного установленным битом EOS, последовательность автоматически возобновляется,
начиная с регистра, номер которого определен битовым полем CSTARTADDR.
Модуль ADC12
имеет дополнительные режимы работы, определяемые состоянием бита MSC регистра управления АЦП. Эти
дополнительные режимы работают только в том случае, если не задан режим
однократного одноканального преобразования и для формирования периода выборки
используется таймер TSH.
Если MSC=1, следующее преобразование в
серии производится максимально быстро, т.е. не дожидаясь срабатывания
источника старта АЦП, а непосредственно после окончания предыдущего
преобразования. При установленном бите MSC логика работы АЦП меняется следующим образом.
· Для однократного многоканального преобразования запуск АЦП
всегда производится при срабатывании источника старта, после чего
автоматически выполняется несколько измерений в зависимости от состояния бита
EOS.
· Для повторяющегося одноканального режима
преобразования первый запуск АЦП производится при срабатывании источника
старта, после чего измерение выбранного канала будет производиться постоянно,
не взирая на состояние источника запуска. Выход из данного режима
осуществляется установкой бита ENC
в состояние 0.
· Для повторяющегося многоканального преобразования
логика работы аналогична описанной в предыдущем пункте, с той разницей, что
постоянно производится измерения серии, начиная с канала, определенного полем
CSTARTADDR и заканчивая каналом с
установленным битом EOS
в регистре ADC12MCTLx.
Модуль ADC12
поддерживает 18 источников прерываний. 16 источников соответствуют флагам ADC12IFG0 - ADC12IFG15, сосредоточенным в регистре ADC12IFG. Каждый флаг устанавливается аппаратно, после того
как результат преобразования записывается в соответствующий регистр ADC12MEMx. Два остальных события, вызывающих прерывание, не
имеют соответствующих флагов, и могут быть определены с помощью регистра ADC12IV.
Прерывание, условно называемое ADC12OV (overflow), возникает в том случае, когда
результат преобразования записывается в любой регистр ADC12MEMx до прочтения предыдущего результата из этого
регистра.
Прерывание, условно называемое ADC12TOV (time overflow),
генерируется, когда до завершения текущего преобразования затребована другая
выборка-преобразование.
Регистры модуля ADC12 представлены в таблице 15.
Таблица 15
Имя
|
Назначение регистра
|
Адрес
|
Нач.значен.
|
ADC12CTL0
|
Регистр управления 0
|
1A0h
|
0
|
ADC12CTL1
|
Регистр управления 1
|
1A2h
|
0
|
ADC12IFG
|
Регистр флагов прерываний
|
1A4h
|
0
|
ADC12IE
|
Регистр разрешения
прерывания
|
1A6h
|
0
|
ADC12IV
|
Регистр идентификации
прерывания
|
1A8h
|
0
|
ADC12MEM0
|
Регистр памяти результата
0
|
140h
|
?
|
ADC12MEM1
|
Регистр памяти результата
1
|
142h
|
?
|
ADC12MEM2
|
Регистр памяти результата
2
|
144h
|
?
|
ADC12MEM3
|
Регистр памяти результата
3
|
146h
|
?
|
ADC12MEM4
|
Регистр памяти результата
4
|
148h
|
?
|
ADC12MEM5
|
Регистр памяти результата
5
|
14Ah
|
?
|
ADC12MEM6
|
Регистр памяти результата
6
|
14Ch
|
?
|
ADC12MEM7
|
Регистр памяти результата
7
|
14Eh
|
?
|
ADC12MEM8
|
Регистр памяти результата
8
|
150h
|
?
|
ADC12MEM9
|
Регистр памяти результата
9
|
152h
|
?
|
ADC12MEM10
|
Регистр памяти результата
10
|
154h
|
?
|
ADC12MEM11
|
Регистр памяти результата
11
|
156h
|
?
|
ADC12MEM12
|
Регистр памяти результата
12
|
158h
|
?
|
ADC12MEM13
|
Регистр памяти результата
13
|
15Ah
|
?
|
ADC12MEM14
|
Регистр памяти результата
14
|
15Ch
|
?
|
ADC12MEM15
|
Регистр памяти результата
15
|
15Eh
|
?
|
ADC12MCTL0
|
Управляющий регистр
памяти результата 0
|
80h
|
0
|
ADC12MCTL1
|
Управляющий регистр
памяти результата 1
|
81h
|
0
|
ADC12MCTL2
|
Управляющий регистр
памяти результата 2
|
82h
|
0
|
ADC12MCTL3
|
Управляющий регистр
памяти результата 3
|
83h
|
0
|
ADC12MCTL4
|
Управляющий регистр
памяти результата 4
|
84h
|
0
|
ADC12MCTL5
|
Управляющий регистр
памяти результата 5
|
85h
|
0
|
ADC12MCTL6
|
Управляющий регистр
памяти результата 6
|
86h
|
0
|
ADC12MCTL7
|
Управляющий регистр
памяти результата 7
|
87h
|
0
|
ADC12MCTL8
|
Управляющий регистр
памяти результата 8
|
88h
|
0
|
ADC12MCTL9
|
Управляющий регистр
памяти результата 9
|
89h
|
0
|
ADC12MCTL10
|
Управляющий регистр
памяти результата 10
|
8Ah
|
0
|
ADC12MCTL11
|
Управляющий регистр
памяти результата 11
|
8Bh
|
0
|
ADC12MCTL12
|
Управляющий регистр
памяти результата 12
|
8Ch
|
0
|
ADC12MCTL13
|
Управляющий регистр
памяти результата 13
|
8Dh
|
0
|
ADC12MCTL14
|
Управляющий регистр
памяти результата 14
|
8Eh
|
0
|
ADC12MCTL15
|
Управляющий регистр
памяти результата 15
|
8Fh
|
0
|
Ø ADC12CTL0
(Control 0) - содержат биты управления АЦП.
SHT1x
|
SHT0x
|
SC
|
REF2_5V
|
REFON
|
ADC12ON
|
ADC12 OVIE
|
ADC12 TOVIE
|
ENC
|
ADC12SC
|
|
|
|
|
|
|
|
|
|
· Биты 15…12 - SHT1
(Sample/Hold Time) - время выборки/хранения. Состояние этих бит
определяет период выборки, выраженный в тактах частоты ADC12CLK, для регистров ADC12MEM8
…ADC12MEM15.
SHT
|
Циклы ADC12CLK
|
0000
|
4
|
0001
|
8
|
0010
|
16
|
0011
|
32
|
0100
|
64
|
0101
|
96
|
0110
|
128
|
0111
|
192
|
1000
|
256
|
1001
|
384
|
1010
|
512
|
1011
|
768
|
1100
|
1024
|
1101
|
1024
|
1110
|
1024
|
1111
|
1024
|
· Биты 11…8 - SHT0
(Sample/Hold Time) - время выборки/хранения. Состояние этих бит
определяет период выборки, выраженный в тактах частоты ADC12CLK, для регистров ADC12MEM7
…ADC12MEM0. Соответствие кода в этом поле количеству тактов
такое же, как для битов SHT1.
· Бит 7 - MSC (Multiple Sample and Conversion) - множественные выбор и
преобразования.
0 - каждое новое преобразование начинается после срабатывания
источника старта АЦП;
- следующее преобразование начинается непосредственно после
окончания предыдущего.
· Бит 6 - REF2_5V (Reference 2.5V) - опора 2.5V. Установка/сброс этого бита задает напряжение
встроенного генератора опорного напряжения 2.5/1.5 V соответственно.
· Бит 5 - REFON - включение генератора опоры. Установка/сброс этого бита
включает/выключает генератор опорного напряжения.
· Бит 4 - ADC12ON - включение модуля АЦП.
Установка/сброс этого бита включает/выключает модуль АЦП.
· Бит 3 - ADC12OVIE (Overflow Interrupt Enable) - разрешение прерывания по
переполнению АЦП. Установка/сброс этого бита разрешает/запрещает прерывание,
возникающее в случае, если содержимое ADC12MEMx
не вычитано к моменту записи в него следующих значений.
· Бит 2 - ADC12TOVIE (Time Overflow Interrupt Enable)
- разрешение прерывания по переполнению времени выборки АЦП. Установка/сброс
этого бита разрешает/запрещает прерывание, возникающее в случае, если до
завершения текущего преобразования затребована другая выборка-преобразование.
· Бит 1 - ENC (Enable Conversion) - разрешение преобразования.
Установка/сброс этого бита разрешает/запрещает преобразование АЦП.
· Бит 0 - ADC12SC (Start Conversion) - программный старт
преобразования. Установка этого бита вызывает старт преобразования АЦП в том
случае, если поле SHS регистра ADC12CTL1 установлено в 0. Если для формирования периода
выборки используется таймер TSH,
бит сбрасывается автоматически, в противном случае этот бит должен
сбрасываться программно. В этом случае, время, в течении которого этот бит
удерживается в 1, будет определять период выборки внешнего сигнала.
Примечание. Биты с 4 по 15 этого регистра могут быть
модифицированы только, если бит ENC=0.
Ø ADC12CTL1
(Control 1) - содержат биты управления АЦП.
· Биты 15…12 - CSTARTADDR (Conversion Start Address) - стартовый адрес преобразования.
Задает номер пары регистров - ADC12MEMx и ADC12MCTLx,
начиная с которых, будет производиться преобразование.
· Биты 11,10 - SHS (Sample/Hold Source Select) - выбор источника выборки/хранения.
SHS1
|
SHS0
|
Источник
|
0
|
0
|
Бит ADC12SC
|
0
|
1
|
Выход TACC1
|
0
|
Выход TBCC0
|
1
|
1
|
ВыходTBCC1
|
· Бит 9 - SPH (Sample/Hold Pulse mode) - выбор режима выборки. Установка/сброс этого бита разрешает/запрещает
использование таймера TSH.
· Бит 8 - ISSH (Invert Signal Sample/Hold) - инвертирование сигнала выборки/хранения.
Установка этого бита инвертирует сигнал, генерируемый источником,
определенным битами SHS
этого регистра.
· Биты 7,6,5 - ADC12DIV
(Divider) - делитель для частоты ADC12CLK. Состояние этих бит задают коэффициент деления
тактовой частоты, определенной битами ADC12SSEL
этого регистра.
ADC12DIV2
|
ADC12DIV1
|
ADC12DIV0
|
Коэф.делен.
|
0
|
0
|
0
|
1 / 1
|
0
|
0
|
1
|
1 / 2
|
0
|
1
|
0
|
1 / 3
|
0
|
1
|
1
|
1 / 4
|
1
|
0
|
0
|
1 / 5
|
1
|
0
|
1
|
1 / 6
|
1
|
1
|
0
|
1 / 7
|
1
|
1
|
1
|
1 / 8
|
·
Биты 4,3 - ADC12SSEL (Source Select) - определяют источник тактирования АЦП.
ADC12SSEL1
|
ADC12SSEL0
|
Источник
|
0
|
0
|
ADC12OSC
|
0
|
1
|
ACLK
|
1
|
0
|
MCLK
|
1
|
1
|
SMCLK
|
· Биты 2,1 - CONSEQ (Conversion Sequence) - последовательность
преобразования. Биты определяют режим преобразования АЦП.
CONSEQ1
|
CONSEQ0
|
Режим
|
0
|
0
|
Однократный одноканальный
|
0
|
1
|
Однократный
многоканальный
|
1
|
0
|
Повторяющийся
одноканальный
|
1
|
1
|
Повторяющийся
многоканальный
|
· Бит 0 - ADC12BUSY - индицирует активность АЦП,
доступен только по чтению. Устанавливается аппаратно, если АЦП находится в
состоянии выборки или преобразования, в противном случае - сбрасывается.
Примечание. Биты с 3 по 15 этого регистра могут быть
модифицированы только если бит ENC=0.
Ø ADC12MEMx
(Memory) - регистры буферной памяти АЦП,
предназначенные для сохранения результатов преобразования. Результат 12-ти
разрядного преобразования АЦП сохраняются в младших битах регистров. Биты 15…12 всегда читаются как 0.
Ø ADC12MCTLx
(Memory Control) - регистры управления буферной
памятью АЦП. 8-ми разрядные регистры, содержащие номер канала, источник опоры
и признак конца последовательности для соответствующего регистра ADC12MEMx.
· Бит 7 - EOS
(End Of Sequence) - конец последовательности. Для
многоканальных режимов логическая 1, установленная в этом бите, задает
последнее преобразовании в серии.
· Биты 6,5,4 - SREF (Select Reference) - выбор опоры.
Задают тип опорного
напряжения АЦП для данного преобразования.
SREF2
|
SREF1
|
SREF0
|
Опора
|
0
|
0
|
0
|
Vr+ = AVcc;
Vr-=AVss
|
0
|
0
|
1
|
Vr+ =VREF+;
Vr-=AVss
|
0
|
1
|
0
|
Vr+ = VeREF+;
Vr-=AVss
|
0
|
1
|
1
|
Vr+ = VeREF+;
Vr-=AVss
|
1
|
0
|
0
|
Vr+ = AVcc;
Vr-=VREF-
|
1
|
0
|
1
|
Vr+ =VREF+;
Vr-= VREF-
|
1
|
1
|
0
|
Vr+ = VeREF+;
Vr-= VREF-
|
1
|
1
|
1
|
Vr+ = VeREF+;
Vr-= VREF-
|
· Биты 3…0 - INCH
(Input Channel) - входной канал. Эти биты задают
физический канал, напряжение которого будет сохранено в соответствующем
регистре ADC12MEMx.
INCH
|
Канал
|
0000
|
A0
|
0001
|
A1
|
0010
|
A2
|
0011
|
A3
|
0100
|
A4
|
0101
|
A5
|
0110
|
A6
|
0111
|
A7
|
1000
|
VeREF+
|
1001
|
VREF-
|
1010
|
Температ. датчик
|
1011
|
(AVcc-AVss)/2
|
1100
|
(AVcc-AVss)/2
|
1101
|
(AVcc-AVss)/2
|
1110
|
(AVcc-AVss)/2
|
1111
|
(AVcc-AVss)/2
|
Ø ADC12IE (Interrupt Enable) - разрешение прерывания. Регистр
содержит 16 битов разрешения прерывания для записи результатов преобразования
в регистры ADC12MEMx. Бит 0 - соответствует записи в регистр ADC12MEM0, бит 1 - в регистр ADC12MEM1
и т.д. Логическая 1 в битах - разрешает, а 0 - запрещает прерывание.
Ø ADC12IFG (Interrupt Flag) - флаги прерывания. Регистр
содержит 16 флагов, которые устанавливаются аппаратно при записи результата
преобразования в соответствующий регистр ADC12MEMx.
Сбрасываются аппаратно при чтении соответствующего регистра ADC12MEMx или программно.
Ø ADC12IV (Interrupt Vector) - регистр идентификации
прерывания. В том случае, если возникают условия для запроса прерывания, в
этом регистре генерируется код, позволяющий определить индекс источника
прерывания - переполнение АЦП или установка флагов в регистре ADC12IFG. Флаги переполнения автоматически сбрасываются
после чтения ADC12IV. В том случае, если имеется
несколько установленных флагов требования прерывания, в регистр подставляется
код источника прерывания с более высоким приоритетом. После вычитывания
содержимого регистра, в него подставляется код следующего источника
прерывания.
Код ADC12IV
|
Источник
|
Приоритет
|
00h
|
Нет прерываний
|
|
02h
|
Память не вычитана
|
Высший
|
04h
|
Запрос до окончания
преобразования
|
|
06h
|
Запись в ADC12MEM0
|
|
08h
|
Запись в ADC12MEM1
|
|
0Ah
|
Запись в ADC12MEM2
|
|
0Ch
|
Запись в ADC12MEM3
|
|
0Eh
|
Запись в ADC12MEM4
|
|
10h
|
Запись в ADC12MEM5
|
|
12h
|
Запись в ADC12MEM6
|
|
14h
|
Запись в ADC12MEM7
|
|
16h
|
Запись в ADC12MEM8
|
|
18h
|
Запись в ADC12MEM9
|
|
1Ah
|
Запись в ADC12MEM10
|
|
1Ch
|
Запись в ADC12MEM11
|
|
1Eh
|
Запись в ADC12MEM12
|
|
20h
|
Запись в ADC12MEM13
|
|
22h
|
Запись в ADC12MEM14
|
|
24h
|
Запись в ADC12MEM15
|
Низший
|
Техника работы с регистром ADC12IV
аналогична регистру TAIV
(см. п. 3.7)
ПРИМЕР
Организовать измерение напряжений подключенных к выводам A0, A2, A3 и
A6. Тактирование от SMCLK - 4MHz, опора - встроенная 2.5V, выходное сопротивление источников A0, A2 и A6 -
1 kOm, A3 - 50 kOm. Измеренные напряжения, выраженные в милливольтах, записать в ОЗУ,
начиная с адреса 200h.
Рассчитаем время выборки, необходимое для источников 1kOm
t1 =
9.011* (1+2)*103 * 40 * 10-12 + 800 * 10-9 ≈ 2 µs
Это время, выраженное в тактах SMCLK составит
N1=t1 * 4 MHz = 2* 4 = 8
Значение N1=8
соответствует коду 001b
поля SHT регистра ADC12CTL0.
Рассчитаем время выборки, необходимое для источников 50kOm
t2 =
9.011* (50+2)*103 * 40 * 10-12 + 800 * 10-9 ≈ 20 µs
Время t2,
выраженное в тактах SMCLK
составит
N2 =
t2 * 4 MHz = 20 * 4 = 80
Значение N2=80
соответствует коду 101b
поля SHT регистра ADC12CTL0.
Измерение будем проводить серией из 4-х преобразований
(однократный многоканальный режим, множественный выбор/преобразование), с
программным стартом. Т.к. имеется возможность установить разное время захвата
для групп буферной памяти ADC12MEM0 - 7 и ADC12MEM8
- 15, распределим буферную память следующим образом:
ADC12MEM5 - для канала A0, время захвата 2 µs;
ADC12MEM6 - для канала A2, время захвата 2 µs;
ADC12MEM7 - для канала A6, время захвата 2 µs;
ADC12MEM8 - для канала A3, время захвата 20 µs, последнее измерение в серии.
Для расчета напряжений, выраженных в милливольтах,
воспользуемся соотношением:
V = N*REF/4096
где
V -
входное напряжение напряжения;
N -
результирующий код преобразования;
REF
- напряжение опоры.
Т.к. величина V должна быть выражена в милливольтах, значение REF подставим так же в милливольтах. Тогда
V = N * 2500 / 4096 = N * 2500 / 212
Вместо операции деления можно использовать сдвиг вправо
32-х битного результата умножения на 12 бит. Тот же результат можно более
быстро получить с помощью 4-х кратного сдвига влево 32-х битного результата
умножения и отбрасывания младших 16-ти бит. Однако, более эффективно расчет
по приведенной формуле можно выполнить следующим образом. Заранее вычисляется
коэффициент
k=
216 * 2500 / 212 = 24 * 2500 = 40000
При расчете необходимо код преобразования АЦП умножить на
40000, тогда старшее слово продукта умножения даст требуемое значение.
#include <msp430x14x.h>0F000h: mov #300h, SP
. . .
; SHT1=5, SHT0 =1, MSC=1, REF2_5V=1, REFON=1,
ADC12ON=1
mov #51F0h, &ADC12CTL0
; CSTARTADDR=5, SHS=0, SPH=1, ADC12SSEL=3, CONSEQ=1
mov #521Ah, &ADC12CTL1.b #10h, &ADC12MCTL5 ;
SREF=1, INCH=0, EOS=0
mov.b #12h, &ADC12MCTL6 ; SREF=1, INCH=2, EOS=0
mov.b #16h, &ADC12MCTL7 ; SREF=1, INCH=6, EOS=0
mov.b #93h, &ADC12MCTL8 ; SREF=1, INCH=3, EOS=1
clr
&ADC12IFG ; на всякий случай сбрасываем флаги
bis
#3, &ADC12CTL0 ; старт АЦП : ENC=1, ADC12SC=1
mov
#ADC12MEM5, R4 ;
указатель на ADC12MEM5
mov
#200h, R5 ; указатель на ОЗУ
wait:
bit #100h, &ADC12IFG ; преобразование завершено?
jz wait ;
если нет - цикл
mov
@R4+, &MPY ; расчет напряжения
mov
#40000, &OP2
mov
&RESHI, R12 ; читаем результат
rla
&RESLO ; округляем до целого
adc R12
mov R12,
0(R5) ; сохраняем значение
напряжения в ОЗУ
incd R5 ;
наращиваем указатель ОЗУ
cmp
#208h, R5 ; все данные записаны в ОЗУ?
jne wait ;
если нет -цикл
. . .
3.12 Flash контроллер
MSP-микроконтроллеры
содержат в своем составе контроллер программирования собственной flash-памяти. Программирование (запись
логических нулей) может осуществляться побайтно и пословно, стирание (запись
логических единиц) - может производиться сегментами, размером 512 (Flash память программ) или 128 (Flash память данных) байт (см. рис. 1).
Процесс стирания/записи происходит под управлением
встроенного генератора времени, осуществляющего тактирование Flash контроллера. При этом для
нормальной работы частота тактирования Flash контроллера должна находиться в диапазоне 257 - 476
kHz. В противном случае Flash память микроконтроллера может
подвергнуться стрессу. Настройка частоты тактирования Flash контроллера производиться с
помощью делителя частоты, коэффициент деления, которого задается через
регистр управления.
.12.1
Стирание Flash памяти
Режим стирания памяти задается состоянием битов MERAS и ERAS регистра управления, при условии, что бит LOCK (блокировка записи flash памяти) сброшен в ноль. При этом
возможны следующие режимы:
· стирание одного сегмента;
· стирание всей памяти программ;
· одновременное стирание всей памяти программ и Flash памяти данных.
Стирание инициализируется записью произвольных данных в
выбранный сегмент памяти при установленных битах MERAS и/или ERAS. Сразу после этого в регистре управления устанавливается бит BUSY, сигнализируя об активности
операции стирания. По окончанию операции BUSY сбрасывается в 0 автоматически.
Во время операции стирания/записи процессор не должен
обращаться к Flash памяти.
Так как вектора прерывания расположены в верхней области памяти программ, все
прерывания также должны быть запрещены.
Если процесс стирания был инициирован командой,
расположенной во Flash памяти,
работа процессора автоматически блокируется на время активности сигнала BUSY. Для стирания памяти необходимо
выполнить следующую последовательность действий:
1) Запретить все прерывания и остановить сторожевой
таймер.
2) Настроить тактовую частоту Flash контроллера.
) Установить режим стирания битами MERAS и/или ERAS и сбросить бит LOCK в состояние 0.
) Произвести фиктивную запись в выбранный сегмент.
) Если требуется, разрешить прерывания, сторожевой
таймер и установить LOCK
бит.
Период полного стирания Flash памяти может достигать нескольких десятков
миллисекунд. В течение этого время процессор находиться в деактивированном
состоянии. Для того чтобы процессор мог исполнять какую-либо полезную работу
во время процесса стирания, необходимо, чтобы команда на стирание памяти
производилась не из Flash,
а из ОЗУ. Естественно, что для этого подпрограмма стирания изначально должна
располагаться во Flash памяти.
Перед началом процесса стирания тело этой подпрограммы должно быть
скопировано в ОЗУ, после чего ей должно быть передано управление. Прерывания
в данном случае также должны быть запрещены, т.к. адрес подпрограммы
обработки прерывания вычитывается из старших адресов Flash памяти (см. п. 3.2). Для стирания памяти при работе
из ОЗУ необходимо выполнить следующую последовательность действий:
1) Запретить все прерывания и остановить сторожевой
таймер.
2) Настроить тактовую частоту Flash контроллера.
) Дождаться, пока состояние бита BUSY не станет равным 0.
) Установить режим стирания битами MERAS и/или ERAS и сбросить бит LOCK в состояние 0.
) Произвести фиктивную запись в выбранный сегмент.
) Дождаться, пока состояние бита BUSY не станет равным 0.
) Если требуется, разрешить прерывания, сторожевой
таймер и установить LOCK
бит.
.12.2
Запись Flash памяти
Запись Flash
памяти можно осуществлять в режимах байт/слово или блоком, состоящим из 64
байт. Режим записи памяти определяется состоянием бита BLKWRT регистра управления. Программа,
осуществляющая запись побайтно/пословно, может располагаться как во Flash памяти, так и в ОЗУ. Запись блока
данных может осуществляться только из подпрограммы, расположенной в ОЗУ. Разрешение
записи данных во Flash памяти
производиться с помощью бита WRT
регистра управления.
Для записи байта/слова из Flash памяти необходимо выполнить следующие действия:
1) Запретить все прерывания и сторожевой таймер.
2) Настроить тактирование Flash контроллера.
) Очистить LOCK бит.
) Установить бит WRT.
) Записать данные по требуемому адресу с помощью
словной или байтовой формы инструкции.
) Сбросить бит WRT и, если требуется, разрешить прерывания, сторожевой
таймер и установить LOCK
бит.
Для записи байта/слова из ОЗУ необходимо выполнить
следующие действия:
1) Запретить все прерывания и сторожевой таймер.
2) Дождаться, пока состояние бита BUSY не станет равно 0.
) Настроить тактирование Flash-контроллера и сбросить бит LOCK
) Установить бит WRT.
) Записать в память слово или байт
) Дождаться, пока состояние бита BUSY не станет равно 0.
) Сбросить бит WRT и, если требуется разрешить прерывания, сторожевой
таймер и LOCK бит.
Время записи одного слова/байта может составить несколько
миллисекунд. Существенно сократить это время можно, используя блочный метод
записи. Для записи блока данных в память необходимо выполнить следующие
действия:
1) Выполнить пункты 1..3 алгоритма записи байта/слова.
2) Установить биты 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 регистра управления, после чего
текущая операция завершается безаварийным образом.
.12.3
Регистры Flash контроллера
Все регистры управления Flash контроллера - 16-ти битные регистры, защищенные
паролем и доступные как для записи, так и для чтения. Во всех регистрах
старший байт содержит поле пароля, а младший байт - содержит управляющие
биты. К регистрам необходимо обращаться только с помощью словных форм
инструкций. При этом для операции записи старший байт должен содержать код
пароля - 0A5h, в противном случае аппаратно устанавливается бит KEYV регистра управления и генерируется
сброс микроконтроллера. При чтении старший байт регистров всегда содержит код
96h. Т.к. коды в старшем байте
регистров управления различны при записи и чтении следует избегать обращения
к этим регистрам с помощью команд типа чтение-модификация-запись, таких
например, как bis, bic.
Регистры модуля Flash контроллера представлены в таблице 16.
Таблица 16
Имя
|
Назначение регистра
|
Адрес
|
Нач.значен.
|
FCTL1
|
Регистр управления 1
|
128h
|
9600h
|
FCTL2
|
Регистр управления 2
|
12Ah
|
9642h
|
FCTL3
|
Регистр управления 3
|
12Ch
|
9618h
|
IE1
|
Регистр разрешения
прерываний
|
0h
|
0
|
Ø FCTL1 (Flash Control 1) - содержит биты управления Flash контроллера.
· Биты 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 (Flash Write Key) - flash-ключ записи.
Поле содержит пароль
доступа к регистру. При записи поле должно содержать код 5Ah, при чтении поле содержит код 96h.
· Биты 7,6 - FSSEL (Flash controller clock Source Select) - выбор тактирования Flash контроллера.
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.
Ø FCTL3 (Flash Control 3) - содержит биты управления Flash контроллера.
· Биты 15..8 - FWKEY (Flash Write Key) - flash-ключ записи.
Поле содержит пароль
доступа к регистру. При записи поле должно содержать код 5Ah, при чтении поле содержит код 96h.
· Биты 7,6 -
зарезервированы.
· Бит 5 - EMEX (Emergency Exit) - аварийное стирание. Программная
установка этого бита останавливает процесс стирания/записи Flash памяти.
· Бит 4 - LOCK - блокировка. Установка/сброс этого бита блокирует/разблокирует
возможность стирания и записи Flash
памяти.
· Бит 3 - WAIT - ожидание. Бит доступен только для чтения. Устанавливается аппаратно
для информирования о готовности Flash памяти к записи нового байта/слова.
· Бит 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>2000h: mov #WDTPW+WDTHOLD,
&WDTCTL ; запрет WatchDog #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)#WriteStart, R15 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.