Система прерываний DSP семейства C28х. Система прерываний процессоров семейства С28х, а также таймеры ядра ЦПУ, страница 2

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 в подпрограмму обработки прерываний таймера ЦПУ. Запустим на выполнение измененную программу.

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

Листинг программы:

//#####################################################################

// Имя файла:    _Lab2_.c

//

// Описание:     С помощью 8 светодиодов, подключенных к линиям

//            порта GPIOB0 - GPIOB7, формируются "бегущие огни".

//            Направление движения справа - налево и наоборот

//#####################################################################

#include "DSP281x_Device.h" // Включение заголовочного файла

void Gpio_select(void);

void InitSystem(void);

interrupt void cpu_timer0_isr(void);

void main(void)

{

unsigned int i;

unsigned int LED[8]= {0x0001,0x0002,0x0004,0x0008,

0x0010,0x0020,0x0040,0x0080};     

InitSystem();              // Инициализация регистров ЦСП

Gpio_select();            // Инициализация линий ввода/вывода

InitPieCtrl();

InitPieVectTable();

EALLOW;

PieVectTable.TINT0 = &cpu_timer0_isr;

EDIS;

InitCpuTimers();

ConfigCpuTimer(&CpuTimer0, 150, 10000);

PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

IER = 1;

EINT;

ERTM;

CpuTimer0Regs.TCR.bit.TSS = 0;

while(1)

{   

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

{

if(i<7)        GpioDataRegs.GPBDAT.all = LED[i];

else            GpioDataRegs.GPBDAT.all = LED[14-i];

//delay_loop(1000000);

while(CpuTimer0.InterruptCount<3);

CpuTimer0.InterruptCount=0;     

EALLOW;

SysCtrlRegs.WDKEY=0xAA;

EDIS;

}

}

}           

interrupt void cpu_timer0_isr(void)

{

CpuTimer0.InterruptCount++;

EALLOW;

SysCtrlRegs.WDKEY=0x55;

EDIS;

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

//#####################################################################

// Подпрограмма:         Gpio_select

//

// Описание:     Настройка линий порта GPIO B15-8 на ввод, а линий B7-0 //               на вывод. Настройка всех линий портов A, D, F, E, G на

//            ввод. Запрещение работы входного ограничителя

//#####################################################################

void Gpio_select(void)

{

EALLOW;

GpioMuxRegs.GPAMUX.all = 0x0000;      // Настройка линий ввода/вывода на                          

GpioMuxRegs.GPBMUX.all = 0x0000;     // работу в качестве портов  

GpioMuxRegs.GPDMUX.all = 0x0000;

GpioMuxRegs.GPFMUX.all = 0x0000;                

GpioMuxRegs.GPEMUX.all = 0x0000;

GpioMuxRegs.GPGMUX.all = 0x0000;                           

GpioMuxRegs.GPADIR.all = 0x0000;       // Настройка портов А, D, E, F, G на ввод

GpioMuxRegs.GPBDIR.all = 0x00FF;       // Настройка линий 15-8 на ввод, а линий

GpioMuxRegs.GPDDIR.all = 0x0000;      // 7-0 на вывод

GpioMuxRegs.GPEDIR.all = 0x0000;       

GpioMuxRegs.GPFDIR.all = 0x0000;       

GpioMuxRegs.GPGDIR.all = 0x0000;      

GpioMuxRegs.GPAQUAL.all = 0x0000;   // Запрещение входного ограничителя

GpioMuxRegs.GPBQUAL.all = 0x0000;

GpioMuxRegs.GPDQUAL.all = 0x0000;

GpioMuxRegs.GPEQUAL.all = 0x0000;

EDIS;

}    

//#####################################################################

// Подпрограмма:         InitSystem

//

// Описание:     Настройка сторожевого таймера на работу,

//            предделитель = 1. Выработка сброса сторожевым

//            таймером. Внутренняя частота работы ЦСП 150 МГц.

//            Запись в предделитель высокоскоростного таймера

//            коэффициента деления 2, а в предделитель

//            низкоскоростного таймера - 4. Запрещение работы

//            периферийных устройств

//#####################################################################

void InitSystem(void)

{

EALLOW;

SysCtrlRegs.SCSR = 0x0000; // Выработка сброса WDT

SysCtrlRegs.WDCR= 0x00AF;// 0x00AF - Разрешение работы сторожевого                                                                          // таймера, предделитель = 64

// 0x00E8 - запрещение работы  сторо// жевого таймера, предделитель = 1

SysCtrlRegs.PLLCR.bit.DIV = 0x000A;// Настройка блока умножения частоты

SysCtrlRegs.HISPCP.all = 0x0001; // Задание значения предделителя высоSysCtrlRegs.LOSPCP.all = 0x0002; // коскоростного и низкоскоростного

// таймеров    

SysCtrlRegs.PCLKCR.bit.EVAENCLK=0x0000;   // Запрещение работы периферийSysCtrlRegs.PCLKCR.bit.EVBENCLK=0x0000;    // ных устройств

SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0x0000;

SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0x0000;

SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0x0000;

SysCtrlRegs.PCLKCR.bit.SPIENCLK=0x0000;

SysCtrlRegs.PCLKCR.bit.ECANENCLK=0x0000;

SysCtrlRegs.PCLKCR.bit.ADCENCLK=0x0000;

EDIS;

}