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

Имени П.О.Сухого»

Кафедра «Промышленная электроника»

Баранов А.Г., Крышнев Ю.В.

ЦИФРОВЫЕ СИГНАЛЬНЫЕ ПРОЦЕССОРЫ.

ЧАСТЬ 1.

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

по курсу «Цифровые сигнальные процессоры»
для студентов дневной и заочной форм обучения
специальности 1-36 04 02. Часть 1

Гомель 2008

УДК621.382.049.77

ББК 32.859

Авторы-составители: Баранов А.Г., Крышнев Ю.В.

Цифровые сигнальные процессоры. Часть 1. Лабораторный практикум по курсу «Цифровые сигнальные процессоры» для студентов дневной и заочной форм обучения специальности 1-36 04 02. Часть 1– Гомель: УО «ГГТУ им. П.О. Сухого», 2008. – 51 c.

Рецензент:

В лабораторном практикуме содержатся необходимые сведения для освоения теоретического материала и практического закрепления знаний по курсу «Цифровые сигнальные процессоры» (профиль – радиоэлектроника). Издание охватывает 5 лабораторных работ на темы, касающиеся изучения архитектуры, периферии и программирования цифровых сигнальных процессоров TMS320F2812.

Для студентов дневной и заочной формы обучения специальности 1-36 04 02 «Промышленная электроника» УО «ГГТУ им. П.О. Сухого».

ã Гомельский государственный технический университет им. П.О. Сухого

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

Аппаратные и программные средства отладки eZDSP F2812 и
Code Composer Studio

Цель работы: ознакомиться с аппаратной и программной частью лабораторного оборудования, научиться создавать и отлаживать простейшие программы для цифрового сигнального процессора TMS320F2812.

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

Аппаратная часть стенда состоит из платы эмулятора и платы расширения, а программная – из среды разработки Code Composer Studio.

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

Рис. 1.1. Плата эмулятора eZDSP и плата расширения Zwickau Adapterboard

На рис. 1.1 представлена плата эмулятора eZDSP320F2812 c платой расширения. На плате эмулятора размещен сигнальный процессор TMS320F2812 и схема, обеспечивающая его работу – стабилизатор напряжения (+3.3В для периферии и +1.9В для ядра), схема JTAG-эмулятора, внешнее ОЗУ. Плата эмулятора соединена с платой расширения Zwickau Adapterboard, расположенной под ней
(рис. 1.1). На плате расширения располагаются светодиоды, переключатели, кнопки, потенциометры, ЦАП, микросхема FLASH-памяти, датчик температуры, микросхемы интерфейсов RS-232 и CAN, звуковой пьезоэлектрический преобразователь. Связь эмулятора и ПЭВМ осуществляется через LPT-порт.

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

Рис. 1.2. Вид рабочего окна Code Composer Studio

Code Composer Studio (CCS) – интегрированная среда разработки для цифровых сигнальных процессоров фирмы Texas Instruments. После загрузки программы открывается окно, разделенное на две вертикальные части. В левой части (узкой) отображается окно проекта, в правой (широкой) – рабочая область (рис. 1.2). Любой проект (Project), кроме файла с программой на языке Си или Ассемблер, содержит командные файлы, библиотеки, линкеры. Данные файлы необходимы для преобразования исходного текста программ в машинный код, который затем загружается в процессор. Файл управления линкером сопоставляет логические сектора (область данных, программ) и физическую память сигнального процессора. Процедура линкирования объединяет один и более объектные файлы (*.obj) в выходной файл (*.out), который содержит машинные коды, адреса и отладочную информацию. Проект может содержать более одного файла программ и подпрограмм, причем допускается написание программ и их частей на различных языках (Си, Си++, Макроассемблер). Все это позволяет максимально эффективно использовать имеющиеся наработки в последующих проектах. Несколько проектов могут объединяться в Workspace, причем компилироваться и отлаживаться будет только один – текущий проект. При выполнении лабораторных работ не рекомендуется открывать сразу несколько проектов.

Ход работы

1. Создание нового проекта.

Через вкладку меню Project → New создаем новый проект. В поле Project Name записываем название проекта «Lab1». В поле Location указывается путь, по которому будет находиться проект – E:\DspUser\Lab1. В поле Project Type выбираем Executable (.out), а в поле Target – TMS320C28XX. Проверяем подключение эмулятора через вкладку меню Debug → Connect.

