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高优先级
中断嵌套成功。
下载连接:
uploadfile-/2007-3/320895654.rar