Система прерываний 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.
Рис. 1.1. Плата эмулятора eZDSP и плата расширения Zwickau Adapterboard
На рис. 1.1 представлена плата эмулятора eZDSP320F2812 c платой расширения. На плате эмулятора размещен сигнальный процессор TMS320F2812 и схема, обеспечивающая его работу – стабилизатор напряжения (+3.3В для периферии и +1.9В для ядра), схема JTAG-эмулятора, внешнее ОЗУ. Плата эмулятора соединена с платой расширения Zwickau Adapterboard, расположенной под ней
(рис. 1.1). На плате расширения располагаются светодиоды, переключатели, кнопки, потенциометры, ЦАП, микросхема FLASH-памяти, датчик температуры, микросхемы интерфейсов RS-232 и CAN, звуковой пьезоэлектрический преобразователь. Связь эмулятора и ПЭВМ осуществляется через LPT-порт.
Рис. 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) или иконку . В случае удачной компиляции в статусной строке будет выдано сообщение об отсутствии ошибок:
«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) или . Открывается окно, в котором указывается наличие или отсутствие ошибок, предупреждений и замечаний. Результатом компоновки будет файл в 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) или с помощью иконки . При этом в строке статуса внизу рабочей области индицируется зелёная лампочка и появляется надпись Running. Остановить выполнение программы можно через вкладку меню Debug → Halt (горячие клавиши Shift+F5) или . Пошаговая отладка осуществляется с помощью Debug → Step Into или горячей клавиши F11. Нажимая функциональную клавишу F11, понаблюдайте за ходом выполнения программы.
8. Просмотр переменных.
Для просмотра переменных используется вкладка меню View → Watch Window или . В колонке Name задается имя переменной, в нашем случае там могут быть записаны переменные i и k (для добавления переменной можно, выделив ее, воспользоваться в контекстном меню опцией Add to Watch Window). В колонке Value отображаются сами переменные, причем после каждой их модификации вручную или исполняемой программой они выделяются красным цветом в течение одного такта отладки. В колонке Radix задается формат представления чисел (десятичный, двоичный, шестнадцатеричный и пр.).
9. Использование точки останова (Breakpoint) и контрольной точки (Probe Point).
Для удобства отладки программ в Code Composer Studio используются Breakpoint и Probe Point. Для установки Breakpoint устанавливаем курсор на строку, на которой должно остановиться выполнение программы, щелкаем на , строка выделяется красной точкой. Запускаем программу (F5) и видим, что её выполнение остановилось на выделенной строке (желтая стрелка). Чтобы снять Breakpoint, необходимо щелкнуть на иконку . Для установки Probe Point устанавливаем курсор на строку, на которой должно остановиться выполнение программы, щелкаем на , строка выделяется голубым ромбиком. Запускаем программу (F5). Чтобы снять Probe Point, необходимо щелкнуть на иконку . Разница отладки в этих режимах заключается в следующем: при достижении точки 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) или . Проследите за выполнением программы, выбрав данный режим.
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) означает «линии ввода/вывода общего назначения».
Рис. 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, не будут распознаваться ядром процессора.
Рис. 2.2. Тактовый модуль и регистр PLLCR
Перед началом работы необходимо настроить модуль тактирования. Как и многие современные процессоры, DSP семейства С28х используют внешний резонатор или генератор с частотой более низкой, чем максимальная тактовая. Это позволяет уменьшить влияние электромагнитных помех, понизить требования к разводке печатной платы и повысить надежность работы схемы. Частота тактового генератора, расположенного на плате эмулятора, составляет 30 МГц. Максимальная тактовая частота процессора 150 МГц получается путем умножения внешней частоты на 10/2 (рис. 2.2). Коэффициент деления задается программно в регистре PLLCR.
Помимо формирователя тактовой частоты ядра, тактовый модуль содержит низкоскоростной LOSPCP и высокоскоростной HISPCP предделители (рис. 2.3), которые используются для тактирования периферийных устройств.
Рис. 2.3 Регистры HISPCP и LOSPCP
Для оценки потребления микроконтроллеров, DSP, и их модулей используется упрощенная формула:
,
где u – напряжение питания модуля, f – тактовая частота; k – коэффициент.
Таким образом, снижая тактовую частоту, можно снизить энергопотребление и определенного модуля, и всего DSP в целом. Коэффициенты деления задаются программно в регистрах LOSPCP и HISPCP.
В DSP семейства С28х реализована возможность не только изменять, но и полностью запрещать и разрешать тактирование различных периферийных модулей при помощи регистра PCLKCR (рис. 2.4).
Сторожевой таймер (Watchdog timer или WDT, рис. 2.5) предназначен для предотвращения «зависания» ЦПУ и реализован на основе суммирующего счетчика WDCNTR, который тактируется через счетчик-делитель от внешнего генератора и при переполнении вырабатывает сигнал прерывания WDINT либо сброса ЦПУ WDRST (задается программно). WDT работает независимо от ЦПУ и может сбрасываться программно для предотвращения сброса процессора.
Рис. 2.4. Регистр PCLKCR
Сторожевой таймер защищен ключом «101», и, в случае записи в биты WDCHK 2–0 регистра WDCR (рис. 2.6) любой иной кодовой комбинации, в следующем машинном цикле происходит генерация выходного сигнала (такого же, как и при переполнении). Для предотвращения сброса ЦПУ необходимо периодически программно сбрасывать счетчик WDCNTR при помощи записи последовательности кодов «0x55 + 0xAA» в специальный регистр WDKEY.
Рис. 2.5 Функциональная схема сторожевого таймера
Рис. 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», установить бит программно нельзя.
Рис. 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 – разомкнут).
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 имеют идентичные регистры, расположенные по разным адресам.
Рис. 4.1. Менеджер Событий
Каждый Менеджер Событий управляется своей собственной логикой. Она может запрашивать прерывания. Менеджер Событий позволяет запускать встроенный либо внешний аналого-цифровой преобразователь. Для запуска внешнего АЦП на выводах EVASOC или EVBSOC (которые мультиплексируются с сигналами и ), вырабатывается строб начала преобразования (SOC).
На рис. 4.1 представлена функциональная схема модуля Менеджера Событий (EVA).
Рассмотрим блоки EVM подробнее.
Таймеры общего назначения
В каждом модуле EVM имеется по два GP (General Purpose) таймера общего назначения. В отличие от таймеров CPU, которые имеют разрядность 32-бита, таймеры Менеджера Событий являются независимыми 16-разрядными устройствами, c расширенной системой ввода/вывода. Они могут работать независимо друг от друга или быть синхронизированными.
Рис. 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). После этого счетчик сбрасывается в ноль и начинает считать сначала. При этом вырабатывается флаг прерывания, который остается установленным в течение одного такта. Если флаг не был маскирован, то вырабатывается запрос прерывания от периферийного устройства.
Рис. 4.3. Режим непрерывного счета вверх GP таймера
Продолжительность периода равна (TxPR)+1, за исключением первого периода, который может быть произвольным, так как начальное значение в счетчике может быть любым от 0000h до FFFFh.
Если исходное значение больше, чем значение в регистре периода, то таймер досчитает до FFFFh, сбросится в ноль и продолжит работать так, как если бы исходное значение было равно нулю. При достижении счетчиком значения, равного значению в регистре периода, устанавливается флаг прерывания по периоду, происходит сброс в ноль и устанавливается флаг прерывания по нулю.
Если исходное значение в счетчике находится между нулем и значением в регистре периода, то таймер сначала досчитает до значения в регистре периода, а затем будет работать так, как был запрограммирован.
3) Управляемый режим счета вверх/вниз. В этом режиме направление счета зависит от состояния входа TDIRA/B: вверх, если сигнал на TDIRA/B высокого уровня; вниз – низкого.
Рис. 4.4. Режим управляемого счета вверх/вниз GP таймера
4) Непрерывный режим счета вверх/вниз. В отличие от предыдущего режима, направление счета изменяется при достижении нуля или значения в регистре периода. Продолжительность периода в этом режиме равна 2∙(TxPR).
Рис. 4.5. Непрерывный режим счета вверх/вниз
&nb