2. Создание файла программы.

unsigned int k;

void main (void)

{

unsigned int i;

while(1)

{

for (i=0;i<100;i++)

k=i*i;

}

}

Рис. 1.3. Тестовая программа

Через вкладку меню File → New → Sourse File создаем файл. Содержимое файла отображается в рабочей области программы. Далее заносим в него тестовую программу, представленную на рис. 1.3. Затем необходимо сохранить в папке для проекта, выбранной в п. 1, написанную программу под именем «lab1.c» через вкладку меню File → Save as: «lab1.c».

3. Добавление файлов в проект.

Сохраненный файл еще не является частью проекта и при компиляции проекта не будет учтен. Его необходимо добавить в проект через вкладки меню Project → Add files to Project, где указывается имя файла: «lab1.c». После этого имя данного файла появится в разделе «Source» окна проекта. Кроме файла программы, через вкладку меню Project → Add files to Project необходимо добавить в проект файл управления линкером:

C:\tidcs\c28\dsp281x\v100\DSP281x_common\cmd\F2812_EzDSP_RAM_lnk.cmd

4. Компиляция программы.

Компилируя программу, мы проверяем её на наличие синтаксических ошибок. Для этого выбираем вкладку меню Project → Compile File (горячие клавиши Ctrl+F7) или иконку Система прерываний DSP семейства C28х - student2.ru . В случае удачной компиляции в статусной строке будет выдано сообщение об отсутствии ошибок:

«Compile Complete,

0 Errors, 0 Warnings, 0 Remarks.»

5. Добавление библиотек и создание стека.

Подключаем Си-библиотеки:

Project → Build Options → Linker → Library Search Path: C:\CCStudio_v3.1\C2000\cgtools\lib

Project → Build Options → Linker Include Libraries: rts2800_ml.lib

Задаем стек глубиной 0х400:

Project → Build Options → Linker → Stack Size: 0x400 (здесь и далее в формате записи числовых значений префикс «0x» означает hex-формат)

6. Компоновка и загрузка выходного файла в отладочный модуль eZDSP.

Для компоновки выбираем Project → Build (горячая клавиша F7) или Система прерываний DSP семейства C28х - student2.ru . Открывается окно, в котором указывается наличие или отсутствие ошибок, предупреждений и замечаний. Результатом компоновки будет файл в hex-коде, содержащий коды программ и необходимую отладочную информацию. Далее необходимо загрузить созданный файл в эмулятор-отладчик через вкладку меню: File →Load Program→Debug\lab1.out. После этого тестовая программа находится в памяти DSP, расположенного на плате эмулятора. Функцию загрузки готового out-файла в память DSP можно настроить автоматически, включив опцию Load Program After Build через меню Option→Customize→Program/Project Load.

Замечание: Имя выходного файла генерируется по имени проекта, а не имени файла программы. При модификации программы необходимо каждый раз компоновать и загружать программу в память процессора.

7. Сброс сигнального процессора и запуск программы на выполнение.

Для правильного выполнения программы необходимо произвести сброс процессора и его перезапуск. Для этого последовательно выполняются команды Debug → Reset CPU (горячие клавиши Ctrl+R) и Debug → Restart (горячие клавиши Ctrl+Shift+F5) .

Затем с помощью команды Debug → Go Main (горячая клавиша Ctrl+M) устанавливаем программный счетчик на точку «void main (void)» основной программы. Команда Go Main позволяет выполнить начальную установку процессора, генерируемую компилятором языка Си. Положение программного счетчика отображается желтой стрелкой у левого края рабочей области. Запуск программы на выполнение может осуществляться как в пошаговом, так и а автоматическом режимах. Запуск программы в автоматическом режиме осуществляется через вкладку меню Debug → Run (горячая клавиша F5) или с помощью иконки Система прерываний DSP семейства C28х - student2.ru . При этом в строке статуса внизу рабочей области индицируется зелёная лампочка и появляется надпись Running. Остановить выполнение программы можно через вкладку меню Debug → Halt (горячие клавиши Shift+F5) или Система прерываний DSP семейства C28х - student2.ru . Пошаговая отладка осуществляется с помощью Debug → Step Into или горячей клавиши F11. Нажимая функциональную клавишу F11, понаблюдайте за ходом выполнения программы.

8. Просмотр переменных.

