老树的窝 https://passport2.21ic.com/?439835 [收藏] [复制] [RSS] dp开发,xc167,arm开发  邮件:tipse@sohu.com  alin_99@sohu.com   qq:278338897

日志

keil开发环境下实现中断嵌套例程(lpc2142)

已有 3316 次阅读2007-3-20 09:29 |个人分类:ARM7|系统分类:ARM| arm7, keil, 嵌套, lpc214x, 中断

arm7内核的cpu不直接支持中断嵌套,不同的编译器实现中断嵌套都是通过增加保护代码来实现的,建议中断函数写得短小精悍,keil环境下使通过嵌入asm宏代码实现的,如下:

// Macros for Interrupt Nesting
#define IENABLE                      /* Nested Interrupts Entry */   \
  __asm { MRS     LR, SPSR      }    /* Copy SPSR_irq to LR     */   \
  __asm { STMFD   SP!, {LR}     }    /* Save SPSR_irq           */   \
  __asm { MSR     CPSR_c, #0x1F }    /* Enable IRQ (Sys Mode)   */   \
  __asm { STMFD   SP!, {LR}     }    /* Save LR                 */   \

#define IDISABLE                      /* Nested Interrupts Exit */   \
  __asm { LDMFD   SP!, {LR}     }     /* Restore LR              */   \
  __asm { MSR     CPSR_c, #0x92 }     /* Disable IRQ (IRQ Mode)  */   \
  __asm { LDMFD   SP!, {LR}     }     /* Restore SPSR_irq to LR  */   \
  __asm { MSR     SPSR_cxsf, LR }     /* Copy LR to SPSR_irq     */   \

本人做了一个例子,硬件平台是mcu123.com出品的lpc214x开发板,软件环境是keil,

例程说明:

1 用按钮int进行外部中断1测试,低优先级,低电平中断;
每进去一次改变beep响和不响,直到int1引脚变为高电平才退出中断,beep标志是否进入了exint1中断服务程序


2 用rtc秒增量实现rtc中断,高优先级,实现刷新lcd显示最新得rtc时间(不显示日期)



上电时间显示正常,  按下int按钮让cpu进入外部中断,观察lcd显示时间是不是每秒都刷新,如果刷新说明rtc高优先级
中断嵌套成功。

 

老树  2007-3-19
tipse@shou.com

下载连接:

 

 
uploadfile-/2007-3/320895654.rar

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 zz 2008-8-22 17:39
#define IENABLE /* Nested Interrupts Entry */ \ __asm { MRS LR, SPSR } /* Copy SPSR_irq to LR */ \ __asm { STMFD SP!, {LR} } /* Save SPSR_irq */ \ __asm { MSR CPSR_c, #0x1F } /* Enable IRQ (Sys Mode) */ \ __asm { STMFD SP!, {LR} } /* Save LR */ \ #define IDISABLE /* Nested Interrupts Exit */ \ __asm { LDMFD SP!, {LR} } /* Restore LR */ \ __asm { MSR CPSR_c, #0x92 } /* Disable IRQ (IRQ Mode) */ \ __asm { LDMFD SP!, {LR} } /* Restore SPSR_irq to LR */ \ __asm { MSR SPSR_cxsf, LR } /* Copy LR to SPSR_irq */ \ 这段代码编译不过, mainloop.c(129): error: #20: identifier "LR" is undefined mainloop.c(129): error: #20: identifier "SP" is undefined mainloop.c(129): error: #20: identifier "LR" is undefined