c - 使用 KEIL 4,lpc2148 中断或 IRQ 不会执行

标签 c arm

当定时器匹配MR0时,运行中断服务程序 在中断服务程序结束时。我不会从服务例程返回到主程序。为什么我的程序没有从服务例程返回?

完整代码请参阅下面的答案

最佳答案

 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;
}

关于c - 使用 KEIL 4,lpc2148 中断或 IRQ 不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34307729/

相关文章:

c++ - 自动删除不需要的#include 语句

c++ - 在 C/C++ 中高效地从结构化文件中读取数据

docker - 没有合适的节点 - 无法使用 docker 服务部署镜像

assembly - 有人能解释一下 LDRD ARM 指令是如何工作的吗?

assembly - 使用 ARM 汇编语言编写计算整数阶乘的程序

arm - 使用 ARM Neon 内在函数处理饱和整数乘法溢出的最有效方法是什么?

android - 为什么 gcc emmiting 代码与 ARM 指令集的 2 字节边界对齐?

objective-c - 动态库可以引用 Objective-C 对象并仍然被卸载吗?

c - 是否有检查名为 sptr 的 sockaddr* 是否指向 ipv4 或 ipv6 地址的函数?

c - Gcc:尝试执行 'cc1' 时出错:execvp:没有这样的文件或目录