Для просмотра переменных используется вкладка меню View → Watch Window или Система прерываний DSP семейства C28х - student2.ru . В колонке Name задается имя переменной, в нашем случае там могут быть записаны переменные i и k (для добавления переменной можно, выделив ее, воспользоваться в контекстном меню опцией Add to Watch Window). В колонке Value отображаются сами переменные, причем после каждой их модификации вручную или исполняемой программой они выделяются красным цветом в течение одного такта отладки. В колонке Radix задается формат представления чисел (десятичный, двоичный, шестнадцатеричный и пр.).

9. Использование точки останова (Breakpoint) и контрольной точки (Probe Point).

Для удобства отладки программ в Code Composer Studio используются Breakpoint и Probe Point. Для установки Breakpoint устанавливаем курсор на строку, на которой должно остановиться выполнение программы, щелкаем на Система прерываний DSP семейства C28х - student2.ru , строка выделяется красной точкой. Запускаем программу (F5) и видим, что её выполнение остановилось на выделенной строке (желтая стрелка). Чтобы снять Breakpoint, необходимо щелкнуть на иконку Система прерываний DSP семейства C28х - student2.ru . Для установки Probe Point устанавливаем курсор на строку, на которой должно остановиться выполнение программы, щелкаем на Система прерываний DSP семейства C28х - student2.ru , строка выделяется голубым ромбиком. Запускаем программу (F5). Чтобы снять Probe Point, необходимо щелкнуть на иконку Система прерываний DSP семейства C28х - student2.ru . Разница отладки в этих режимах заключается в следующем: при достижении точки Breakpoint в автоматическом режиме (Run) обновление переменных в окне Watch происходит дискретно с остановкой программы, а при достижении точки Probe Point – непрерывно (без остановки программы). Для работы в последнем режиме необходимо после установки связать Probe Point с Watch Window: выбрать Debug → Probe Point, в поле «Connect To» выбрать «Watch Window», затем напротив поля «Location» выбрать «Replace» и подтвердить выбор («Ok»).

10. Режим Animate.

Режим Animate используется для отслеживания содержимого регистров и переменных. Для его запуска необходимо нажать Debug → Animate (горячие клавиши Shift+F5) или Система прерываний DSP семейства C28х - student2.ru . Проследите за выполнением программы, выбрав данный режим.

11. Просмотр содержимого регистров.

Содержимое регистров процессора можно отследить, выбрав вкладку меню View → Registers → CPU Register и View → Registers → Status Register. Для удобства работы щелкаем правой кнопкой мышки внутри открывшихся окон. Чтобы изменить значение регистра, необходимо дважды щелкнуть по его названию и, в открывшемся окне «Edit Register» ввести нужное значение.

Задание для самостоятельной работы

1. Проследить выполнение программы, содержимого окна Watch (переменные i и k) в режимах Run и Animate при наличии и отсутствии точки останова Breakpoint, установленной на строку «k=i*i;». Объяснить полученные результаты.

2. Проследить выполнение программы, содержимого окна Watch в режимах Run и Animate при наличии и отсутствии контрольной точки Probe point. Объяснить полученные результаты.

3. Открыв окна CPU Register и Status Register, проследить выполнение программы в режиме Animate. Объяснить полученные результаты.

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

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

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

1. Структура платы эмулятора eZDSP320F2812 и платы расширения Zwickau Adapterboard.

2. Среда разработки Code Composer Studio. Создание, компиляция, компоновка и загрузка проекта.

3. Среда разработки Code Composer Studio. Режимы запуска программ, просмотр переменных, использование точки останова (Breakpoint) и контрольной точки (Probe Point).

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

Изучение структуры цифровых портов ввода/ вывода
и системы тактирования DSP

Цель работы: изучить структуру цифровых портов ввода-вывода и модуля тактирования DSP, научиться выполнять настройку данных модулей, вводить и выводить сигналы в цифровой форме.

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

Все программно доступные цифровые выводы сгруппированы в порты (GPIO – A, B, D, E, F, G), GPIO (general purpose input/output) означает «линии ввода/вывода общего назначения».

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

Рис. 2.1. Основные и альтернативные функции портов ввода-вывода F2812

