ЛР4(г) > Разработка программы обработки прерываний от таймера процессора TMS320F2812

Тема: Программа генерации бегущего 0/1 на порту процессора и выдача значений счетчика в порт. Использование библиотеки TI функций обращения к периферийным устройствам процессора

    Теперь, после знакомства с необходимыми нам теоретическими сведениями, мы приступим к выполнению практической работы. Наша задача – изменить программу, формирующую режим «бегущего нуля» или «бегущей единицы» на выходных контактах порта В процессора (мы ее рассматривали на предыдущем занятии) таким образом, чтобы кроме автоматической установки режима формирования выходного сигнала, происходила выдача значения счетчика прерываний в порт А процессора в подпрограмме обработки прерывания от таймера 0. Ядро процессора должно работать с внутренней тактовой частотой, равной 150 МГц. Период выдачи запросов на прерывание таймером 0 равен 1 секунде. Для создания программы мы воспользуемся готовой библиотекой файлов включения и функций обращения к периферийным устройствам на языке С, разработанной фирмой Texas Instruments. Эта библиотека доступна на сайте фирмы [6, 7].

Скачать Материалы к лабораторной работе по ЦСП ТМS320F2812 №4.

 

    Шаг 1. Создайте в рабочей директории новый проект. Назовите его Test4.

    Шаг 2. Создайте исходный файл проекта. Текст программы приводится ниже.

 

#include “DSP281x_Device.h”

void Gpio_select(void);

void InitSystem(void);

interrupt void timer_int(void); // Подпрограмма обработки прерывания

                    //от таймера

unsigned int mode;

 

void main(void)

{

    unsigned int i;

    mode=0;

   InitSystem();        // Установка внутренней тактовой частоты

   Gpio_select();        // Настройка портов ввода\вывода

    InitPieCtrl();        // Настройка управляющих регистров

             //контроллера прерываний( файл : DSP281x_PieCtrl.c)

    InitPieVectTable(); // Инициализация таблицы векторов

                //прерываний (файл : DSP281x_PieVect.c )

// Указание перехода на подпрограмму обработки прерывания от таймера

    EALLOW; // Разрешение записи в регистр

    PieVectTable.TINT0 = &timer_int;

    EDIS; // Запрет записи в регистр

      InitCpuTimers();

 // Настройка таймера0 на выдачу запроса на прерывание каждую 1с:

    // 150МГц внутренняя частота, 1000000 мкс – период выдачи

    // запроса на прерывание

ConfigCpuTimer(&CpuTimer0, 150, 1000000);

 // Разрешение прерывания TINT0 в контроллере прерываний:

// Группа 1, прерывание 7

    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

     // Разрешение прерывания INT1 для процессора

IER = 1;

     // Установка флагов разрешения прерываний в регистре статуса:

    EINT; // Установка флага INTM

    ERTM; // Установка флага DBGM

      // Запуск таймера

    CpuTimer0Regs.TCR.bit.TSS = 0;

        while (1)

    {

           //Выбор режима работы

        mode = 0x0003&mode;

        if (mode == 0) //Бегущий 0 справа налево

        {

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

            {        GpioDataRegs.GPBDAT.all =(~(1<<i));

            }

            mode++;

        }

           if (mode == 1) //Бегущая 1 справа налево

         {

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

            {        GpioDataRegs.GPBDAT.all =(1<<i);

            }

            mode++;

        }

          if (mode == 2) //Бегущая 1 слева направо

        {

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

            {        GpioDataRegs.GPBDAT.all =(1<<15-i);

            }

            mode++;

        }

           if (mode == 3) //Бегущий 0 слева направо

        {

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

            {        GpioDataRegs.GPBDAT.all =(~(1<<15-i));

            }

            mode++;

        }

    }

}

void Gpio_select(void)

