МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П.О.СУХОГО
ФАКУЛЬТЕТ АВТОМАТИЗИРОВАННЫХ ИНФОРМАЦИОННЫХ СИСТЕМ
КАФЕДРА: «ПРОМЫШЛЕННАЯ ЭЛЕКТРОНИКА»
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №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 мс.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.