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实例程序
文章评论(0条评论)
登录后参与讨论