Разряд | Исходное состояние | Назначение |
---|---|---|
Регистр управления S1CR, адрес памяти данных=0x3FF2 | ||
15 | 0 | Флаг FO (только чтение) |
14 | 0 | Разрешение внутреннего тактового генератора: 0 - запрещен, 1 - разрешен |
13 | 0 | Требование кадровой синхронизации приема: 0 - не требуется, 1 - требуется |
12 | 0 | Требование широкого кадрового импульса приемника: 0 - не требуется, 1 - требуется |
11 | 0 | Требование кадровой синхронизации передатчика: 0 - не требуется, 1 - требуется |
10 | 0 | Требование широкого кадрового импульса передатчика: 0 - не требуется, 1 - требуется |
9 | 0 | Разрешение внутреннего тактового генератора передатчика: 0 - запрещен, 1 - разрешен |
8 | 0 | Разрешение внутреннего кадрового генератора приемника: 0 - запрещено, 1 - разрешено |
7 | 0 | Разрешение инвертирования кадрового генератора передатчика: 0 - запрещено, 1 - разрешено |
6 | 0 | Разрешение инвертирования кадрового генератора приемника: 0 - запрещено, 1 - разрешено |
5, 4 | 0 | Формат данных: 00 - выравнивание по правому краю, старшие биты=0, 01 - выравнивание по правому краю, старшие биты=знаку, 10 - компандирование по МЮ закону, 11 - компандирование по А закону |
3…0 | 0 | Длина слова минус 1 |
Регистр делителя тактовых импульсов S1CLKDIV, адрес памяти данных=0x3FF1 | ||
15…0 | 0 | Делитель частоты тактовых импульсов = (CLKOUT/2*SCLK)-1 |
Регистр делителя кадровых импульсов приемника S1RFDIV, адрес памяти данных=0x3FF0 | ||
15…0 | 0 | Делитель частоты тактовых импульсов = (SCLK/RFS)-1 |
Регистр управления автобуферизацией S1ABUF, адрес памяти данных=0x3FEF | ||
15 | 0 | Блокирование вывода XTAL в режиме пониженной мощности: 0 - активен, 1 - блокирован (этот вывод должен быть блокирован, если к процессору подключен генератор, а не кварцевый резонатор) |
14 | 0 | Разрешение задержки запуска процессора из режима пониженной мощности на 4096 циклов: 0 - запрещено, 1 - разрешено |
13 | 0 | Принудительный вход в режим пониженной мощности: 0 - нормальный режим, 1 - режим пониженной мощности (осуществляется переход на вектор прерывания пониженной мощности) |
12 | 0 | Принудительный перезапуск процессора при подаче питания: 0 - нормальный режим, 1 - программный перезапуск |
11…9 | 0 | Номер индексного регистра передатчика |
8, 7 | 0 | Номер регистра модификатора передатчика |
6…4 | 0 | Номер индексного регистра приемника |
3, 2 | 0 | Номер регистра модификатора приемника |
1 | 0 | Разрешение автобуферизации передатчика |
0 | 0 | Разрешение автобуферизации приемника |
Таблица 4.2е Регистры управления программируемыми флагами
Разряд | Исходное состояние | Назначение |
---|---|---|
Регистр управления программируемыми флагами PFTYPE, адрес памяти данных=0x3FE6 | ||
15 | 0 | Не используется |
14…12 | 1 | Циклы ожидания байтовой памяти данных BDMA от 0 до 7 |
11 | 1 | Разрешение выборки портов ввода-вывода сигналом -CMS: 0 - запрещено, 1 - разрешено |
10 | 0 | Разрешение выборки байтовой памяти данных BDMA сигналом -CMS: 0 - запрещено, 1 - разрешено |
9 | 1 | Разрешение выборки памяти данных сигналом -CMS: 0 - запрещено, 1 - разрешено |
8 | 1 | Разрешение выборки памяти программ сигналом -CMS: 0 - запрещено, 1 - разрешено |
7…0 | 0 | Режим работы программируемых выводов флагов PF7…PF0: 0 - выход, 1 - вход |
Регистр управления программируемыми флагами PFDATA, адрес памяти данных=0x3FE5 | ||
15…8 | X | Не используются |
7…0 | X | Данные программируемых выводов флагов PF7…PF0 (чтение/запись) |
Таблица 4.2ж Регистры управления портом байтовой памяти BDMA
Разряд | Исходное состояние | Назначение |
---|---|---|
Регистр-счетчик слов BWCOUNT, адрес памяти данных=0x3FE4 | ||
15, 14 | 0 | Не используются |
14…0 | 0x20/0 | Значение счетчика (когда MMAP=0 и BMODE=0 значение счетчика = 0x20, когда MMAP=1 или BMODE=1 значение счетчика = 0) |
Регистр управления BDMACR, адрес памяти данных = 0x3FE3 | ||
15…8 | 0 | Номер страницы BDMA от 0 до 0xFFFF |
7…4 | 0 | Не используются |
3 | 1 | Режим работы процессора при выполнении циклов BDMA: 0 - работа, 1 - останов |
2 | 0 | Направление передачи данных: 0 - чтение из BDMA, 1 - запись в BDMA |
1, 0 | 0 | Тип данных: 00 - память программ 24 разрядов, 01 - память данных 16 разрядов, 10 - память данных 8 старших разрядов, 11 - память данных 8 младших разрядов |
Регистр внешнего адреса BEAD, адрес памяти данных = 0x3FE2 | ||
15, 14 | 0 | Не используются |
13…0 | 0 | Значение внешнего адреса на шине процессора, при обмене через BDMA (от 0 до 0x3FFF) |
Регистр внутреннего адреса BIAD, адрес памяти данных = 0x3FE1 | ||
15, 14 | 0 | Не используются |
13…0 | 0 | Значение внутреннего адреса памяти процессора при обмене через BDMA (от 0 до 0x3FFF) |
Таблица 4.2з Регистр управления IDMACR
Разряд | Исходное состояние | Назначение |
---|---|---|
15 | 0 | Не используется |
14 | 0 | Указатель типа памяти: 0 = память программ РМ, 1 = память данных DM |
13...0 | 0 | Значение начального адреса памяти процессора при обмене через IDMA (от 0 до 0x3FFF) |
X - произвольное состояние после сброса.
Условные обозначения регистров в таблицах соответствуют их названиям на программно-логической модели, изображенной на рис. 4.1.
Все перечисленные выше регистры позволяют осуществлять полный контроль и управление над процессором со стороны программы.
Глава 5. Система прерываний
В этой главе описывается система прерываний процессора, позволяющая процессору оперативно реагировать на различные события.
Диспетчер прерываний позволяет процессору реагировать на одиннадцать возможных прерываний и сброс. Все векторы прерываний процессора ADSP-2181 представлены в табл. 5.1.
Таблица 5.1 Векторы прерываний сигнального процессора ADSP-2181
Приоритет | Источник прерывания | Адрес (HEX) |
---|---|---|
Высший приоритет 0 | Сброс (или выход из режима пониженной мощности при установке 12-го разряда регистра S1ABUF=1) | 0000 |
1 | Снижение потребляемой мощности (немаскируемое прерывание) | 002C |
2 | IRQ2 | 0004 |
3 | IRQL1 | 0008 |
4 | IRQL0 | 000C |
5 | SPORT0 Передатчик | 0010 |
6 | SPORT0 Приемник | 0014 |
7 | IRQE | 0018 |
8 | BDMA прерывание | 001C |
9 | SPORT1 Передатчик или IRQ1 | 0020 |
10 | SPORT1 Приемник или IRQ0 | 0024 |
11 Низший приоритет | Таймер | 0028 |
Прерывания в процессоре имеют различную приоритетность, от 0 до 11. При возникновении любого из прерываний, процессор выполняет переход на подпрограмму обработки соответствующего прерывания, адрес которой заложен в векторе данного прерывания. Адреса векторов прерываний расположены в самом начале программной памяти процессора через четыре 24-разрядных слова команды, что позволяет производить простую обработку или выход из прерывания на месте, без перехода на подпрограмму обработчика прерывания. В противном случае может быть выполнен безусловный переход на подпрограмму обработчика прерывания командой jump.
Процессор ADSP-2181 имеет четыре вывода для поддержки внешних прерываний: IRQ2, IRQL0, IRQL1 и IRQE. Кроме того, благодаря возможности SPORT1 быть переконфигурированным на выводы флагов FLAG_IN, FLAG_OUT и прерываний IRQ0, IRQ1, процессор может иметь еще два входа внешних прерываний вместо внутренних прерываний SPORT1. В результате, в общей сложности процессор может иметь шесть внешних прерываний.
Помимо внешних прерываний, процессор имеет и внутренние источники прерываний. Источниками внутренних прерываний являются таймер, байтовый порт BDMA, два последовательных порта SPORT1 и SPORT2, программное прерывание сброса и прерывание, вызываемое снижением напряжения питания.
Все прерывания, кроме немаскируемого и сброса, можно запретить с помощью регистра IMASK (см. табл.1). Кроме того, можно программно сгенерировать или сбросить некоторые прерывания с помощью регистра IFC.
Процессор реагирует на уровень сигналов на выводах прерываний IRQL0 и IRQL1. Прерывание IRQE возникает по фронту изменения сигнала на этом выводе. Чувствительность процессора к сигналам IRQ0, IRQ1 и IRQ2 определяется программно, с помощью регистра ICNTL.
В следующей главе будет рассмотрена система команд процессора, с помощью которой осуществляются запись и чтение всех перечисленных здесь регистров и ячеек памяти самого процессора, а также операции сложения, умножения, ввода-вывода, управления программируемыми флагами и др.
Часть II. Программирование
В этой части книги описывается создание первой рабочей программы для сигнального процессора и ее трансляции для получения исполняемого кода. Дается описание процедуры загрузки и портов, через которые возможна данная операция. Приводится описание разработанного автором устройства для загрузки программ, просмотра и редактирования памяти процессора с помощью компьютера. Описываются назначение и работа специальной программы менеджера памяти. Дается описание директив ассемблера, формата данных и система команд для сигнального процессора.
Глава 6. Первая программа
В этой главе говорится о создании программ для сигнального процессора, инструментальном программном обеспечении, отладке и способах загрузки программ в сигнальный процессор.
Начнем изучение программирования сигнального процессора с конкретного примера программы, приведенной ниже. Эта программа поможет нам в изучении структуры программы, системы команд процессора и средств разработки, а также позволит на практике освоить процедуру отладки и загрузки программы в память процессора.
Введите текст этой программы в компьютер с помощью любого текстового редактора и сохраните в файле с именем mem_clr.dsp или скопируйте с компакт-диска, прилагаемого к данной книге.
/***********************************************************/
/* Программа mem_clr загружается в память программ и после */
/* запуска заполняет память данных сигнального процессора */
/* с адреса 0x0000 по адрес 0x3fdf числовыми значениями */
/* */
/* Версия: 1.0 */
/* Автор: О.Д.Вальпа */
/***********************************************************/
.module/RAM/ABS=0 mem_clr; { Модуль памяти mem_clr с адреса 0 }
.include <def2181.h>; { Включить файл определений }
.var/dm/ram/circ buf_dm[0x3fdf]; { Циклический буфер в памяти данных }
jump BEGIN; nop; nop; nop; { Вектор прерывания сброса процессора }
rti; nop; nop; nop; { Вектор прерывания IRQ2 }
rti; nop; nop; nop; { Вектор прерывания IRQL1 }
rti; nop; nop; nop; { Вектор прерывания IRQL0 }
rti; nop; nop; nop; { Вектор прерывания SPORT0 TX }
rti; nop; nop; nop; { Вектор прерывания SPORT0 RX }
rti; nop; nop; nop; { Вектор прерывания IRQE }
rti; nop; nop; nop; { Вектор прерывания BDMA }
rti; nop; nop; nop; { Вектор прерывания SPORT1 TX (IRQ1) }
rti; nop; nop; nop; { Вектор прерывания SPORT1 RX (IRQ0) }
rti; nop; nop; nop; { Вектор прерывания TIMER }
rti; nop; nop, nop; { Вектор прерывания POWER DOWN }
/************** начало программы ************************************/
BEGIN: { Метка начала программы }
ax0 = b#0111111110000000; dm(pftype) = ax0; {Инициализация флагов PF}
{ │└┬┘││││76543210 }
{ │ │ ││││└+++++++ - PF0-PF7: 0-вход 1-выход }
{ │ │ │││└──────── - PM - выход -CMS }
{ │ │ ││└───────── - DM | 0-запрещен }
{ │ │ │└────────── - BM | 1-разрешен }
{ │ │ └─────────── - IOM-- }
{ │ └───────────── - От 0 до 7 циклов задержки BDMA }
{ └ He используется, всегда=0 }
ax0 = b#0000000010000000; dm(PFDATA) = ax0;{Управление светодиодом }
{ 76543210 }
{ │ └──┴ - Вход:Код клавиш }
{ └─────── - Выход:Светодиод }
i0 = ^buf_dm; { Индексный регистр i0=адресу начала буфера }
l0 = %buf_dm; { Регистр длины l0=длине буфера }
m0 = 1; { Регистр модификатора m0=1 }
ar = 0x1234; { Записать данные в рабочий регистр ar }
cntr=10; { Загрузить счетчик циклов }
do CLR_DM until се; { Выполнять до CLR_DM пока счетчик не обнулится }
dm(i0, m0) = ar; { Заполнение очередной ячейки памяти данных }
CLR_DM:nop; { Пустая команда }
toggle fl2; { Инвертировать вывод процессора FL2 }
dm(0) = ar; { Заполнение ячейки памяти данных с адресом 0 }
ar = ar + 1; { увеличивающимися значениями }
ax0 = dm(PFDATA); { Читать код клавиш }
dm(1) = ax0; { и записать в ячейку памяти данных по адресу 1}
jump CLR_DM; { Зациклить программу }
.endmod; { Конец программы }
Имя данного файла можно изменить на любое другое, длиной от одного до восьми символов, разрешенных для имен файлов. Расширение "dsp" выбрано не случайно. При трансляции программы, компилятор будет искать файл программы именно с таким расширением. Если он не найдет такой файл, то выведет сообщение Preprocessor failed to open mem_clr.dsp.
Рассмотрим структуру и состав приведенного выше файла. Как видно из примера, в начале файла программы находится описание назначения программы, ее версии и пр. атрибуты, заключенные между символами /* и */ в качестве комментариев. Далее следуют три строки директив с комментариями, описывающими назначение этих директив и заключенными между фигурными скобками. Фигурные скобки также предназначены для вставки комментариев в программу. Файл def2181.h, включаемый в файл программы с помощью директивы #include, состоит из строк, присваивающих символьным именам регистров значение их адресов в области памяти данных процессора.
Использование символьных имен позволяет записывать в программе не конкретные цифровые значения адресов или данных, а их словесные описания, более понятные и легче запоминающиеся. Это делается для придания программе наглядности, предотвращения машинальных ошибок во время ее создания и облегчения ее понимания. Содержимое файла def2181.h приведено ниже.
.const IDMA= 0x3fe0;
.const BDMA_BIAD= 0x3fe1;
.const BDMA_BEAD= 0x3fe2;
.const BDMA_BDMA_Ctrl= 0x3fe3;
.const BDMA_BWCOUNT= 0x3fe4;
.const PFDATA= 0x3fe5;
.const PFTYPE= 0x3fе6;
.const SPORT1_Autobuf= 0x3fef;
.const SPORT1_RFSDIV= 0x3ff0;
.const SPORT1_SCLKDIV= 0x3ff1;
.const SPORT1_Control_Reg= 0x3ff2;
.const SPORT0_Autobuf= 0x3ff3;
.const SPORT0_RFSDIV= 0x3ff4;
.const SPORT0_SCLKDIV= 0x3ff5;
.const SPORT0_Control_Reg= 0x3ff6;
.const SPORT0_TX_Channels0= 0x3ff7;
.const SPORT0_TX_Channels1= 0x3ff8;
.const SPORT0_RX_Channels0= 0x3ff9;
.const SPORT0_RX_Channels1= 0x3ffa;
.const TSCALE= 0x3ffb;
.const TCOUNT= 0x3ffс;
.const TPERIOD= 0x3ffd;
.const DM_Wait_Reg= 0x3ffe;
.const System_Control_Reg= 0x3fff;
Описание этих символьных имен и их соответствие адресам памяти данных процессора приведено в табл. 6.1.
Таблица 6.1 Описание символьных имен регистров управления и состояния процессора ADSP-2181