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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.