DSP > САПР > Цифровой сигнальный процессор ТМS320F2812: Курс лабораторных работ

ЛР3 > Работа с портами ввода/вывода процессора TMS320F2812

Цифровой сигнальный процессор ТМS320F2812: Курс лабораторных работ

Тема: Знакомство с портами ввода/вывода процессора TMS320F2812

Все периферийные устройства, входящие в состав процессора, управляются с помощью соответствующего набора регистров. Регистры периферийных устройств сгруппированы в регистровые банки или регистровые фреймы (Peripheral Frames – PF0, PF1 и PF2), которые располагаются в области памяти данных. Распределение памяти процессора TMS320F2812 показано на рисунке 1.

Рисунок 1. Распределение памяти процессора TMS320F2812 [1].

Первый регистровый банк PF0 располагается по адресам с 0х00 0800 по 0х00 0СFF и включает в себя регистры управления интерфейсом с внешними устройствами (XINTF), регистры установки параметров обмена с внутренней FLASH-памятью, управляющие регистры таймеров 0, 1 и 2 и др.

Второй регистровый банк PF1 располагается по адресам с 0х00 6000 по 0х00 6FFF и включает в себя регистры управления и информационные регистры последовательного канала обмена информацией eCAN.

Третий регистровый банк PF2 располагается по адресам с 0х00 7000 по 0х00 7FFF и включает в себя регистры управления последовательными каналами обмена SPI и SCI, портами ввода/вывода GPIO, встроенным АЦП, модулями обработки событий EV-A и EV-B и др.

Большое количество внутренних периферийных устройств и ограниченное количество контактов ввода/вывода процессора заставляют использовать одни и те же контакты в различных режимах работы. Режим мультиплексирования позволяет применять один физический контакт процессора для реализации двух, а иногда трех, различных функций. Следующая таблица изображает возможные режимы работы контактов ввода/вывода процессора TMS320F2812 (таблица 1) [1, 3].

                                    Таблица 1.

Порт А Порт В Порт F
GPIOA0/PWM1 GPIOB0/PWM7 GPIOF0/SPISIMOA
GPIOA1/PWM2 GPIOB1/PWM8 GPIOF1/SPISOMIA
GPIOA2/PWM3 GPIOB2/PWM9 GPIOF2/SPICLKA
GPIOA3/PWM4 GPIOB3/PWM10 GPIOF3/SPISTEA
GPIOA4/PWM5 GPIOB4/PWM11 GPIOF4/SCITXDA
GPIOA5/PWM6 GPIOB5/PWM12 GPIOF5/SCIRXDA
GPIOA6/T1PWM/T1CMP GPIOB6/T3PWM/T3CMP GPIOF6/CANTXA
GPIOA7/T2PWM/T2CMP GPIOB7/T4PWM/T4CMP GPIOF7/CANRXA
GPIOA8/CAP1/QEP1 GPIOB8/CAP4/QEP3 GPIOF8/MCLKXA
GPIOA9/CAP2/QEP2 GPIOB9/CAP5/QEP4 GPIOF9/MCLKRA
GPIOA10/CAP3/QEPI1 GPIOB10/CAP6/QEPI2 GPIOF10/MFSXA
GPIOA11/TDIRA GPIOB11/TDIRB GPIOF11/MFSRA
GPIOA12/TCLKINA GPIOB12/TCLKINB GPIOF12/MDXA
GPIOA13/C1TRIP GPIOB13/C4TRIP GPIOF13/MDRA
GPIOA14/C2TRIP GPIOB14/C5TRIP GPIOF14/XF
GPIOA15/C3TRIP GPIOB15/C6TRIP
Порт Е Порт G Порт D
GPIOE0/XINT1/XBIO GPIOG4/SCITXDB GPIOD0/T1CTRIP/PDPINTA
GPIOE2/XNMI/XINT13 GPIOG5/SCIRXDB GPIOD1/T2CTRIP/EVASOC
GPIOE1/XINT2/ADCSOC GPIOD5/T3CTRIP/PDPINTB
GPIOD6/T4CTRIP/EVBSOC

