- •Микроконтроллеры msp430 Введение
- •1. Центральный процессор msp430
- •1.1. Адресное пространство микроконтроллеров msp430f1xx
- •1.2. Регистровый файл
- •1.3. Байтовая и словная формы инструкций.
- •1.4. Режимы адресации
- •1.4.1 Регистровая адресация
- •1.4.2. Индексная адресация
- •1.4.3 Символьная адресация
- •1.4.4 Абсолютная адресация
- •1.4.5. Косвенная адресация
- •1.4.6. Косвенная адресация с автоинкрементом
- •1.4.7 Непосредственная адресация
- •2. Система команд msp микроконтроллеров
- •2.1. Двухадресные команды
- •2.2 Одноадресные команды
- •2.3 Команды переходов
- •2.4. Эмулируемые команды
- •3. Периферийные устройства микроконтроллеров msp430f1xx
- •3.1 Внешние выводы микроконтроллера msp430f149
- •3.2 Система прерываний
- •3.3 Система тактирования
- •3.4 Сторожевой таймер
- •3.5 Аппаратный умножитель
- •3.6 Порты ввода/вывода
- •3.7 Таймер a3
- •3.8 Таймер b7
- •3.9 Интерфейс usart
- •3.9.1 Режим uart
- •3.9.1.1 Передача данных
- •3.9.1.2 Прием данных
- •3.9.1.3 Поддержка коммуникации в многопроцессорных системах
- •3.9.1.4 Обнаружение стартового бита при приеме
- •3.9.1.5 Скорость передачи
- •3.9.1.6 Регистры usart
- •3.9.2 Режим spi
- •3.9.3 Режим i2c
- •3.9.3.1 Общие сведения о шине i2c
- •3.9.3.2 Режимы работы usart в режиме i2c
- •3.9.3.3 Арбитраж
- •3.9.3.4 Тактирование i2c модуля
- •3.9.3.4 Инициализация модуля i2c
- •3.9.3.5 Регистры модуля usart в режиме i2c
- •3.10 Аналоговый компаратор
- •3.11 Аналого-цифровой преобразователь adc12
- •3.12 Flash контроллер
- •3.12.1 Стирание Flash памяти
- •3.12.2 Запись Flash памяти
- •3.12.3 Регистры Flash контроллера
- •3.13 Цифро-аналоговый преобразователь
- •Контроллер dma
3.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 FFFFh0 устанавливается флаг переполнения таймера TAIFG. Период переполнения таймера определяется выражением: 65536*ΔT, где ΔT – период частоты тактирования таймера.
Режим суммирования (Up) - содержимое регистра TAR увеличивается на 1 при каждом тактирующем импульсе от 0 до содержимого регистра сравнения CCR0, после чего содержимое TAR сбрасывается и процесс счета начинается сначала. Флаг переполнения TAIFG устанавливается при переходе содержимого TAR CCR00. Период переполнения таймера определяется выражением: (CCR0+1)*ΔT.
Режим суммирования-вычитания (Up/Down) – содержимое TAR сначала увеличивается на 1 от значения 0 до содержимого CCR0, после чего направление счета меняется и таймер считает до 0. После достижения нулевого значения, направление счета опять меняется на противоположное и т.д. Флаг переполнения таймера TAIFG устанавливается при переходе TAR 10. Обычно этот режим применяется для широтно-импульсной модуляции PWM. Период переполнения таймера определяется выражением: 2*CCR0*ΔT.
Режимы работы таймера задаются блоком MODE. На рисунке 4 изображены режимы работы таймера. Содержимое таймера также может быть очищено программно с помощью бита TACLR регистра управления.
Рисунок 4. Режимы работы таймера A3
Модули захвата/сравнения имеют идентичную структуру. Т.к. каждый модуль может работать либо в режиме захвата, либо в режиме сравнения, в них используется общий регистр CCRx. Тип события для захвата выделяет блок CC_IN, тип режима сравнения генерирует блок CC_OUT.
Как видно из рисунка 3, для каждого модуля имеется свой набор входных и выходных сигналов. Входной сигнал для модулей захвата назначается битами CCIS регистров управления. Внутреннее подключение входов к потенциалам GND и VCC дает возможность осуществить программное срабатывание модуля захвата. В качестве второго входа модуля CC1 можно выбрать внутренний сигнал выхода встроенного аналогового компаратора CAOUT (см. п. 3.10). В качестве второго входа модуля CC2 можно выбрать внутреннюю частоту ACLK. Эта возможность предусмотрена для реализации умножителя частоты DCO (см.п.3.3).
Подключение выходных сигналов к модулю сравнения производится с помощью регистров 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.
Перечень регистров управления таймера A3 приведен в таблице 12.
Таблица 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) – содержит биты управления таймера А. Регистр доступен как для записи, так и для чтения с помощью словных форм инструкций и содержит следующие биты.
15 10 9 8
-
TASSEL 1, 0
7 6 5 4 3 2 1 0
-
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) - комбинация состояния этих бит определяет коэффициент деления входного делителя таймера
-
ID1
ID0
Коэффициент
0
0
1 / 1
0
1
1 / 2
1
0
1 / 4
1
1
1 / 8
Биты 5, 4 – MC (Mode Control) - комбинация состояния этих бит определяет текущий режим таймера
-
MC1
MC0
Режим
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) – содержат биты управления модулей захвата/сравнения. Все три регистра имеют идентичную структуру и доступны по записи и чтению с помощью словных форм инструкций. Регистры содержат следующие биты
15 14 13 12 11 10 9 8
CM1, 0 |
CCIS1,0 |
SCS |
SCCI |
- |
CAP |
7 6 5 4 3 2 1 0
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) – выбирают сигналы для входа модуля захвата.
-
CCIS1
CCIS0
Вход
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
reti
TimHndl: add &TAIV, PC ; общая ISR для TACCTL1.CCIFG,
reti ; TACCTL2.CCIFG и TACTL.TAIFG
jmp cc1
jmp cc2
nop
nop
timOvf: . . . ; начало 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.
Рисунок 5. Временная диаграммы генерации импульсов.
Параметры T1=1 µS, T2= 1/ (100 kHz)= 10 µS.
Значение, загружаемое в регистр TACCR0+1 = T2/Δt, где Δt – период тактирования таймера. Т.к. таймер должен тактироваться частотой SMCLK, то
TACCR0+1 = 10 µS * 8 MHz = 80.
Отсюда значение в TACCR0 = 79.
Значение, загружаемое в TACCR1, определится как
TACCR1 = 1 µS * 8 MHz = 8.
#include <msp430x14x.h> ; подключаем файл определений
mov #4, &P1SEL ; настраиваем P1.2/TA1 для поддержки TACCR1
mov #79, &TACCR0 ; задаем период импульсов
mov #8, &TACCR1 ; задаем длительность импульсов
mov #OUTMOD_7, &TACCTL1 ; настраиваем TACC1 на режим Reset/set,
; в msp430x14x.h определена константа
; OUTMOD_7=0Eh
mov #TASSEL+MC0+TACLR, &TACLR ;тактирование таймера от SMCLK,
; старт таймера в UP режиме