В процессоре F2812, помимо центрального процессорного устройства (ЦПУ) имеется внутренняя периферия (АЦП, таймеры и пр.), которая также располагается на кристалле. Периферия имеет выводы, использующиеся для ввода/вывода сигналов. Чтобы не загромождать DSP дополнительными выводами, используют мультиплексирование: на одном выводе могут быть реализованы две и более различные функции, которые выбираются программным путем. На рис. 2.1. приведены основные и альтернативные функции портов.

Все 6 портов управляются своими мультиплексирующими регистрами (GPxMUX, здесь и далее в именах регистров, относящихся к портам, x – имя порта). Если бит сброшен в 0, то данный вывод работает как обычная линия порта; установкой бита в 1 выбирается альтернативная функция, т.е. линия порта (pin) подключается с соответствующему периферийному устройству.

Каждый вывод порта может работать на ввод или вывод. Направление передачи данных задается битами в регистрах GPxDIR: 0 – линия работает на ввод, 1– на вывод данных. При работе портов A, B, D и E на ввод для увеличения помехозащищенности можно настроить функцию задержки ввода (Input Qualification feature) установкой битов 7-0 в соответствующем регистре GPxQUAL. После этого импульсы на линиях соответствующих портов, имеющие максимальную длительность от 2 (GPxQUAL=0x01) до 510 (GPxQUAL=00FFH) периодов частоты тактирования ядра SYSCLKOUT, не будут распознаваться ядром процессора.

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

Рис. 2.2. Тактовый модуль и регистр PLLCR

Перед началом работы необходимо настроить модуль тактирования. Как и многие современные процессоры, DSP семейства С28х используют внешний резонатор или генератор с частотой более низкой, чем максимальная тактовая. Это позволяет уменьшить влияние электромагнитных помех, понизить требования к разводке печатной платы и повысить надежность работы схемы. Частота тактового генератора, расположенного на плате эмулятора, составляет 30 МГц. Максимальная тактовая частота процессора 150 МГц получается путем умножения внешней частоты на 10/2 (рис. 2.2). Коэффициент деления задается программно в регистре PLLCR.

Помимо формирователя тактовой частоты ядра, тактовый модуль содержит низкоскоростной LOSPCP и высокоскоростной HISPCP предделители (рис. 2.3), которые используются для тактирования периферийных устройств.

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

Рис. 2.3 Регистры HISPCP и LOSPCP

Для оценки потребления микроконтроллеров, DSP, и их модулей используется упрощенная формула:

Система прерываний DSP семейства C28х - student2.ru ,

где u – напряжение питания модуля, f – тактовая частота; k – коэффициент.

Таким образом, снижая тактовую частоту, можно снизить энергопотребление и определенного модуля, и всего DSP в целом. Коэффициенты деления задаются программно в регистрах LOSPCP и HISPCP.

В DSP семейства С28х реализована возможность не только изменять, но и полностью запрещать и разрешать тактирование различных периферийных модулей при помощи регистра PCLKCR (рис. 2.4).

Сторожевой таймер (Watchdog timer или WDT, рис. 2.5) предназначен для предотвращения «зависания» ЦПУ и реализован на основе суммирующего счетчика WDCNTR, который тактируется через счетчик-делитель от внешнего генератора и при переполнении вырабатывает сигнал прерывания WDINT либо сброса ЦПУ WDRST (задается программно). WDT работает независимо от ЦПУ и может сбрасываться программно для предотвращения сброса процессора.

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

Рис. 2.4. Регистр PCLKCR

Сторожевой таймер защищен ключом «101», и, в случае записи в биты WDCHK 2–0 регистра WDCR (рис. 2.6) любой иной кодовой комбинации, в следующем машинном цикле происходит генерация выходного сигнала (такого же, как и при переполнении). Для предотвращения сброса ЦПУ необходимо периодически программно сбрасывать счетчик WDCNTR при помощи записи последовательности кодов «0x55 + 0xAA» в специальный регистр WDKEY.

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

Рис. 2.5 Функциональная схема сторожевого таймера

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

Рис. 2.6. Регистр управления сторожевого таймера WDCR

Бит WDFLAG используется для того, чтобы указать источник сброса: обычный сброс (WDFLAG=0) или сброс по сторожевому таймеру
(WDFLAG=1). Биты WDPS 2–0 позволяют выбрать необходимый коэффициент деления частоты для работы сторожевого таймера. Бит WDDIS служит для запрета работы (блокировки) WDT.