После включения питания и подачи сигнала «Сброс» (RESET) все многофункциональные контакты процессора переходят в режим работы портов ввода/вывода общего назначения (General Purpose Input Output, GPIO). В этом режиме для портов А, В, D и Е доступна дополнительная функция – фильтрация дребезга входного сигнала (Input Qualification feature). При использовании этой функции, длительность входного сигнала должна превышать некоторое заданное количество периодов тактовой частоты, для принятия решения об уровне входного сигнала.

Выбор режима работы порта осуществляется соответствующим регистром-мультиплексором GPxMUX (где х – указывает на выбранный порт от А до F). Установка нуля в некотором бите данного регистра переводит соответствующий данному биту контакт в режим работы ввода/вывода цифровых сигналов. Запись единицы в некоторый бит данного регистра переводит соответствующий контакт в альтернативный режим работы (выполнение основной функции).

Если порты настроены на режим ввода/вывода цифровых сигналов, то следующая группа регистров GPxDIR определяет направление передаваемой информации. Запись нуля в соответствующий бит данного регистра настраивает выбранный канал на ввод информации, а запись единицы – на вывод.

Если один из портов А, В, D или Е настроен на режим ввода цифровых сигналов, то установками в регистрах GPxQUAL можно задать соответствующий интервал времени, по истечении которого значение входного сигнала принимается как истинное (от 2 до 510 периодов внутренней частоты SYSCLKOUT).

В таблице 2 представлены адреса управляющих регистров портов ввода/вывода процессора TMS320F2812 [1, 3].

                                Таблица 2.

Адрес Регистр Наименование
0х70С0 GPAMUX Регистр-мультиплексор порта А
0x70C1 GPADIR Регистр направления порта А
0x70C2 GPAQUAL Регистр временного интервала порта А
0x70C4 GPBMUX Регистр-мультиплексор порта B
0x70C5 GPBDIR Регистр направления порта B
0x70C6 GPBQUAL Регистр временного интервала порта B
0x70CC GPDMUX Регистр-мультиплексор порта D
0x70CD GPDDIR Регистр направления порта D
0x70CE GPDQUAL Регистр временного интервала порта D
0x70D0 GPEMUX Регистр-мультиплексор порта E
0x70D1 GPEDIR Регистр направления порта E
0x70D2 GPEQUAL Регистр временного интервала порта E
0x70D4 GPFMUX Регистр-мультиплексор порта F
0x70D5 GPFDIR Регистр направления порта F
0x70D8 GPGMUX Регистр-мультиплексор порта G
0x70D9 GPGDIR Регистр направления порта G

Обращение к управляющим регистрам портов ввода/вывода защищено специальным битом EALLOW (бит 6 регистра статуса ST1) [2]. Установка этого бита (запись логической единицы) разрешает доступ к управляющим регистрам, сброс бита (запись логического нуля) – запрещает доступ. По сигналу RESET этот бит устанавливается в нулевое состояние. Для управления этим битом в языке ассемблер процессора TMS320F2812 существуют специальные команды – EALLOW (установка бита в единичное состояние) и EDIS (сброс бита в нулевое состояние).

При установке портов в режим ввода/вывода цифровых сигналов, все принимаемые или передаваемые данные хранятся в регистрах данных соответствующих портов GPxDAT. Существует ряд дополнительных регистров, позволяющих управлять сигналами, передаваемыми процессором. Регистры установки GPxSET (доступны только по записи) – запись логической единицы в один из битов данного регистра приводит к установке высокого уровня на соответствующем данному биту контакте. Запись логического нуля в этот регистр, не приводит ни к каким изменениям. Регистры сброса GPxCLEAR (доступны только по записи) – запись логической единицы в один из битов данного регистра приводит к установке низкого уровня на соответствующем данному биту контакте. Запись логического нуля в этот регистр, не приводит ни к каким изменениям. Регистры переключения GPxTOGGLE (доступны только по записи) – запись логической единицы в один из битов данного регистра приводит к изменению на противоположное состояние соответствующего данному биту контакта. Запись логического нуля в этот регистр, не приводит ни к каким изменениям.

В таблице 3 представлены адреса регистров данных портов ввода/вывода процессора TMS320F2812 [1, 3].

                            Таблица 3.

