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

Тема: Знакомство с портами ввода/вывода процессора 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.

Номер контакта

Назначение контакта

Номер контакта

Назначение контакта

VCC

21

NC

2

VCC 

22

GPIOE0

GPIOF4

23 

GPIOF0

GPIOF5

24 

GPIOF1

GPIOE0

25 

GPIOF2

GPIOA8

26 

GPIOF3

GPIOA9

27 

GPIOF6

GPIOA10

28 

GPIOF7

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 

GPIOB14 

13 

GPIOB6 

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.