使用KEIL4时,lpc2148中断或IRQ不会执行
当定时器与MR0匹配时,在中断服务程序结束时运行中断服务程序。我不从服务程序返回主程序。为什么我的程序不能从服务例程返回使用KEIL4时,lpc2148中断或IRQ不会执行,c,arm,C,Arm,当定时器与MR0匹配时,在中断服务程序结束时运行中断服务程序。我不从服务程序返回主程序。为什么我的程序不能从服务例程返回 完整的代码请参见下面的答案您能详细说明吗?您必须展示您的努力,例如代码或其他东西,以使其更易于理解,以便人们更容易理解。您是否正在清除ISR中的中断请求标志?据我们所知,您的ISR可能是,而(1)。一个关于未指定代码的问题是无法回答的…不,请将其编辑到问题中!您需要将ISR定义为void timer\u ISR(void)\uu irq{…},否则,它只是一个普通函数,不会保
完整的代码请参见下面的答案您能详细说明吗?您必须展示您的努力,例如代码或其他东西,以使其更易于理解,以便人们更容易理解。您是否正在清除ISR中的中断请求标志?据我们所知,您的ISR可能是
,而(1)代码>。一个关于未指定代码的问题是无法回答的…不,请将其编辑到问题中!您需要将ISR定义为void timer\u ISR(void)\uu irq{…}
,否则,它只是一个普通函数,不会保存/恢复额外的中断上下文。@Craig Estey感谢…在定义类似于void timer\u ISR()\uu irq{}的函数之后,它就可以工作了。再次感谢大家。
the code is /* Timer.h */
#include "LPC214x.h"
#include "main.h"
#define VIC_EN 5
#define VIC_TIMER0 4
#define MR0 0
void timer_init(void);
void timer_isr(void);
/* Timer.c */
volatile uint8_t flag;
void timer_init()
{
//disable and reset timer counters
T0TCR = BV(1);
//use T0 as TIMER:
T0CTCR = 0x00;
//set prescalar
T0PR = 15000000-1;
//setup MR0 for 5 sec
T0MR0 = 4; //4+1
//enable intr on MR0, reset
T0MCR |= BV(0) | BV(1);
//enable T0 intr in VIC
VICVectAddr1 = (uint32_t)timer_isr;
VICVectCntl1 = BV(VIC_TIMER0) | VIC_EN;
VICIntSelect &= ~BV(VIC_TIMER0);
VICIntEnable |= BV(VIC_TIMER0);
//enable timer counter
T0TCR = BV(0);
}
void timer_isr()
{
flag=1;
//clear intr in TIMER regrs
T0IR |= BV(0);
//clear intr in VIC
VICVectAddr = 0x00000000;
}
/* Main.c*/
int main (void)
{
int cnt=0;
char str[32];
timer_init();
lcd_init();
lcd_putstring(LCD_LINE1," *TIMER* ");
_delay_ms(1000);
str_printf(str,"Count:%d",cnt);
//lcd_putstring(LCD_LINE2,str);
while(1)
{
while(flag==0);
flag = 0;
cnt++;
str_printf(str,"Count:%d",cnt);
lcd_putstring(LCD_LINE2,str);
}
return 0;
}