热度 24
2012-8-13 21:17
2327 次阅读|
0 个评论
3. 向量非向量IRQ实例程序 /**************************************************************************** * 文件名:main.c * 功 能:有四个中断,UART0,UART1,I2C,SPI0,其中 * UART0,SPI0分配为向量IRQ * UART1,I2C分配为非向量IRQ * 说 明: ****************************************************************************/ #include "config.h" #define UART1_IRQ 1 7 #define I2C_IRQ 1 9 /**************************************************************************** * 功 能:中断服务程序。 ****************************************************************************/ void __irq IRQ_SPI0(void) { 代码略 } void __irq IRQ_UART0(void) { 代码略 } void __irq NoVector_ISR(void) { volatile uint32 tmp; tmp = VICIRQStatus; if( tmp UART1_IRQ) { UART1中断处理代码略 } if( tmp I2C_IRQ) { I2C中断处理代码略 } VICVectAddr = 0; // 向量中断结束 } /**************************************************************************** 【By 下家山 Q群 75303301 上海松江文汇路928号258室 松江大学城 上海索漫科技 http://www.xiajiashan.com 专注嵌入式(ARM7,Cortex-M0,Cortex-M3,ARM9,linux)培训】 ****************************************************************************/ int main(void) { PINSEL0 = 0x55555555; // 配置管脚功能 /*I2C,SPI0,UART0,UART1相关初始化代码部分略 */ /* 中断部分设置*/ VICIntSelect = 0x00000000; // 所有中断通道设置为IRQ中断 VICDefVectAddr = (uint32)NoVector_ISR; // 设置非向量中断服务程序地址向量 VICVectAddr0 = (uint32)IRQ_UART0; // 设置uart0中断服务程序地址向量 VICVectAddr1 = (uint32)IRQ_SPI0; // 设置spi0中断服务程序地址向量 VICVectCntl0 = 0x00000026; // 6号中断源使能为向量IRQ并设置为最高优先级 VICVectCntl1 = 0x0000002A; // 10号中断源使能为向量IRQ并设置为次高优先级 VICIntEnable = 0x000006C0; /* 使能UART0,UART1,I2C,SPI0=bit10,bit9,bit7和bit6=1*/ while(1) // 等待中断发生 { 代码略 } return(0); } 本文的一些截图来自philips lpc2136英文datasheet. 写于上海松江 下家山 有什么问题可与我联系:1209050967 上海索漫提供 http://www.xiajiashan.com IRQ中断实例分析(一):向量IRQ实例程序 IRQ中断实例分析(二):非向量IRQ实例程序 IRQ中断实例分析(三):向量非向量IRQ实例程序