ЛР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=0×0000; //Инициализация управляющих регистров
*GPBMUX=0×0000;
*GPADIR=0×0000;
*GPBDIR=0xFFFF;
*GPAQUAL=0×0000;
*GPBQUAL=0×0000;
*PLLCR=0x000A;
*PCLKCR=0×0000;
asm (“S: EDIS”);
while (1)
{
mode = 0×0003&(*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 в рабочей директории проекта. Данная программа выполняет следующие действия :
-
инициализация управляющих регистров процессора:
- порты А и В настраиваются как порты ввода/вывода;
- порт А настраивается на прием сигналов, порт В настраивается на выдачу сигналов;
- блок формирования тактовой частоты настраивается на умножение внешней тактовой частоты на 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*)(0×7021);
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. Выполните компиляцию проекта. Если проект скомпилировался без ошибок – загрузите программу и проверьте ее работоспособность.
На этом наше занятие закончено. Для закрепления материала попробуйте самостоятельно изменить способ выдачи информации на порт В. Если Вы подключали внешние устройства к отладочному модулю – измените настройки управляющего регистра блока формирования тактовой частоты, т.е. увеличьте время на изменение состояния порта В.
Литература:
-
TMS320F2810, TMS320F2812 Digital Signal Processors. Data Manual (SPRS174I).
-
TMS320C28x DSP. CPU and Instruction Set Reference Guide (SPRU430A).
-
TMS320F28x DSP. System Control and Interrupts Reference Guide (SPRU078A).
-
F2812 eZdsp Schematic Rev C.