Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: реализация прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sarez
Доброго дня!!! Народ, помогите пожалуйста!!!! Несколько дней уже бьюсь с прерываниями - не могу реализовать- программа не переходит на обработчик .... Опишите, если можно , как для малолетнего идиота, пошагово алгоритм действий....
Опишу, что у делаю я. Есть контроллер LPC 2214. Есть источник прерывания ( стек W3150) . Есть IAR 4.40 . Источник висит на линии порта ввода/вывода P0.16. Линия сконфигурирована как вход внешнего прерывания EINT0 ( регистр IO0DIR = 0x000000, т.е нога P0.16 сконфигурирована как вход, регистр PINSEL1 = 0x01, т.е линия сконфигурирована как вход внешнего прерывания..) . Сигналом прерывания является низкий уровень на входе. Соответственно содержимое регистра EXMODE ( выбор типа прерывания - по фронту или по уровню , не менял - там нули..). startup файл добовляю в проект и прописываю следующее ( полную версию startup прилагаю) :

org 0x18
ldr pc, 0xFFFFF030 ; адрес регистра VicVectAddr

В xls файле по поводу стеков следующее ( полную версию прилагаю ) :

//*************************************************************************
// Stack and heap segments.
//*************************************************************************

-Z(DATA)CSTACK+2000=40000000-40003FFF
-Z(DATA)IRQ_STACK+100=40000000-40003FFF
-Z(DATA)HEAP+8000=40000000-40003FFF
-Z(DATA)FIQ_STACK+100=40000000-40003FFF


Функция обработки :

__arm __irq void irq_handler()
{
printf("socket is :");
IR_STATUS[0] = IINCHIP_READ(INT_REG);
IR_STATUS[0] = IINCHIP_READ(INT_STATUS(0));

EXTINT = 0x1;
VICVectAddr = 0; // Clear interrupt in VIC.

// iinchip_irq();

}

Определена до main.

Функция инициализации VIC :

void irq_init ()

{
IO0DIR = 0x00000000;
PINSEL1 = 0x00000001;
VICVectCntl0 = 0x2e;
VICVectAddr0 = (unsigned)&irq_handler;
VICIntSelect = 0x00000000;
VICIntEnable = 0x00004000 ;

}

Вызываю в main() до инициализации самого источника прерываний.

Что самое интересное - в регистрах EXTINT и VIQIRQStatus после возникновения прерываний еденицы, т.е контроллер прерывание ловит, но почему-то не переходит на его обработчик....
Обьясните пожалуйста пошагово, как это делать. Если можно, подкинте примеры startupa..
Пытался сделать прерывание fiq, как показывал уважаемый Andy Mozzhevilov тут
http://electronix.ru/forum/index.php?showtopic=31378
был тут
http://electronix.ru/forum/index.php?showt...mp;#entry190686
тут
http://electronix.ru/forum/index.php?showt...27621&st=15

но ничего не вышло. Пожалуйста помогите!!!!

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
adnega
Попробуй
ldr PC,[PC,#-0x0FF0].
Sarez
Пробовал....уже когда из шкафа достал любимай бубен, даже так делал :

org 0x18
ldr pc, IRQ

org 0x38
IRQ: dc32 irq_handler

Что то вроде перехода по адресу обработчика прерывания.....
GetSmart
а __enable_interrupt стоит в main ?
Sarez
а __enable_interrupt стоит в main ?

Поподробне пожалуйста? Чтобы разрешить прерывания нужно еще что нибудь сделать , кроме записи едениц по требуемым каналам в регистр VICIntEnable ?
GetSmart
Поставить вот эту строчку в main()

__enable_interrupt();

И ещё в начале файла main поставить вот это

#include <inarm.h>

Хотя я предпочитаю вот это:

#define _disIRQ() __set_CPSR(__get_CPSR() | 0xc0)
#define _enaIRQ() __set_CPSR(__get_CPSR() & ~0xc0)
Sarez
Есть!!! Обработал!!! Спасибо большое a14.gif
Буду разбираться с этим файлом. БОЛЬШОЕ СПАСИБО!!!!
Alex03
Ну и если ещё не глядели, то в errata про extint почитайте чтобы не наступить потом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.