Адрес Регистр Наименование
0x70E0 GPADAT Регистр данных порта А
0x70E1 GPASET Регистр установки порта А
0x70E2 GPACLEAR Регистр сброса порта А
0x70E3 GPATOGGLE Регистр переключения порта А
0x70E4 GPBDAT Регистр данных порта B
0x70E5 GPBSET Регистр установки порта B
0x70E6 GPBCLEAR Регистр сброса порта B
0x70E7 GPBTOGGLE Регистр переключения порта B
0x70EC GPDDAT Регистр данных порта D
0x70ED GPDSET Регистр установки порта D
0x70EE GPDCLEAR Регистр сброса порта D
0x70EF GPDTOGGLE Регистр переключения порта D
0x70F0 GPEDAT Регистр данных порта E
0x70F1 GPESET Регистр установки порта E
0x70F2 GPECLEAR Регистр сброса порта E
0x70F3 GPETOGGLE Регистр переключения порта E
0x70F4 GPFDAT Регистр данных порта F
0x70F5 GPFSET Регистр установки порта F
0x70F6 GPFCLEAR Регистр сброса порта F
0x70F7 GPFTOGGLE Регистр переключения порта F
0x70F8 GPGDAT Регистр данных порта G
0x70F9 GPGSET Регистр установки порта G
0x70FA GPGCLEAR Регистр сброса порта G
0x70FB GPGTOGGLE Регистр переключения порта G

На рисунке 2 показана структурная схема портов ввода/вывода процессора TMS320F2812.

    Рисунок 2. Структурная схема портов ввода/вывода [1].

В процессе выполнения нашей работы мы выполним настройки блока формирования тактовой частоты (PLL Block). Как и в большинстве современных процессоров, внешняя тактовая частота, подаваемая на процессор TMS320F2812, гораздо ниже, чем максимально возможная тактовая частота. Это делается с целью снижения уровня электромагнитных помех. Встроенный блок формирования тактовой частоты преобразует внешний тактирующий сигнал в необходимую внутреннюю тактовую частоту процессора. Структурная схема этого блока представлена на рисунке 3.

Рисунок 3. Структурная схема блока формирования тактовой частоты [1].

На отладочном модуле eZdsp TMS320F2812 установлен внешний генератор частоты 30 МГц. Для получения максимально возможной внутренней тактовой частоты процессора равной 150 МГц нам необходимо внешнюю частоту умножить на 10, а затем разделить на 2. Это достигается путем настройки управляющего регистра блока формирования тактовой частоты (PLL control register, PLLCR). Данный регистр располагается по адресу 0х7021 области памяти данных. Возможные значения коэффициентов умножения, устанавливаемые в этом регистре, показаны на рисунке 4.

Рисунок 4. Значения коэффициентов умножения внешней тактовой частоты [1].

    Полученная в результате частота CLKIN используется для тактирования центрального процессорного ядра. Частота SYSCLKOUT, которая используется для синхронизации внешних устройств, совпадает с частотой CLKIN.

    Для формирования тактовой частоты внутренних периферийных устройств, в процессоре TMS320F2812 используются два дополнительных делителя частоты – делитель частоты для быстродействующих устройств (High-speed Clock Pre-scaler, HISPCP) и делитель частоты для медленных устройств (Low speed Clock Pre-scaler, LOSPCP). Настройки этих двух делителей независимы друг от друга. Данные регистры располагаются по адресам 0х701А (HISPCP) и 0x701B (LOSPCP) области памяти данных. Значение коэффициента деления частоты, устанавливаемое в этих регистрах, показано в таблице 4 [1, 3].

                                    Таблица 4.

Значение разрядов [2..0] Коэффициент деления частоты
000 SYSCLKOUT/1
001 SYSCLKOUT/2
010 SYSCLKOUT/4
011 SYSCLKOUT/6
100 SYSCLKOUT/8
101 SYSCLKOUT/10
110 SYSCLKOUT/12
111 SYSCLKOUT/14

