Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работают прерывания в LPC176x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Altemir
Всем день добрый. Разбираюсь с прерываниями LPC176x в IAR 6.21, столкнулся с такой проблемой:
1. Настроен таймер на генерацию прерываний
2. Определена функция void TIMER0_IRQHandler(void) согласно наименованию в startup_LPC17xx.s, который подключен к проекту и не изменялся
3. После запуска программы перехода на мою функцию нет, такое ощущение, что программа переходит на дефолтную, определённую в startup_LPC17xx.s и зацикливается

Выкидывал из проекта startup_LPC17xx.s, определял векторы/функции через отдельный файл vector_table_M.c, всё работает как надо, переходы фиксируются. Листинг указанного файла:
CODE
//-------------------------------------------------------------------------------
#pragma language=extended
#pragma segment="CSTACK"
//-------------------------------------------------------------------------------
extern "C" void __iar_program_start( void );
//-------------------------------------------------------------------------------
__weak void NMI_Handler( void ) { while (1) {} }
__weak void HardFault_Handler( void ) { while (1) {} }
__weak void MemManage_Handler( void ) { while (1) {} }
__weak void BusFault_Handler( void ) { while (1) {} }
__weak void UsageFault_Handler( void ) { while (1) {} }
__weak void SVC_Handler( void ) { while (1) {} }
__weak void DebugMon_Handler( void ) { while (1) {} }
__weak void PendSV_Handler( void ) { while (1) {} }
__weak void SysTick_Handler( void ) { while (1) {} }
__weak void WDT_IRQHandler( void ) { while (1) {} }
__weak void TIMER0_IRQHandler( void ) { while (1) {} }
__weak void TIMER1_IRQHandler( void ) { while (1) {} }
__weak void TIMER2_IRQHandler( void ) { while (1) {} }
__weak void TIMER3_IRQHandler( void ) { while (1) {} }
__weak void UART0_IRQHandler( void ) { while (1) {} }
__weak void UART1_IRQHandler( void ) { while (1) {} }
__weak void UART2_IRQHandler( void ) { while (1) {} }
__weak void UART3_IRQHandler( void ) { while (1) {} }
__weak void PWM1_IRQHandler( void ) { while (1) {} }
__weak void I2C0_IRQHandler( void ) { while (1) {} }
__weak void I2C1_IRQHandler( void ) { while (1) {} }
__weak void I2C2_IRQHandler( void ) { while (1) {} }
__weak void SPI_IRQHandler( void ) { while (1) {} }
__weak void SSP0_IRQHandler( void ) { while (1) {} }
__weak void SSP1_IRQHandler( void ) { while (1) {} }
__weak void PLL0_IRQHandler( void ) { while (1) {} }
__weak void RTC_IRQHandler( void ) { while (1) {} }
__weak void EINT0_IRQHandler( void ) { while (1) {} }
__weak void EINT1_IRQHandler( void ) { while (1) {} }
__weak void EINT2_IRQHandler( void ) { while (1) {} }
__weak void EINT3_IRQHandler( void ) { while (1) {} }
__weak void ADC_IRQHandler( void ) { while (1) {} }
__weak void BOD_IRQHandler( void ) { while (1) {} }
__weak void USB_IRQHandler( void ) { while (1) {} }
__weak void CAN_IRQHandler( void ) { while (1) {} }
__weak void GPDMA_IRQHandler( void ) { while (1) {} }
__weak void I2S_IRQHandler( void ) { while (1) {} }
__weak void Ethernet_IRQHandler( void ) { while (1) {} }
__weak void RIT_IRQHandler( void ) { while (1) {} }
__weak void MotorControlPWM_IRQHandler( void ) { while (1) {} }
__weak void QE_IRQHandler( void ) { while (1) {} }
__weak void PLL1_IRQHandler( void ) { while (1) {} }
//-------------------------------------------------------------------------------
typedef void( *intfunc )( void );
typedef union { intfunc __fun; void * __ptr; } intvec_elem;
//-------------------------------------------------------------------------------
#pragma location = ".intvec"
extern "C" const intvec_elem __vector_table[]=
{
{ .__ptr = __sfe( "CSTACK" ) },
__iar_program_start,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSV_Handler,
SysTick_Handler,
WDT_IRQHandler,
TIMER0_IRQHandler,
TIMER1_IRQHandler,
TIMER2_IRQHandler,
TIMER3_IRQHandler,
UART0_IRQHandler,
UART1_IRQHandler,
UART2_IRQHandler,
UART3_IRQHandler,
PWM1_IRQHandler,
I2C0_IRQHandler,
I2C1_IRQHandler,
I2C2_IRQHandler,
SPI_IRQHandler,
SSP0_IRQHandler,
SSP1_IRQHandler,
PLL0_IRQHandler,
RTC_IRQHandler,
EINT0_IRQHandler,
EINT1_IRQHandler,
EINT2_IRQHandler,
EINT3_IRQHandler,
ADC_IRQHandler,
BOD_IRQHandler,
USB_IRQHandler,
CAN_IRQHandler,
GPDMA_IRQHandler,
I2S_IRQHandler,
Ethernet_IRQHandler,
RIT_IRQHandler,
MotorControlPWM_IRQHandler,
QE_IRQHandler,
PLL1_IRQHandler
};
//-------------------------------------------------------------------------------


Помогите разобраться, в чём может быть проблема? Нужно ли что-то менять в startup_LPC17xx.s? Листинг стандартного:
CODE
; Cortex-M version
;

MODULE ?cstartup

;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)

SECTION .intvec:CODE:NOROOT(2)

EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size

DATA

__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler

DCD NMI_Handler
DCD HardFault_Handler
DCD MemManage_Handler
DCD BusFault_Handler
DCD UsageFault_Handler
__vector_table_0x1c
DCD 0
DCD 0
DCD 0
DCD 0
DCD SVC_Handler
DCD DebugMon_Handler
DCD 0
DCD PendSV_Handler
DCD SysTick_Handler

; External Interrupts
DCD WDT_IRQHandler ; 16: Watchdog Timer
DCD TIMER0_IRQHandler ; 17: Timer0
DCD TIMER1_IRQHandler ; 18: Timer1
DCD TIMER2_IRQHandler ; 19: Timer2
DCD TIMER3_IRQHandler ; 20: Timer3
DCD UART0_IRQHandler ; 21: UART0
DCD UART1_IRQHandler ; 22: UART1
DCD UART2_IRQHandler ; 23: UART2
DCD UART3_IRQHandler ; 24: UART3
DCD PWM1_IRQHandler ; 25: PWM1
DCD I2C0_IRQHandler ; 26: I2C0
DCD I2C1_IRQHandler ; 27: I2C1
DCD I2C2_IRQHandler ; 28: I2C2
DCD SPI_IRQHandler ; 29: SPI
DCD SSP0_IRQHandler ; 30: SSP0
DCD SSP1_IRQHandler ; 31: SSP1
DCD PLL0_IRQHandler ; 32: PLL0 Lock (Main PLL)
DCD RTC_IRQHandler ; 33: Real Time Clock
DCD EINT0_IRQHandler ; 34: External Interrupt 0
DCD EINT1_IRQHandler ; 35: External Interrupt 1
DCD EINT2_IRQHandler ; 36: External Interrupt 2
DCD EINT3_IRQHandler ; 37: External Interrupt 3
DCD ADC_IRQHandler ; 38: A/D Converter
DCD BOD_IRQHandler ; 39: Brown-Out Detect
DCD USB_IRQHandler ; 40: USB
DCD CAN_IRQHandler ; 41: CAN
DCD DMA_IRQHandler ; 42: General Purpose DMA
DCD I2S_IRQHandler ; 43: I2S
DCD ENET_IRQHandler ; 44: Ethernet
DCD RIT_IRQHandler ; 45: Repetitive Interrupt Timer
DCD MCPWM_IRQHandler ; 46: Motor Control PWM
DCD QEI_IRQHandler ; 47: Quadrature Encoder Interface
DCD PLL1_IRQHandler ; 48: PLL1 Lock (USB PLL)
__Vectors_End

__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB

PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER(2)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0

PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER(1)
NMI_Handler
B NMI_Handler

PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER(1)
HardFault_Handler
B HardFault_Handler

PUBWEAK MemManage_Handler
SECTION .text:CODE:REORDER(1)
MemManage_Handler
B MemManage_Handler

PUBWEAK BusFault_Handler
SECTION .text:CODE:REORDER(1)
BusFault_Handler
B BusFault_Handler

PUBWEAK UsageFault_Handler
SECTION .text:CODE:REORDER(1)
UsageFault_Handler
B UsageFault_Handler

PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER(1)
SVC_Handler
B SVC_Handler

PUBWEAK DebugMon_Handler
SECTION .text:CODE:REORDER(1)
DebugMon_Handler
B DebugMon_Handler

PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER(1)
PendSV_Handler
B PendSV_Handler

PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER(1)
SysTick_Handler
B SysTick_Handler

PUBWEAK WDT_IRQHandler
SECTION .text:CODE:REORDER(1)
WDT_IRQHandler
B WDT_IRQHandler

PUBWEAK TIMER0_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER0_IRQHandler
B TIMER0_IRQHandler

PUBWEAK TIMER1_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER1_IRQHandler
B TIMER1_IRQHandler

PUBWEAK TIMER2_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER2_IRQHandler
B TIMER2_IRQHandler

PUBWEAK TIMER3_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER3_IRQHandler
B TIMER3_IRQHandler

PUBWEAK UART0_IRQHandler
SECTION .text:CODE:REORDER(1)
UART0_IRQHandler
B UART0_IRQHandler

PUBWEAK UART1_IRQHandler
SECTION .text:CODE:REORDER(1)
UART1_IRQHandler
B UART1_IRQHandler

PUBWEAK UART2_IRQHandler
SECTION .text:CODE:REORDER(1)
UART2_IRQHandler
B UART2_IRQHandler

PUBWEAK UART3_IRQHandler
SECTION .text:CODE:REORDER(1)
UART3_IRQHandler
B UART3_IRQHandler

PUBWEAK PWM1_IRQHandler
SECTION .text:CODE:REORDER(1)
PWM1_IRQHandler
B PWM1_IRQHandler

PUBWEAK I2C0_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C0_IRQHandler
B I2C0_IRQHandler

PUBWEAK I2C1_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C1_IRQHandler
B I2C1_IRQHandler

PUBWEAK I2C2_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C2_IRQHandler
B I2C2_IRQHandler

PUBWEAK SPI_IRQHandler
SECTION .text:CODE:REORDER(1)
SPI_IRQHandler
B SPI_IRQHandler

PUBWEAK SSP0_IRQHandler
SECTION .text:CODE:REORDER(1)
SSP0_IRQHandler
B SSP0_IRQHandler

PUBWEAK SSP1_IRQHandler
SECTION .text:CODE:REORDER(1)
SSP1_IRQHandler
B SSP1_IRQHandler

PUBWEAK PLL0_IRQHandler
SECTION .text:CODE:REORDER(1)
PLL0_IRQHandler
B PLL0_IRQHandler

PUBWEAK RTC_IRQHandler
SECTION .text:CODE:REORDER(1)
RTC_IRQHandler
B RTC_IRQHandler

PUBWEAK EINT0_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT0_IRQHandler
B EINT0_IRQHandler

PUBWEAK EINT1_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT1_IRQHandler
B EINT1_IRQHandler

PUBWEAK EINT2_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT2_IRQHandler
B EINT2_IRQHandler

PUBWEAK EINT3_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT3_IRQHandler
B EINT3_IRQHandler

PUBWEAK ADC_IRQHandler
SECTION .text:CODE:REORDER(1)
ADC_IRQHandler
B ADC_IRQHandler

PUBWEAK BOD_IRQHandler
SECTION .text:CODE:REORDER(1)
BOD_IRQHandler
B BOD_IRQHandler

PUBWEAK USB_IRQHandler
SECTION .text:CODE:REORDER(1)
USB_IRQHandler
B USB_IRQHandler

PUBWEAK CAN_IRQHandler
SECTION .text:CODE:REORDER(1)
CAN_IRQHandler
B CAN_IRQHandler

PUBWEAK DMA_IRQHandler
SECTION .text:CODE:REORDER(1)
DMA_IRQHandler
B DMA_IRQHandler

PUBWEAK I2S_IRQHandler
SECTION .text:CODE:REORDER(1)
I2S_IRQHandler
B I2S_IRQHandler

PUBWEAK ENET_IRQHandler
SECTION .text:CODE:REORDER(1)
ENET_IRQHandler
B ENET_IRQHandler

PUBWEAK RIT_IRQHandler
SECTION .text:CODE:REORDER(1)
RIT_IRQHandler
B RIT_IRQHandler

PUBWEAK MCPWM_IRQHandler
SECTION .text:CODE:REORDER(1)
MCPWM_IRQHandler
B MCPWM_IRQHandler

PUBWEAK QEI_IRQHandler
SECTION .text:CODE:REORDER(1)
QEI_IRQHandler
B QEI_IRQHandler

PUBWEAK PLL1_IRQHandler
SECTION .text:CODE:REORDER(1)
PLL1_IRQHandler
B PLL1_IRQHandler

END
AHTOXA
Если обработчик определён в *.cpp файле, то его надо объявлять как
Код
extern "C" TIMER0_IRQHandler(void)
{
   ...
}

Altemir
Цитата(AHTOXA @ Aug 26 2011, 06:27) *
Если обработчик определён в *.cpp файле, то его надо объявлять как...

Ого! Не знал. Спасибо огромное! Получается, компилятор/линкер игнорировали моё объявление "void TIMER0_IRQHandler(void);", подставляя функцию из *.s файла? А указанное Вами объявление задало им соответствующий приоритет выбора указанной функции?
AHTOXA
Нет, не так. Почитайте про name mangling.
Вкратце - компилятор c++ хитрым образом искажает имена функций в объектных файлах, в зависимости от их параметров. Это нужно для перегрузки функций. Поэтому линкер не находит вашего обработчика.
Altemir
Цитата(AHTOXA @ Aug 26 2011, 14:05) *
Нет, не так. Почитайте про name mangling.

О! Теперь понял. Ещё раз спасибо. Старшие товарищи по оружию постфактум объяснили потом то же самое.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.