Система прерываний DSP семейства C28х. Система прерываний процессоров семейства С28х, а также таймеры ядра ЦПУ

Страницы работы

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П.О.СУХОГО

ФАКУЛЬТЕТ АВТОМАТИЗИРОВАННЫХ ИНФОРМАЦИОННЫХ СИСТЕМ

КАФЕДРА: «ПРОМЫШЛЕННАЯ ЭЛЕКТРОНИКА»

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №3

ПО ДИСЦИПЛИНЕ: «АЦОС»

НА ТЕМУ: «Система прерываний DSP семейства C28х»

                                                                       Выполнил студент гр.ПМ-51

                                                               Принял преподаватель:

  

г.Гомель 2012г

Лабораторная работа №3

Система прерываний DSP семейства C28х

Цель работы: изучить систему прерываний процессоров семейства С28х, а также таймеры ядра ЦПУ.  Научиться создавать программы, использующие прерывания.

Ход работы

1.  Создаем в нашем каталоге новый проект под именем Lab3.pjt.

2.  Открываем файл с программой формирования бегущих огней из лабораторной работы №2  lab2.с и сохраняем его под именем Lab3.с Затем добавляю Lab3.с в наш проект.

3.  Добавляю в наш проект необходимые библиотеки:

Из C:\tidcs\c28\dsp281x\v100\DSP281x_headers\source добавляем:

DSP281x_GlobalVariableDefs.c

Из C:\tidcs\c28\dsp281x\v100\DSP281x_common\cmd добавляем:

F2812_EzDSP_RAM_lnk.cmd

Из C:\tidcs\c28\dsp281x\v100\DSP281x_headers\cmd добавляем:

F2812_Headers_nonBIOS.cmd

Из C:\ti\c2000\cgtoolslib добавляем:

rts2800_ml.lib

4. Вносим изменение в программу:

В программе Lab3 необходимо объявить подпрограмму обработки прерываний от  CPU Timer0:

interrupt void cpu_timer0_isr(void);

Далее в основной программе сразу после “Gpio_select()”  добавляем:

InitPieCtrl();

Данная функция уже описана в файле DSP281x_PieCtrl.c”, добавленном в проект. Она позволяет очистить флаги и запретить все прерывания, что удобно при написании программ. Для корректной работы программы в проект необходимо добавить файл:

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source \ DSP281x_PieCtrl.c

Затем непосредственно после вызова функции “InitPieCtrl();” добавляем еще один вызов функции:

InitPieVectTable();

Данная функция инициализирует PIE-memory в начальное состояние. Функция использует предварительно заданную таблицу прерываний “PieVectTableInit()”, которая прописана в файле “DSP281x_PieVect.c” и копирует эту таблицу в глобальную переменную “PieVectTable”. “PieVectTable” связана с областью памяти процессора PIE area.  Для использования “InitPieVectTable” в проект необходимо добавить следующие файлы:

Из C:\tidcs\c28\dsp281x\v100\DSP281x_common\source добавляем:

DSP281x_PieVect.c и DSP281x_DefaultIsr.c

Файл “DSP281x_DefaultIsr.c” добавит в проект подпрограммы обработки прерываний. Все они имеют программную заглушку в виде “ESTOP0”, необходимую для предотвращения неправильной работы процессора в случае сбоя.

5. В работе необходимо переопределить имя подпрограммы обработки прерываний от таймера CPU Timer0 на нашу подпрограмму. Сделать это можно модификацией кода непосредственно в файле “DSP281x_DefaultIsr.c”, тем самым модифицировав исходную программу. Ни в коем случае не следует модифицировать исходные файлы! Вместо этого в основную программу сразу после “InitPieVectTable();“ добавляем следующие команды :

EALLOW;

PieVectTable.TINT0 = &cpu_timer0_isr;

EDIS;

EALLOW и EDIS – два макроса, используемые для разрешения/запрещения доступа к системным регистрам процессора. “cpu_timer0_isr” – имя нашей  подпрограммы обработки прерываний, описанной в программе ранее. В программе после  “InitPieVectTable();“ инициализиуем и останавливаем CPU Timer0. Для работы подпрограммы необходимо в проект добавить файл:

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source/ DSP281x_CpuTimers.c, а в основную программу – команду InitCpuTimers();

7. Необходимо настроить CPU Timer0 для генерации интервалов в 50 мс при тактовой частоте 150 МГц. Для этого после команды «InitCpuTimers();» добавляем:

ConfigCpuTimer(&CpuTimer0, 150, 50000);

8. Перед запуском программы необходимо настроить прерывания от таймера 0. Необходимо настроить три уровня прерывания: первый уровень - PIE unit , группа PIEIER1 (т.к. прерывания от CPU Timer0 относятся именно к данной группе ):

PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

Второй уровень – разрешение прерываний линии 1 ядра ЦПУ.  Для этого необходимо настроить регистр IER (см. рис. 3.4). Последний шаг – разрешить глобальные прерывания. Следует разрешить/запретить глобальные прерывания, добавив в программу макросы:

IER = 1;

EINT;

ERTM;

9. Затем необходимо добавить команду запуска CPU Timer0:

CpuTimer0Regs.TCR.bit.TSS = 0;

10. За основной программой необходимо добавить подпрограмму обработки прерываний от CPU Timer0 “cpu_timer0_isr”. Подпрограмму и обращение к ней мы уже прописали в программе. Теперь необходимо написать саму подпрограмму. Подпрограмма должна выполнять следующие действия:

- инкрементировать глобальную переменную “CpuTimer0.InterruptCount”, по которой опеределяется число тактов с момента запуска;

- обработать прерывание в последней строке перед выходом , что необходимо для разрешения следующего прерывания. Для этого добавляем команду:

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

11. После настройки таймера и прерываний корректируем основную программу. Для этого удаляем либо комментируем  вызов подпрограммы  “delay_loop(1000000);” Затем в бесконечном цикле “while(1)“ после конструкции  “if-else” необходимо сделать ожидание. Необходимо сформировать задержку в 150 мс, с учетом того, что переменная инкрементируется каждые 50 мс.

Похожие материалы

Информация о работе