Примечание: Значящими разрядами в регистрах-делителях частоты являются три младших разряда.

    Для разрешения тактирования периферийных модулей служит специальный регистр – регистр управления тактовой частотой периферийных устройств (Peripheral Clock Control Register, PCLKCR), расположенный по адресу 0х701С в области памяти данных. Установка в единичное значение бита этого регистра разрешает прохождение тактовой частоты на соответствующее периферийное устройство.

    Теперь перейдем от теоретических сведений к нашей практической работе. Задача, которую мы будем решать сегодня – создание программы, формирующей режим «бегущего нуля» или «бегущей единицы» на выходных контактах порта В процессора. Управление формируемым сигналом и направление движения (от старшего значащего разряда к младшему или наоборот) задается двумя внешними сигналами, подаваемыми на младшие значащие разряды порта А. Ядро процессора должно работать с внутренней тактовой частотой, равной 150 МГц.

Задание 1.

Шаг 1. Создайте в рабочей директории новый проект. Назовите его Test3.

Шаг 2. Создайте исходный файл проекта. Текст программы приводится ниже.

#include “Test3.h”

void delay_loop(long);

    int i=0;

    int mode=0;

void main(void)

{

asm(“STR: EALLOW”); //Вставка ассемблерной инструкции

    *GPAMUX=0x0000; //Инициализация управляющих регистров

    *GPBMUX=0x0000;

    *GPADIR=0x0000;

    *GPBDIR=0xFFFF;

    *GPAQUAL=0x0000;

    *GPBQUAL=0x0000;

    *PLLCR=0x000A;

    *PCLKCR=0x0000;

asm (“S: EDIS”);

    while (1)

    {

        mode = 0x0003&(*GPADAT); //Выбор режима работы

        if (mode == 0)

        {

            for (i=0; i<16; i++)

            {    (*GPBDAT) =(~(1<<i));//Бегущий 0 справа налево

            delay_loop(1000);

            }

        }

        if (mode == 1)

        {

            for (i=0; i<16; i++)

            {        (*GPBDAT) =(1<<i);//Бегущая 1 справа налево

            delay_loop(1000);

            }

        }

        if (mode == 2)

        {

            for (i=0; i<16; i++)

            {    (*GPBDAT) =(1<<15-i);//Бегущая 1 слева направо

            delay_loop(1000);

            }

        }

        if (mode == 3)

        {

            for (i=0; i<16; i++)

            {    (*GPBDAT) =(~(1<<15-i));//Бегущий 0 слева направо

            delay_loop(1000);

            }

        }

    }

}

void delay_loop(long end)

{

    long i;

    for (i = 0; i < end; i++);

}

Сохраните программу под именем Test3.c в рабочей директории проекта. Данная программа выполняет следующие действия :

  1. инициализация управляющих регистров процессора:

    – порты А и В настраиваются как порты ввода/вывода;
    – порт А настраивается на прием сигналов, порт В настраивается на выдачу сигналов;

    – блок формирования тактовой частоты настраивается на умножение внешней тактовой частоты на 10 с последующим ее делением на 2;

    – тактирование внутренних периферийных устройств запрещено.

    2) программа переходит в бесконечный цикл. В этом цикле анализируется состояние двух младших разрядов порта А. В зависимости от их состояния, выбирается один из режимов формирования выходных сигналов портом В.

    3) внутренняя процедура delay_loop формирует задержку на переключение состояния выходных сигналов.

    4) в тексте данной программы имеются две ассемблерные команды (EALLOW и EDIS), которые включаются в исходный файл, написанный на языке С.

Шаг 3. Создайте вспомогательный файл (файл включений), в котором будут задаваться адреса управляющих регистров в области памяти данных. Текст данного файла приводится ниже.

int *GPAMUX = (int*)(0x70c0);

    int *GPBMUX = (int*)(0x70c4);

    int *GPADIR = (int*)(0x70c1);

    int *GPBDIR = (int*)(0x70c5);

    int *GPAQUAL = (int*)(0x70c2);

    int *GPBQUAL = (int*)(0x70c6);

    int *GPADAT = (int*)(0x70e0);

    int *GPBDAT = (int*)(0x70e4);

    int *PLLCR = (int*)(0x7021);

    int *PCLKCR = (int*)(0x701c);

    int *HISPCP = (int*)(0x701a);

    int *LOSPCP = (int*)(0x701b);