Регистр управления и состояния (System Control and Status Register – SCSR, рис. 2.7) управляет сбросом сторожевого таймера (WDENINT=0 – сброс разрешен) и системой прерывания сторожевого таймера (WDENINT=1 – прерывание разрешено).

Если бит WDOVERRIDE установлен в 1, то пользователь может изменять состояние сторожевого таймера, т.е. запрещать или разрешать его работу (с помощью бита WDDIS в регистре управления WDCR). Пользователь может только сбросить этот бит, записав в него «1», установить бит программно нельзя.

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

Рис. 2.7. Формат регистра управления и состояния SCSR

Бит WDINTS отражает текущее состояние сигнала WDINT. Бит WDENINT – разрешение сброса/прерывания от WDT. Если WDENINT=0 – разрешен сигнал сброса WDRST, если WDENINT=1 – разрешен сигнал прерывания WDINT.

Ход работы

Часть I

В части I лабораторной работы необходимо разработать программу «бегущие огни», задавая направление движения: сначала – от края к краю (см. рис. 2.8а), а потом, зажигая по два светодиода, – от периферии к центру (см. рис. 2.8б). Светодиоды подключены к линиям порта GPIOB7 – GPIOB0 (1 – горит, 0 – погашен), а линии порта GPIOB15 – GPIOB8 соединены с ключами (1 – ключ замкнут, 0 – разомкнут).

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

Система прерываний DSP семейства C28х - student2.ru 1. Создание нового проекта.

В Code Composer Studio создаем новый проект Lab2.pjt. В поле Project Name записываем название проекта «Lab2». В поле Location указывается путь, по которому будет находиться проект – E:\DspUser\Lab2.

1.1. Для упрощения работы файл под именем «_lab2_.c» с заготовкой текста программы имеется на диске в папке «E:\DspUser\Templates». Копируем данный файл в папку проекта E:\DspUser\Lab2 и переименовываем в «Lab2.c». Добавляем в проект и открываем в окне редактора данный файл.

1.2. Добавляем управляющий файл линкера, библиотеки (рекомендуется для исключения ошибок пути к файлам, указанные ниже, копировать в диалоговое окно «Add files to Project»):

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\DSP281x_Headers_nonBIOS.cmd

C:\CCStudio_v3.1\C2000\cgtools\lib\rts2800_ml.lib

2. Настройка параметров проекта.

2.1. Включаем в проект заголовочные файлы, для этого выбираем Project → Build Options,в закладке Compiler выбираем Preprocessor и в поле Include Search Path (-i) вводим:

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

2.2. Добавление библиотек и создание стека.

Подключаем Си-библиотеки:

Project → Build Options → Linker → Library Search Path: С:\CCStudio_v3.1\C2000\cgtools\lib

Project → Build Options → Linker Include Libraries: rts2800_ml.lib

Задаем стек глубиной 0х400:

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

3. Инициализация системы.

Открываем файл Lab2.c и переходим к подпрограмме «InitSystem()».

3.1. Запрещаем работу сторожевого таймера и сбрасываем бит флага WD (присваиваем необходимое значение регистру WDCR).

3.2. Программируем регистр SCSR на сброс ЦПУ при переполнении Watchdog-таймера (бит WDENINT).

3.3. В регистр PLLCR заносим код, необходимый для преобразования частоты кварцевого резонатора 30 МГц во внутреннюю частоту SYSCLKOUT работы процессора 150 МГц (см. рис. 2.2).

3.4. Заносим в высокоскоростной предделитель (HISPCP) коэффициент деления 2, а в низкоскоростной (LOSPCP) – 4 (см. рис. 2.3).

3.5. Запрещаем работу всех периферийных устройств (PCLKCR).

4. Настройка портов.

Переходим к подпрограмме «Gpio_select()».

4.1. Настраиваем все выводы на работу в качестве портов (GPxMUX).

4.2. Настраиваем все линии портов A, D, E, F, G на ввод (GPxDIR).

4.3 Настраиваем линии порта GPIOB15 – GPIOB8 на ввод, а GPIOB7 – GPIOB0 на вывод.

4.4. Сбрасываем биты регистров GPxQUAL портов A, B, D, E в ноль.

5. Компоновка и загрузка выходного файла в отладочный модуль ЦСП.

5.1. Компонуем проект: Project → Build. При наличии ошибок, исправляем их.

