Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Отчет по лабораторной работе №3
Преподаватель: Ухов А.А.
Выполнили: Прутковский В.
Тарасов К.
Гр. 7203
Санкт-Петербург
2011
Задание 1.
Написать программу проверки состояния кнопок с использованием прерываний
// main.c
#include "includes.h"
#include "irq.h"
void Delay(unsigned long a)
{
while(--a != 0);
}
void InitVIC(void)
{
DWORD i = 0;
DWORD *vect_addr, *vect_cntl;
VICINTENCLEAR = 0xFFFFFFFF; //Инициализация VIC
VICADDRESS = 0;
VICINTSELECT = 0;
for ( i = 0; i < VIC_SIZE; i++ ) //Начальная установка в 0 векторов
{
vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i * 4);
vect_cntl = (DWORD *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i * 4);
*vect_addr = 0x0;
*vect_cntl = 0xF;
}
}
void InstallIRQ( DWORD IntNumber, void *HandlerAddr, DWORD Priority )
{
DWORD *vect_addr;
DWORD *vect_cntl;
VICINTENCLEAR = 1 << IntNumber; //Запрет прерывания на время настройки
// Поиск первого свободного VIC адреса
vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber * 4);
vect_cntl = (DWORD *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + IntNumber * 4);
//Установка вектора прерывания
*vect_addr = (DWORD)HandlerAddr;
*vect_cntl = Priority;
//Разрешение прерывания
VICINTENABLE = 1 << IntNumber;
}
void InitExternalInterrupts()
{
IO0INTENF = 0x0020; //Прерывание по срезу - кнопка на порту P0.5
//Внешнее прерывание устанавливается на EINT3
InstallIRQ( EINT3_INT, (void *)ExternalInterruptsHandler3, 0x02 );
}
__irq __nested __arm void ExternalInterruptsHandler3()
{
if(IO0INTSTATF & 0x0020) //Если прерывание вызвано нажатием на первую кнопку
{
FIO2PIN = 0xFF; //Включить все светодиоды
}
IO0INTCLR = 0xFFFFFFFF;//Очистка прерываний от GPIO PORT0
VICADDRESS = 0;
}
int main (void)
{
SCS |= 0x20; // Разрешить генератор с кварцевым резонатором 12МГц
while( !(SCS & 0x40) ); //Подождать стабилизации частоты генератора
// Настроить порт
SCS |= 0x01; //Разрешить быстрый ввод/вывод
FIO2DIR = 0x00FF; // Биты 0-7 порта 2 на вывод для управления светодиодами
FIO2MASK = 0; //Все разряды порта 2 работают в быстром режиме
FIO2PIN = 0x00; // Выключить светодиоды
InitVIC(); //Инициализация системы прерываний
InitExternalInterrupts(); //Инициализация внешних прерываний
while (1)//Loop forever
{
//Ничего не делаем - все происходит в функции обработки прерывания
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.