Сохраните этот файл в рабочей директории проекта под именем Test3.h.

Шаг 4. Добавьте файлы в проект. Файл Test3.c находится в рабочей директории проекта. Командный файл компоновщика (линкера)     Test3.cmd – находится в папке Solutions. Подключите библиотеку функций языка С rts2800_ml.lib (этот файл располагается в папке …\CCStudio_v3.1\c2000 \cgtools\lib\). Для подключения библиотеки можно воспользоваться настройками установок компоновщика (линкера). После добавления в проект исходного файла, командного файла компоновщика и библиотеки функций языка С, выполните команду Project Þ Scan All File Dependencies. Обратите внимание, после выполнения этой команды в папке Include (окно навигатора проекта) появился файл Test3.h. Запустите проект на компиляцию.

Шаг 5. Если проект скомпилировался без ошибок, загрузите программу в ЦСП. Перейдите к программной метке «main». Вызовите окно просмотра переменных Watch Window, и добавьте в него переменную mode. Вызовите для просмотра две области памяти данных – с начальными адресами 0х70С0 и 0х70Е0. В результате всех проделанных операций внешний вид среды проектирования Code Composer Studio должен выглядеть так, как показано на рисунке 5.

Рисунок 5. Внешний вид среды Code Composer Studio

    Шаг 6. Теперь можно приступать к отладке проекта. Существует два способа проверки работоспособности нашей программы.

    Способ 1. Можно подключить внешние устройства индикации и управления (светодиоды и переключатели) к соединителям Р8, Р4 и Р7 отладочного модуля eZdsp TMS320F2812. Назначение контактов этих соединителей представлены в таблицах 5 и 6 [4].

Таблица 5. Контакты соединителя Р8.

Номер контакта Назначение контакта Номер контакта Назначение контакта
1 VCC 21 NC
2 VCC 22 GPIOE0
3 GPIOF4 23 GPIOF0
4 GPIOF5 24 GPIOF1
5 GPIOE0 25 GPIOF2
6 GPIOA8 26 GPIOF3
7 GPIOA9 27 GPIOF6
8 GPIOA10 28 GPIOF7
9 GPIOA0 29 XCLKOUT
10 GPIOA1 30 GPIOB0
11 GPIOA2 31 GPIOB1
12 GPIOA3 32 GPIOB2
13 GPIOA4 33 GPIOB3
14 GPIOA5 34 GPIOB4
15 GPIOA6 35 GPIOB5
16 GPIOA7 36 GPIOB8
17 GPIOA11 37 GPIOD0
18 GPIOA12 38 GPIOD5
19 GND 39 GND
20 GND 40 GND

Таблица 6. Используемые контакты соединителей Р4 и Р7.

Соединитель Р4 Соединитель Р7
Номер контакта Назначение контакта Номер контакта Назначение контакта
11 GPIOB9 5 GPIOB13
12 GPIOB10 6 GPIOB14
13 GPIOB6 7 GPIOB15
14 GPIOB7
15 GPIOB11
16 GPIOB12

Возможный вариант подключения представлен на рисунке 6.

Рисунок 6. Возможный вариант подключения внешних устройств к отладочному модулю eZdsp TMS320F2812

