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



 

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

 

Теоретические сведения

 

Система прерываний ядра C28x содержит 16 линий прерывания. Две из них немаскируемые (RESET, NMI). Пользователь не может запретить данные прерывания.  Остальные 14 прерываний – маскируемые, т.е. пользователь может разрешить/запретить прерывания от них программно соответственно установкой /сбросом бит в регистре “IER”. Все 16 прерываний подключены к таблице векторов прерываний, содержащий 32-битные адреса для каждого прерывания. По этим адресам находятся подпрограммы обработки прерываний. Подача активного сигнала на вход сброса на вывод “/RS” вызовет его сброс и перезапуск программы с начального адреса. Сброс отличается от остальных прерываний, т.к. программа затем не возвращается в исходную точку, а регистры сбрасываются в начальное состояние. Сброс может происходить как от внешнего источника, так и от сторожевого таймера. Сброс внешних схем при сбросе ядра процессора по watchdog timer-у осуществляется через вывод “/RS”, который двунаправленный.

Следующей особенностью семейства C28x является возможность запуска программ как из внутренней памяти (микроконтроллерный режим), так и из внешней (микропроцессорный режим). Режим определяется состоянием вывода (XMP/MC). Соответственно, после сброса программа переходит либо к начальному адресу 0x3F FFC0 внутренней памяти, либо к тому же адресу внешней памяти, а режим запоминается с помощью флага ‘XMP/MC’ и может быть впоследствии обработан программно.

После сброса и режиме /MC запускается служебная программа Bootloader, которая анализирует ряд выводов DSP и исходя из конфигурации сигналов на них может выполнять следующие действия:

 

1. Передать управление FLASH – памяти по адресу 0x3F 7FF6;

2. Передать управление H0 SARAM – памяти по адресу 0x3F 8000;

3. Передать управление OTP – памяти по адресуs 0x3D 7800;

4. Загрузить программу из внешнего EEPROM во внутреннюю память через SPI порт;

5. Загрузить программу во внутреннюю память через SСI –А порт;

6. Загрузить программу во внутреннюю память через параллельный порт GPIOВ

 

В лабораторных работах программа загружается в H0 SARAM (ОЗУ). Следует отметить, что память программ и данных имеют единое адресное пространство, программа может выполняться как из ОЗУ, так и из FLASH или ПЗУ (ОТР).

 

Рис. 3.1. Модуль прерываний С28х.

 

DSP имеет большое количество источников прерываний - 96, но только 14 линий прерываний. Для возможности обслуживания всех прерываний применяется мультиплексирование. Т.к программный поиск конкретного прерывания в линии при обработке программно занимает длительное время, то применяется специальный модуль – Peripheral Interrupt Expansion (PIE), или расширитель прерываний периферии. На практике это означает, что каждому из 96 прерываний соответствует свой 32-битный адрес в векторе прерываний. Прерывания сгруппированы в 8 источников на линию. Для разрешения/запрещения каждого используются биты в регистрах ‘PIEIERx’. Таблица векторов прерываний приведена на рис. 3.3. Примеры векторов прерываний: ADCINT = INT1.6; T2PINT = INT3.1; SCITXINTA = INT9.2.

 

Рис.3.2. Регистры модуля прерываний С28х.

 

Рис. 3.3. Таблица векторов прерываний.

 

Рис. 3.4 Формат регистра IER

 

В ядре семейства С28х имеется 3 32-битных таймера. Схема таймера приведена на рис. 3.5. Работа таймера разрешается установкой бита TCR.4. Таймер имеет 16-битный предварительный делитель, или прескалер, (PSCH: PSC), который формирует сигнал вычитания из 32-битного счетчика (TIMH: TIM). По достижении счетчиком (TIMH: TIM) нуля формируется сигнал прерывания для ЦПУ. 16-битный регистр (TDDRH: TDDR) используется для перезагрузки прескалера таймера. Регистр (PRDH_PRD) содержит значение таймера, загружаемое при его опустошении. Таймер 1 и Таймер 2, как правило, используются для систем реального времени “DSP/BIOS”, в то время как Таймер 0 используется для пользовательских приложений. Прерывания таймера 0 происходит через PIE, а таймеров 1 и 2 – напрямую через соответствующие линии. Данные таймеры интегрированы в ЦПУ, не следует их путать с таймерами менеджеров событий (EVA and EVB). Необходимо отметить, что после сброса разрешается работа всех трех таймеров ЦПУ.

Рис. 3.5. Схема таймера ЦПУ.

 

Рис. 3.6. Регистры управления таймерами ЦПУ.

 

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

Таймер 0 ядра ЦПУ использует систему расширения прерываний (PIE). Таймеры 1 и 2 не используют PIE и применяются для приложений реального времени, использующих функцию “DSP/BIOS”. В работе будем использовать таймер 0 ядра ЦПУ.

 

Ход работы

 

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

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

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 \ c 2000\ cgtoolslib добавляем:

rts2800_ml.lib

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

В программе Lab4 необходимо объявить подпрограмму обработки прерываний от 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” – имя нашей подпрограммы обработки прерываний, описанной в программе ранее (проверьте, имена подпрограмм должны совпадать до буквы!).

 6. В программе после “InitPieVectTable();“ инициализиуем и останавливаем CPU Timer0. Для работы подпрограммы необходимо в проект добавить файл:

C:\tidcs\c28\dsp281x\v100\DSP281x_common\source / DSP281x_CpuTimers.c

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

ConfigCpuTimer(&CpuTimer0, 150, 50000);

 

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

PieCtrlRegs . PIEIER 1. bit . INTx 7 = 1;

 

 Второй уровень – разрешение прерываний линии 1 ядра ЦПУ. Для этого необходимо настроить регистр IER (см. рис. 4.4). Последний шаг – разрешить глобальные прерывания. Разрешить/запретить глобальные прерывания можно макросами 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 мс. Не забывайте сбрасывать переменную после цикла ожидания!

 

12. Теперь необходимо откомпилировать проект. Для этого необходимо выполнить следующее

 Включить в проект заголовочные файлы:

Project → Build Options, в закладке Compiler выбираем Preprocessor и в поле Include Search Path (-i) вводим:

C:\tidcs\C28\dsp281x\v100\DSP281x_headers\include;..\include

 Задаем глубину стека

Project → Build Options → Linker → Stack Size: 0x400

 

13. Откомпилируйте, загрузите в отладчик и запустите на выполнение вашу программу. Проверьте правильность выполнения программы.

14. Разрешите watchdog и добавьте обслуживание таймера в код программы в цикле ожидания.

15. Перенесите обслуживание watchdog в подпрограмму обработки прерываний таймера ЦПУ. Запустите на выполнение измененную программу.

 

Содержание отчета:

 

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

 

Контрольные вопросы:

 

1. Назначение и структура PIE процессора TMS320F2812.

2. Маскируемые и немаскируемые прерывания. Сброс микроконтроллерной системы.

3. Назначение и структура CPU-таймеров

4. Программирование систем реального времени на основе прерываний.

5. Программирование многозадачных систем на основе прерываний.

 


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


Дата добавления: 2019-07-15; просмотров: 225; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!