{

    EALLOW;

GpioMuxRegs.GPAMUX.all = 0x0;    // Установка всех портов

GpioMuxRegs.GPBMUX.all = 0x0; // в режим ввода/вывода

GpioMuxRegs.GPDMUX.all = 0x0;

GpioMuxRegs.GPFMUX.all = 0x0;

GpioMuxRegs.GPEMUX.all = 0x0;

GpioMuxRegs.GPGMUX.all = 0x0;

                                         GpioMuxRegs.GPADIR.all = 0xFFFF;// Порт А настроен на вывод данных

GpioMuxRegs.GPBDIR.all = 0xFFFF;// Порт В настроен на вывод данных

GpioMuxRegs.GPDDIR.all = 0x0;    // Порт D настроен на ввод данных

GpioMuxRegs.GPEDIR.all = 0x0;    // Порт E настроен на ввод данных

GpioMuxRegs.GPFDIR.all = 0x0;    // Порт F настроен на ввод данных

GpioMuxRegs.GPGDIR.all = 0x0;    // Порт G настроен на ввод данных

 

GpioMuxRegs.GPAQUAL.all = 0x0;

GpioMuxRegs.GPBQUAL.all = 0x0;

GpioMuxRegs.GPDQUAL.all = 0x0;

GpioMuxRegs.GPEQUAL.all = 0x0;

EDIS;

}

void InitSystem(void)

{

    EALLOW;

SysCtrlRegs.PLLCR.bit.DIV = 10; // Внешняя частота умножается на 5

 

    SysCtrlRegs.HISPCP.all = 0x1;

    SysCtrlRegs.LOSPCP.all = 0x2;

     // Разрешение тактирования внутренних периферийных устройств.

    SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;

    SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;

    SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;

    SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;

    SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;

    SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;

    SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;

    SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;

    EDIS;

}

interrupt void timer_int(void) //Подпрограмма обработки прерывания