5.2 Загружаем выходной файл: File → Load Program → Debug\ lab2.out.

6 Тестирование программы.

6.1. Сбрасываем ЦСП: Debug → Reset CPU, Debug → Restart.

6.2. Устанавливаем программный счетчик на точку «void main (void)» основной программы. Debug → Go main.

6.3. Запускаем программу: Debug → Run. Проверяем правильность работы, наблюдая за светодиодами. Также можно отслеживать правильность выполнения программы, запуская ее в режиме «Animate» и просматривая в отдельном окне, как изменяется содержимое выводов порта GPIOB.

7. Работа со сторожевым таймером.

7.1. В подпрограмме «InitSystem()» разрешаем работу сторожевого таймера.

7.2. Компонуем проект и тестируем программу.

7.3. В подпрограмме «delay_loop()» записываем:SysCtrlRegs.WDKEY = 0x55, SysCtrlRegs.WDKEY = 0xAA и повторяем пункт 7.2.

8. Работа с двумя светодиодами.

8.1. Копируем содержимое файла «Lab2.c» в новый файл, который называем «Lab2a.c».

8.2. Преобразуем программу Lab2a.c так, чтобы одновременно зажигались два светодиода в направлении от периферии к центру.

8.3. Добавляем в проект «Lab2a.c» и удаляем «Lab2.c» (щелкаем правой клавишей мышки и выбираем Remove from project).

8.4. Компонуем проект и тестируем программу.

Часть II

В части II лабораторной работы необходимо положение ключей отражать на светодиодах (ключ замкнут – светодиод горит, разомкнут – погашен), а также положением ключей задавать длительность свечения светодиодов.

1. Отображение состояния ключей на светодиодах.

1.1 Копируем содержимое файла «Lab2а.c» в новый файл, который называем «Lab2b.c».

1.2 Преобразуем программу Lab2b.c. Состояние (двоичный код), установленный ключами, должен индицироваться на светодиодах. С учетом того, что для подключения и светодиодов, и ключей используется один и тот же порт (GPIOB), состояние ключей можно индицировать, введя в основную программу команду сдвига содержимого порта GPIOB на 8 бит:

GpioDataRegs.GPBDAT.all = GpioDataRegs.GPBDAT.all >> 8

Удаляем таблицу состояния светодиодов, а подпрограммы «InitSystem()» и «Gpio_select()» оставляем без изменений.

1.3 Добавляем в проект «Lab2b.c» и удаляем «Lab2a.c».

1.4 Компонуем проект и тестируем программу.

2. Формирование длительности свечения светодиодов в зависимости от состояния ключей.

2.1 Копируем содержимое файла «Lab2b.c» в новый файл, который называем «Lab2c.c».

2.2 Преобразуем программу Lab2c.c. Задаем длительность задержки при переключении светодиодов, равную (0,1*N+0,001) сек, где N – код, заданный переключателями на линиях B15–B8. Подпрограммы «InitSystem()» и «Gpio_select()» оставляем без изменений.

2.3 Добавляем в проект «Lab2c.c» и удаляем «Lab2b.c».

2.4 Компонуем проект и тестируем программу.

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

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

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

1. Структура портов ввода/вывода, режимы работы, регистры управления.

2. Вывод простейших управляющих сигналов через порты TMS320F2812.

3. Система тактирования TMS320F2812. Структура, особенности, назначение регистров высокоскоростного и низкоскоростного предделителей.

4. Watchdog timer: назначение, принцип действия, особенности.

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

Ход работы

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

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. Вносим изменение в программу:

В программе 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.PIEIER1.bit.INTx7 = 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

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

Структура Менеджера Событий

Менеджер Событий (EV) включает в себя таймеры общего назначения (GP), устройства сравнения/ШИМ, устройства захвата, схему квадратурного анализа (QEP).

В сигнальном процессоре TMS320F2812 имеется два Менеджера Событий (EVA и EVB), которые выполняют аналогичные функции. EVA и EVB имеют идентичные регистры, расположенные по разным адресам.

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

Рис. 4.1. Менеджер Событий

Каждый Менеджер Событий управляется своей собственной логикой. Она может запрашивать прерывания. Менеджер Событий позволяет запускать встроенный либо внешний аналого-цифровой преобразователь. Для запуска внешнего АЦП на выводах EVASOC или EVBSOC (которые мультиплексируются с сигналами Система прерываний DSP семейства C28х - student2.ru и Система прерываний DSP семейства C28х - student2.ru ), вырабатывается строб начала преобразования (SOC).

