18.12.2011, 01:49
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
У меня в проекте под LPC2478 всё несколько сложнее ...
install_irq( TIMER0_INT, (void *)Timer0Handler, HIGHEST_PRIORITY )
Почему-то не подгружаются файлы .zip.
Оставьте адрес - вышлю на почту
Последний раз редактировалось SasaVitebsk; 18.12.2011 в 01:56.
|
|
|
|
18.12.2011, 02:56
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: lpc2478 не работают прерывания
|
|
|
|
18.12.2011, 09:58
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
SasaVitebsk, вот этого я и не вижу. Т.е. в заданный адрес он записывает значение при инициализации, в VICCECADDRES - нет. Вот в итоге и считывает оттуда 0. Моя почта ipurityi@yandex.ru
|
|
|
|
19.12.2011, 20:47
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Сообщение от coma_nder
|
SasaVitebsk, вот этого я и не вижу. Т.е. в заданный адрес он записывает значение при инициализации, в VICCECADDRES - нет. Вот в итоге и считывает оттуда 0.
|
Кто "он"? Это вы должны записывать. Кто, интересно, за вас запишет адрес?
|
|
|
|
20.12.2011, 07:49
|
|
coma_nder
Гость
|
Re: lpc2478 не работают прерывания
SasaVitebsk, понятно, что в регистры адреса и приоритета я сам записываю адрес функции обработчика прерываний и ее приоритет соответственно. Отладчиком я это и вижу, что например в VicVectAdr2 и VicPrior2 происходит запись. А вот где происходит считывание этого регистра адреса и запись в VICCECADDRES я понять не могу.
|
|
|
|
20.12.2011, 11:00
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Сообщение от coma_nder
|
А вот где происходит считывание этого регистра адреса и запись в VICCECADDRES я понять не могу.
|
Это же ARM7. Здесь всё просто ... Контроллер VIC несколько не доделан, по моим понятиям ...
===
Как и всегда в программировании, вы можете поступить 10 способами ... но от этого и будет зависеть результат.
При возникновении IRQ (не FIQ) контроллер вылетает по адресу IRQ. Вы можете прочитать вектор и осуществить переход сами ... Похоже, в приведенном вами примере так и делается ...
Но если использовать тот cstartup что я вам выслал на почту, то этого делать не требуется вообще ... в следующей строке этого файла
Код:
|
;LDR PC,IRQ_Handler ; IRQ
LDR PC,[PC,#-0x120] ; IRQ *** вот здесь |
осуществляется косвенный переход (загрузка счётчика команд) по вектору. Где 120 есть адрес смещения на вектора. Я например её сам высчитывал. Для lpc2106, к примеру, здесь будет стоять другой адрес ...
Собственно не заморачивайтесь. Суть в том, что по этой одной команде вы сразу перейдёте на вектор обработчика, в зависимости от вызванного прерывания. То есть следующей после этой команды будет ваш обработчик. Если у вас lpc2478!
Обратите внимание на закоментированную строчку. Если вы её раскоментируете, а закоментируете вторую, то у вас будет класический единый обработчик IRQ. На мой взгляд это не удобно. Фактически с этим файлом вы получаете полноценный контроллер прерываний. С учётом вызвавшего прерывания, вы сразу переходите на его обработчик.
Блин, надеюсь я доступно разжевал?
Обратите внимание, что для FIQ у вас всё равно один обработчик. Поэтому вы либо должны программно определить источник и перейти на обработчик, либо, оставить лишь один обработчик в качестве высокоприоритетного. Я поступаю вторым способом. На мой взгляд предпочтительно былобы иметь не более одного уровня вложенности, при таком контроллере прерываний.
В завершение отмечу, что в cortex-m3 полноценный контроллер, который является частью ядра. Он поддерживает многоуровневую вложенность и приоритеры. Там заморачиваться на надо.
|
|
|
|
29.01.2013, 13:02
|
|
Прохожий
Регистрация: 29.01.2013
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Доброго дня.. сижу с аналогичной проблемой. Пишу на C++ под LPC2478. Настроил прерывания функцией такой
Код:
|
void VIC_SetVectoredIRQ( void(*pIRQSub)(), unsigned int Priority, unsigned int VicIntSource)
{
unsigned long volatile *pReg;
// load base address of vectored address registers
pReg = &VICVECTADDR0;
// Set Address of callback function to corresponding Slot
*(pReg+VicIntSource) = (unsigned long)pIRQSub;
// load base address of ctrl registers
pReg = &VICVECTPRIORITY0;
// Set source channel and enable the slot
*(pReg+VicIntSource) = Priority;
// Clear FIQ select bit
VICINTSELECT &= ~(1‹‹VicIntSource);
} |
настраивал так (Timer0_IRQ - ф-ия, которую нужно вызвать по прерыванию)
Код:
|
VIC_SetVectoredIRQ( Timer0_IRQ, 0x02, VIC_TIMER0 );
VICINTENABLE |= TMR0_MASK; |
Настройки памяти такие
.intvec start = 0
ROM = 0x0 - 0x7FFFF
RAM = 0x40000000 - 0x7FFFFFFF
в дебаге включено use flash loader с дефолтными настройками
В итоге в момент прерывания вижу следующую ситуацию:
Адрес ф-ии Timer0_IRQ = 0x3A2
в дизассемблере
VICVECTADDDR4 (0xFFFF F110) = 0x0000 03A3
VICADDRESS = 0x0000 03A3
VICINTENABLE = 0x0000 0010
VICRAWINTR = 0x0000 2018
VICSOFTINT = 0x0000 0000
PC = 0x18 - туда влетаю, когда случается IRQ, как я понял. При указанном положении .ivect start = 0.
Дальше - почему-то как я ни ужимался, все равно по адресу 0x18 осуществляется переход:
LDR PC,[PC,#0x14]
вот что творится в таблице прерываний
Код:
|
0x0: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x20] __iar_program_start
0x4: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x24] Abort_Handler
0x8: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x28] Abort_Handler
0xc: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x2c] Abort_Handler
0x10: 0xe59ff018 LDR PC, [PC, #0x18] ; [0x30] Abort_Handler
0x14: 0xb8a06f60 STMLT R0!, {R5, R6, R8-R11, SP, LR}
0x18: 0xe59ff014 LDR PC, [PC, #0x14] ; [0x34] Abort_Handler
0x1c: 0xe59ff014 LDR PC, [PC, #0x14] ; [0x38] Abort_Handler
0x20: 0x000004a8 DC32 __iar_program_start
0x24: 0x00000614 DC32 Abort_Handler
0x28: 0x00000614 DC32 Abort_Handler
0x2c: 0x00000614 DC32 Abort_Handler
0x30: 0x00000614 DC32 Abort_Handler
0x34: 0x00000614 DC32 Abort_Handler
0x38: 0x00000614 DC32 Abort_Handler
0x3c: 0xffffffff MRC2 p15, #7, PC, C15, C15, #7
0x40: 0xffffffff MRC2 p15, #7, PC, C15, C15, #7
... |
и я улетаю на что-то помеченное в дизассемблере как Abort_Handler. При чем там же стоят метки FIQ_Handler, IRQ_Handler, Prefetch_Handler.
Прошу, может у кого есть предположения, где я лажанулся? а то мозг уже вскипает.
Как-то можно привязать функцию к адресу 0x18 для централизованной обработки всех IRQ?
Последний раз редактировалось Ivan_01; 29.01.2013 в 17:45.
|
|
|
|
30.01.2013, 07:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Вот мой код инициализации прерываний от таймера (LPC2468 ).
Среда Keil.
Вроде все работает.
Код:
|
__irq void TM0_Handler (void){
// само прерывание
//........................
T0IR |=1;
VICVectAddr=0;
}
void initints(void) {
VICVectAddr4=(unsigned)TM0_Handler;
VICVectCntl4=0x02; //приоритет
T0MR0=140; //1125 Гц
T0MCR=0x03; //сброс и прерывание по достижению T0MR0
T0PR=15; //prescaler = 16
T0TCR=0x02; //сброс
T0TCR=0x01; //пуск
VICIntSelect=0x00;// все прерывания как IRQ
VICIntEnable=(1‹‹4); //разрешаем TM0
} |
|
|
|
|
30.01.2013, 13:33
|
|
Прохожий
Регистрация: 29.01.2013
Сообщений: 7
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Благодарствую за код. Пересел с IAR на KEIL. Он цветной..) Подскажи пожалста, как его настроить нормально? а то пол-дня уже бьюсь головой в монитор. Дальше стартапа программулина не идет, глохнет где-то по адресу 0x614 на странной инструкции перехода по адресу 0x614.
Подозреваю, что где-то не так указал память.
использую это - LPC2400.s
В Target указал:
IROM1 start = 0x0; size = 0x40000000 (startup указан)
IRAM1 start = 0x40000000; size = 0xFFFF; (default указан)
там же выбран Arm-mode Code generation
в Debug настроено
use ULINK Pro ARM debugger (та железка, что у меня есть)
в настройках дебаггера
max JTAG Clock = RTCK
Device chain = ARM7TDMI-S core
в Utilites
установлен use target driver for flash programming,
выбран ULINK debugger
в его настройках - самое темное и непонятное мне место
алгоритм поставил LPC2000 IAP2 512
полное стирание чипа
RAM for algorithm: start = 0x40000000; size = 0x0800
|
|
|
|
30.01.2013, 15:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,352
Сказал спасибо: 85
Сказали Спасибо 610 раз(а) в 369 сообщении(ях)
|
Re: lpc2478 не работают прерывания
Цитата:
|
LPC2000 IAP2 512
полное стирание чипа
RAM for algorithm: start = 0x40000000; size = 0x0800
|
Это верно. И все три галочки поставить.
Цитата:
|
В Target указал:
IROM1 start = 0x0; size = 0x40000000 (startup указан)
IRAM1 start = 0x40000000; size = 0xFFFF; (default указан)
там же выбран Arm-mode Code generation
|
У меня:
Кварц 12 Мгц
IROM1 start = 0x0; size = 0x80000
IRAM1 start = 0x40000000; size = 0x10000
Arm-mode Code generation
Цитата:
|
в настройках дебаггера
max JTAG Clock = RTCK
Device chain = ARM7TDMI-S core
|
У меня J-Link, поэтому по другому.
Во вложении мои хидер для 2468 и LPC2400.s
Настройки для 12 МГц.
|
|
|
Сказали "Спасибо" pambaru
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:35.
|
|