{

CpuTimer0.InterruptCount++;

    GpioDataRegs.GPADAT.all=CpuTimer0.InterruptCount;

// Разрешение прерываний группы 1

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

//=========================================================

// Конец исходной программы.

//=========================================================

Сохраните программу под именем Test4.c в рабочей директории проекта. Программа выполняет следующие действия:

    – начальная инициализация периферийных устройств процессора. Функция InitSystem() устанавливает внутреннюю тактовую частоту процессора, равную 150 МГц. Функция Gpio_select() устанавливает все порты процессора в режим портов ввода/вывода. Порт А и порт В процессора настраиваются на выдачу информации;

    – инициализация контроллера управления прерываниями от периферии. Функция InitPieCtrl() настраивает управляющие регистры контроллера и разрешает процессору использовать расширенную таблицу векторов прерывания. Функция InitPieVectTable() инициализирует расширенную таблицу векторов прерывания;

    – с помощью функции PieVectTable.TINT0 = &timer_int описывается переход на подпрограмму обработки прерывания от таймера 0;

    – с помощью функции InitCpuTimers() устанавливаются режимы работы таймера 0. Задается значение входной тактовой частоты и период выдачи запросов на прерывание. Разрешается формирование запроса на прерывание по переполнению таймера;

    – разрешается обработка маскируемых прерываний в регистре масок прерывания и в регистре статуса процессора;

    – разрешается работа таймера 0;

    – в теле основной программы формируется один из режимов выдачи информации в порт В – «бегущий ноль» или «бегущая единица». Выбор режима определяется состоянием переменной mode, которая изменяется автоматически;

    – в подпрограмме обработки прерывания от таймера 0 interrupt void timer_int(void) происходит увеличения значения счетчика количества обработанных прерываний CpuTimer0.InterruptCount, выдача его значения в порт А процессора и установка разрешения прерываний для группы 1 контроллера управления прерываниями от периферии.

    Шаг 3. Скопируйте в рабочую директорию проекта вспомогательные файлы (файлы включений), файлы обращения к периферийным устройствам на языке С и командные файлы компоновщика (линкера) из библиотеки фирмы Texas Instruments. Для нашей работы понадобятся следующие файлы:
DSP281x_Headers_nonBIOS.cmd – командный файл компоновщика, размещающий переменные, объявленные в файлах включения, в памяти процессора. Используется для проектов не работающих с операционной системой DSP-BIOS;
F2812_EzDSP_RAM_lnk.cmd – командный файл компоновщика, описывающий карту памяти процессора в области ОЗУ (SARAM) для отладочного модуля eZdsp;
DSP281x_CpuTimers.c – файл описания функций и макросов для работы с таймерами процессорного ядра (расположен в директории C:\CCStudio_v3.1\c28\DSP281x_common\source) ;
DSP281x_DefaultIsr.c – файл описания подпрограмм обработки прерываний, заданных по умолчанию;
DSP281x_GlobalVariableDefs.c – файл описания глобальных переменных, используемых при обращении к периферийным устройствам (расположен в директории C:\CCStudio_v3.1\c28\DSP281x_headers\source) ;
DSP281x_PieCtrl.c – файл описания функций и макросов для настройки контроллера управления прерываними от периферии;
DSP281x_PieVect.c – файл инициализации расширенной таблицы векторов прерывания.

Шаг 4. Добавьте файлы в проект. Файлы Test4.c, DSP281x_CpuTimers.c, DSP281x_DefaultIsr.c, DSP281x_GlobalVariableDefs.c, DSP281x_PieCtrl.c, DSP281x_PieVect.c и командные файлы компоновщика (линкера) DSP281x_Headers_nonBIOS.cmd, F2812_EzDSP_RAM_lnk.cmd находятся в рабочей директории проекта. Подключите библиотеку функций языка С rts2800_ml.lib (этот файл располагается в папке …\CCStudio_v3.1\c2000\cgtools\lib\). Для подключения библиотеки можно воспользоваться настройками установок компоновщика (линкера). В настройках компилятора (закладка Preprocessor) укажите в окошке Include Search Path (-i) директории расположения необходимых библиотечных файлов включения (хедер-файлов). Это директории C:\CCStudio_v3.1\c28\DSP281x_headers\include и C:\CCStudio_v3.1\c28\DSP281x_common\include. Они указываются в одной строке и разделяются запятой. После добавления в проект исходных файлов, командных файлов компоновщика и библиотеки функций языка С, выполните команду Project -> Scan All File Dependencies. Обратите внимание, после выполнения этой команды в папке Include (окно навигатора проекта) появятся файлы DSP281x_CpuTimers.h, DSP281x_DefaultIsr.h, DSP281x_DevEmu.h, DSP281x_Device.h, DSP281x_Gpio.h, DSP281x_PieCtrl.h, DSP281x_PieVect.h, DSP281x_SysCtrl.h. Запустите проект на компиляцию.

Шаг 5. Если проект скомпилировался без ошибок, загрузите программу в ЦСП. Перейдите к программной метке «main». Вызовите окно просмотра переменных Watch Window, и добавьте в него переменные mode и CpuTimer0.InterruptCount. Вызовите для просмотра область памяти данных с начальным адресом 0х70Е0 (область регистров данных портов ввода/вывода). Установите точки останова (Breakpoints) в следующих строках исходного файла Test4.c:

        {        GpioDataRegs.GPBDAT.all =(~(1<<i));

        {        GpioDataRegs.GPBDAT.all =(1<<i);

        {        GpioDataRegs.GPBDAT.all =(1<<15-i);

        {        GpioDataRegs.GPBDAT.all =(~(1<<15-i));

        CpuTimer0.InterruptCount++;


В результате всех проделанных операций, внешний вид среды проектирования Code Composer Studio должен выглядеть так, как показано на рисунке 10.


 Рисунок 10. Внешний вид среды Code Composer Studio.

 

    Шаг 6. Теперь можно приступить к проверке работоспособности нашего проекта. Для этого выполните команду Debug -> Animate (или используйте функциональную клавишу Alt+F5). В процессе выполнения программы в окне просмотра переменных будут меняться их значения. Обратите внимание, что переменная mode изменяет свои значения в диапазоне от 0 до 3. Значение переменной CpuTimer0.InterruptCount должно совпадать со значением, хранящимся в регистре данных порта А (адрес 0х70Е0 в окне просмотра памяти данных) и изменяться с периодом, равным 1 сек. Если все это выполняется, то программа работает. Остановите выполнение программы с помощью команды Halt.

 

    На этом наше занятие закончено. Для закрепления материала попробуйте самостоятельно:

– изменить способ выдачи информации на порт В;

– изменить период выдачи запроса на прерывание от таймера 0;

– изменить способ обработки данных в подпрограмме обработки прерывания от таймера перед записью их в порт А процессора.

 

            Литература:

  1. TMS320F2810, TMS320F2812 Digital Signal Processors. Data Manual (SPRS174I).
  2. TMS320C28x DSP. CPU and Instruction Set Reference Guide (SPRU430A).
  3. TMS320F28x DSP. Boot ROM Reference Guide (SPRU095A).
  4. eZdsp F2812. Technical Reference. Spectrum Digital Inc.
  5. TMS320F28x DSP. System Control and Interrupts Reference Guide (SPRU078A).
  6. ti.com
  7. C281x C/C++ Header Files and Peripheral Examples Quick Start (SPRC097 Version 1.11).