После подключения внешних устройств запустите программу на выполнение с помощью команды Debug Þ Run. Наблюдайте результат работы программы на подключенных индикаторах. С помощью внешних переключателей измените режим работы программы и убедитесь в правильности ее работы.

    Способ 2. Если у Вас нет возможности подключить внешние устройства к отладочному модулю, тогда выполните следующие действия:

    1) установите точки останова в следующих строчках исходного текста программы:

        {    (*GPBDAT) =(~(1<<i));//Бегущий 0 справа налево

        {    (*GPBDAT) =(1<<i);//Бегущая 1 справа налево

        {    (*GPBDAT) =(1<<15-i);//Бегущая 1 слева направо

        {    (*GPBDAT) =(~(1<<15-i));//Бегущий 0 слева направо

2) запустите программу на выполнение с помощью команды Debug Þ Run;

3) повторно запуская программу на исполнение с помощью команды Debug Þ Run(или нажатием функциональной клавиши F5), следите за изменениями состояния регистра данных порта В (в окне визуализации памяти данных по адресу 0х70Е4) как показано на рисунке 7;

Рисунок 7. Изменение данных в регистре данных порта В

4) для изменения режима работы программы соедините с помощью внешней перемычки контакты соединителя Р8:
– две перемычки между контактами 9 и 19, и 10 и 20 – режим 0;
– перемычка между контактами 10 и 20 – режим 1;
– перемычка между контактами 9 и 19 – режим 2;
– отсутствие перемычек – режим 3.

5) после установки перемычек повторите действия, описанные в пункте 3). Обратите внимание на изменения переменной mode в окне визуализации переменных.

Задание 2.

    Во втором задании мы тоже будем управлять состоянием портов ввода\вывода. Только для создания нашей программы мы воспользуемся библиотечными функциями, которые поставляются фирмой Texas Instruments. Данная библиотека поставляется в виде архива (sprc097.zip). Данный архив распакован в папку с28 (в директории со средой Code Composer Studio).

    Шаг 1. Создайте новый проект. Назовите его Test33.

    Шаг 2. Добавьте в проект исходный файл Test33.c. Это файл размещен в папке Solutions к данной лабораторной работе. Откройте данный файл. Исходная программа описывает режим «бегущей единицы» для восьми младших разрядов порта В. Для начальной инициализации процессора и настроек порта используются библиотечные функции (структуры), разработанные фирмой Texas Instruments. Попробуйте самостоятельно разобраться с программой. Если возникли затруднения – задайте вопрос преподавателю.

    Шаг 3. Подключите библиотеку функций языка С rts2800_ml.lib (этот файл располагается в папке …\CCStudio_v3.1\c2000 \cgtools\lib\).

    Шаг 4. Скопируйте в рабочую директорию проекта файл DSP281x_GlobalVariableDefs.c (располагается в директории C:\CCStudio_v3.1\c28\DSP281x_headers\source). Этот библиотечный файл служит для объявления глобальных переменных (имена встроенных устройств процессора). Подключите его в проект.

    Шаг 5. Скопируйте в рабочую директорию проекта два командных файла (линкер файла). Первый файл – DSP281x_Headers_nonBIOS.cmd располагается в директории C:\CCStudio_v3.1\c28\DSP281x_headers\cmd, и описывает распределение адресов периферийных устройств в области памяти данных. Второй файл – F2812_EzDSP_RAM_lnk.cmd располагается в директории C:\CCStudio_v3.1\c28\DSP281x_common\cmd и описывает общее распределение памяти программ. Добавьте оба файла в проект.

    Шаг 6. Теперь необходимо добавить в проект все библиотечные файлы описания регистров и структур периферийных устройств. Они располагаются в директории C:\CCStudio_v3.1\c28\DSP281x_headers\include. Простой вариант – можно скопировать эти файлы в рабочую директорию проекта. Другой вариант – с помощью команды настроек компилятора Project -> Build Options. В закладке Compiler выберите настройки Preprocessorи в окошке Include Search Path (-i) укажите директорию C:\CCStudio_v3.1\c28\DSP281x_headers\include.

    Шаг 7. Выполните компиляцию проекта. Если проект скомпилировался без ошибок – загрузите программу и проверьте ее работоспособность.

На этом наше занятие закончено. Для закрепления материала попробуйте самостоятельно изменить способ выдачи информации на порт В. Если Вы подключали внешние устройства к отладочному модулю – измените настройки управляющего регистра блока формирования тактовой частоты, т.е. увеличьте время на изменение состояния порта В.

        Литература:

  1. TMS320F2810, TMS320F2812 Digital Signal Processors. Data Manual (SPRS174I).
  2. TMS320C28x DSP. CPU and Instruction Set Reference Guide (SPRU430A).
  3. TMS320F28x DSP. System Control and Interrupts Reference Guide (SPRU078A).
  4. F2812 eZdsp Schematic Rev C.

Комментарии: