你好!
我在使用LPC4088 Timer0 定时器中断,但是进入不了中断服务函数。我的配置如下。
Hi all
I am using the LPC4088 Timer0 interrupt, but can't access the interrupt service function(TIMER0_IRQHandler).My configuration is as follows.
void TIME0_init(void)
{
LPC_SC->PCONP |=(1<<1); //打开TIME0电源功率控制,默认值为1
LPC_TIM0 ->TCR =0x02; //复位定时器
LPC_TIM0 ->PR =0; //预分频清零
LPC_TIM0 ->TC =0; //保存定时器计数器的计数值
LPC_TIM0 ->IR =0x3F; //重置所有中断
LPC_TIM0 ->MR0 =12000000-1; //计时计数器匹配值,不断进行比较,相等时可触发中断或计数器重置(MCR设置动作)
LPC_TIM0 ->MCR =0x3; //产生中断,并重置计数器
LPC_TIM0 ->CTCR=0; //选择计时模式
NVIC_EnableIRQ(TIMER0_IRQn); //打开NVIC中断
LPC_TIM0->TCR = 0x01; //启动定时器Time0
}
Hi, ZHR,
我看了你的代码, 我认为没有问题。请检查PCLKSEL寄存器,它不可为零。
其二,在debugger中,检查Timer Counter registers,看看它是否增加,及是否计数。
BR
XiangJun Rong
对PCLKSEL寄存器进行了配置,还是不能进入中断服务函数,在debugger中,检查Timer Counter registers,TC是在计数变化的。
又使用TIMER1中断,对定时器1按照相同的配置,也是进入不了TIMER1_IRQHandler,但是可以进入TIMER0_IRQHandler的函数!
是不是中断服务函数的地址有问题呢?
Hi,
你说Timer1可以进入Timer0的中断服务程序, 应该是中断地址有问题:
请参考以上表格,确定中断服务程序的地址是否正确
BR
XiangJun Rong
您好!
我查看了TIMER中断地址,是正确的。
现在还是不知道问题出在哪里,就是进不去中断服务函数,Timer1可以进入Timer0的中断服务程序
Hi,
Timer1可以进入Timer0的中断服务程序,一定是中断向量表错位了。
我贴上LPC40xx的向量表:
BR
XiangJunRong
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000800
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000100
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
Sign_Value EQU 0x5A5A5A5A
__Vectors
DCD __initial_sp ; 0 Top of Stack
DCD Reset_Handler ; 1 Reset Handler
DCD NMI_Handler ; 2 NMI Handler
DCD HardFault_Handler ; 3 Hard Fault Handler
DCD MemManage_Handler ; 4 MPU Fault Handler
DCD BusFault_Handler ; 5 Bus Fault Handler
DCD UsageFault_Handler ; 6 Usage Fault Handler
DCD Sign_Value ; 7 Reserved
DCD UnHandled_Vector ; 8 Reserved
DCD UnHandled_Vector ; 9 Reserved
DCD UnHandled_Vector ; 10 Reserved
DCD SVC_Handler ; 11 SVCall Handler
DCD DebugMon_Handler ; 12 Debug Monitor Handler
DCD UnHandled_Vector ; 13 Reserved
DCD PendSV_Handler ; 14 PendSV Handler
DCD SysTick_Handler ; 15 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 UnHandled_Vector ; 29 Reserved
DCD SSP0_IRQHandler ; 30 SSP0
DCD SSP1_IRQHandler ; 31 SSP1
DCD PLL0_IRQHandler ; 32 PLL0 Lock (Main PLL)
DCD RTC_IRQHandler ; 33 RTC
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 ETH_IRQHandler ; 44 Ethernet
DCD SDIO_IRQHandler ; 45 SD/MMC card I/F
DCD MCPWM_IRQHandler ; 46 Motor Control PWM
DCD QEI_IRQHandler ; 47 QEI
DCD PLL1_IRQHandler ; 48 PLL1 Lock (USB PLL)
DCD USBActivity_IRQHandler ; 49 USB Activity interrupt to wakeup
DCD CANActivity_IRQHandler ; 50 CAN Activity interrupt to wakeup
DCD UART4_IRQHandler ; 51 UART4
DCD SSP2_IRQHandler ; 52 SSP2
DCD LCD_IRQHandler ; 53 LCD
DCD GPIO_IRQHandler ; 54 GPIO
DCD PWM0_IRQHandler ; 55 PWM0
DCD EEPROM_IRQHandler ; 56 EEPROM
; IF :LNOT::DEF:NO_CRP
; AREA |.ARM.__at_0x02FC|, CODE, READONLY
;CRP_Key DCD 0xFFFFFFFF
; ENDIF
AREA |.text|, CODE, READONLY
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
UnHandled_Vector PROC
EXPORT UnHandled_Vector [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WDT_IRQHandler [WEAK]
EXPORT TIMER0_IRQHandler [WEAK]
EXPORT TIMER1_IRQHandler [WEAK]
EXPORT TIMER2_IRQHandler [WEAK]
EXPORT TIMER3_IRQHandler [WEAK]
EXPORT UART0_IRQHandler [WEAK]
EXPORT UART1_IRQHandler [WEAK]
EXPORT UART2_IRQHandler [WEAK]
EXPORT UART3_IRQHandler [WEAK]
EXPORT PWM1_IRQHandler [WEAK]
EXPORT I2C0_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT I2C2_IRQHandler [WEAK]
EXPORT SPI_IRQHandler [WEAK]
EXPORT SSP0_IRQHandler [WEAK]
EXPORT SSP1_IRQHandler [WEAK]
EXPORT PLL0_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT EINT0_IRQHandler [WEAK]
EXPORT EINT1_IRQHandler [WEAK]
EXPORT EINT2_IRQHandler [WEAK]
EXPORT EINT3_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT BOD_IRQHandler [WEAK]
EXPORT USB_IRQHandler [WEAK]
EXPORT CAN_IRQHandler [WEAK]
EXPORT DMA_IRQHandler [WEAK]
EXPORT I2S_IRQHandler [WEAK]
EXPORT ETH_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT MCPWM_IRQHandler [WEAK]
EXPORT QEI_IRQHandler [WEAK]
EXPORT PLL1_IRQHandler [WEAK]
EXPORT USBActivity_IRQHandler [WEAK]
EXPORT CANActivity_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT SSP2_IRQHandler [WEAK]
EXPORT LCD_IRQHandler [WEAK]
EXPORT GPIO_IRQHandler [WEAK]
EXPORT PWM0_IRQHandler [WEAK]
EXPORT EEPROM_IRQHandler [WEAK]
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
DMA_IRQHandler
I2S_IRQHandler
ETH_IRQHandler
SDIO_IRQHandler
MCPWM_IRQHandler
QEI_IRQHandler
PLL1_IRQHandler
USBActivity_IRQHandler
CANActivity_IRQHandler
UART4_IRQHandler
SSP2_IRQHandler
LCD_IRQHandler
GPIO_IRQHandler
PWM0_IRQHandler
EEPROM_IRQHandler
B .
ENDP
ALIGN
; User Initial Stack & Heap
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
您好!
向量表没有问题,还是不行。
TIMER1进入TIMER0中断服务函数不是因为计数到达匹配值产生的,而且在TIMER0中断服务函数中查看TIMER1的中断标志位是为一的,但就是进入不了TIMER1的中断服务函数。
这两天我又尝试了外部中断和GPIO中断,发现都进入不了中断服务函数。
Hi,
是不是你没有开中断, 试着用这个代码来开中断,看看行不行。
Software uses the CPSIE I and CPSID I instructions to enable and disable interrupts. The
CMSIS provides the following intrinsic functions for these instructions:
void __disable_irq(void) // Disable Interrupts
void __enable_irq(void) // Enable Interrupts
__asm("cpsie i");
Pls have a try
BR
XiangJun Rong
Hi,
BTW, you can check the PSR register in the ISR to know the interrupt vector number,then know the interrupt source.
BR
XiangJun Rong