На рис. 4.1 представлена функциональная схема модуля Менеджера Событий (EVA).

Рассмотрим блоки EVM подробнее.

Таймеры общего назначения

В каждом модуле EVM имеется по два GP (General Purpose) таймера общего назначения. В отличие от таймеров CPU, которые имеют разрядность 32-бита, таймеры Менеджера Событий являются независимыми 16-разрядными устройствами, c расширенной системой ввода/вывода. Они могут работать независимо друг от друга или быть синхронизированными.

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

Рис. 4.2. Таймер общего назначения модуля EVM

Центральным блоком GP таймера является блок сравнения. Здесь происходит сравнение значения 16-битного счетчика (TxCNT) с двумя другими регистрами: регистром сравнения (TxCMPR) и регистром периода (TxPR). Если значения счетчика и регистра сравнения равны, то выходной формирователь устанавливает в «1» выходной сигнал (TxPWM). При достижении счетчиком значения регистра периода TxPWM сбрасывается.

Особенностью DSP TMS320F2812 является наличие буферов регистров TxCMPR и TxPR которые позволяют обновлять значения по заранее заданным событиям:

а) достижение GP таймером-счетчиком нуля;

б) достижение GP таймером-счетчиком значения, равного значению в регистре периода;

в) немедленная загрузка после записи в буфер.

Наличие буферов позволяет записывать новые значения в регистры в любой момент времени, не дожидаясь окончания цикла. Загрузка значения из буфера в регистр периода происходит только при достижении GP таймером-счетчиком нуля.

Источником тактирования счетчика может являться: внешний сигнал (TCLKIN), тактовые импульсы от схемы квадратурного анализа (QEP) или тактовый сигнал от высокоскоростного предделителя (HSPCLK).

В регистрах EVAIFRA, EVAIFRB, EVBIFRA, EVBIFRB имеются биты, отражающие флаги прерывания GP таймеров. Каждый из 4-х GP таймеров может вырабатывать прерывание на следующие события:

а) достижение GP таймером-счетчиком нуля 0000h (TxUFINT);

б) достижение максимального значения FFFFh (TxOFINT);

в) достижение заданного значения сравнения (TxCINT);

г) достижение значения, равного значению в регистре периода (TxPINT).

Каждый GP таймер может работать в одном из 4-х режимов.

1) СТОП/Хранение. В этом режиме GP таймер останавливается и удерживает текущее значение, при этом таймер-счетчик, выходы сравнения и значение предделителя остаются без изменения. Если же остановить таймер, просто запретив его работу, то счетчик будет сброшен и значение предделителя установится в х/1.

2) Непрерывный режим счета вверх. В этом режиме значение счетчика увеличивается до тех пор, пока не достигнет значения, равного значению в регистре периода (рис. 4.3). После этого счетчик сбрасывается в ноль и начинает считать сначала. При этом вырабатывается флаг прерывания, который остается установленным в течение одного такта. Если флаг не был маскирован, то вырабатывается запрос прерывания от периферийного устройства.

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

Рис. 4.3. Режим непрерывного счета вверх GP таймера

Продолжительность периода равна (TxPR)+1, за исключением первого периода, который может быть произвольным, так как начальное значение в счетчике может быть любым от 0000h до FFFFh.

Если исходное значение больше, чем значение в регистре периода, то таймер досчитает до FFFFh, сбросится в ноль и продолжит работать так, как если бы исходное значение было равно нулю. При достижении счетчиком значения, равного значению в регистре периода, устанавливается флаг прерывания по периоду, происходит сброс в ноль и устанавливается флаг прерывания по нулю.

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

3) Управляемый режим счета вверх/вниз. В этом режиме направление счета зависит от состояния входа TDIRA/B: вверх, если сигнал на TDIRA/B высокого уровня; вниз – низкого.

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

Рис. 4.4. Режим управляемого счета вверх/вниз GP таймера

4) Непрерывный режим счета вверх/вниз. В отличие от предыдущего режима, направление счета изменяется при достижении нуля или значения в регистре периода. Продолжительность периода в этом режиме равна 2∙(TxPR).

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

Рис. 4.5. Непрерывный режим счета вверх/вниз

&nb

Наши рекомендации