PAGE1
PAGE1
16.LPC1700系列中断系统
16.1中断系统概述
中断系统是嵌入式系统中一个非常重要的组成部分,它允许处理器在执行当前任务时,能够响应外部或内部事件,从而提高系统的响应速度和效率。LPC1700系列基于Cortex-M3内核,其中断系统支持多种中断源,并且具有强大的中断处理能力。
16.1.1中断源
LPC1700系列支持多种中断源,包括但不限于:
外部中断(ExternalInterrupts)
定时器中断(TimerInterrupts)
UART中断(UARTInterrupts)
ADC中断(ADCInterrupts)
I2C中断(I2CInterrupts)
SPI中断(SPIInterrupts)
DMA中断(DMAInterrupts)
每个中断源都有对应的中断请求线(IRQ),这些请求线可以通过中断控制器进行管理和优先级设置。
16.1.2中断控制器
LPC1700系列使用了一个嵌套向量中断控制器(NVIC),该控制器负责管理中断的优先级、使能和屏蔽。NVIC支持多个中断源,并且可以配置各个中断的优先级,从而确保高优先级的中断能够优先被处理。
16.2中断优先级和分组
16.2.1中断优先级
LPC1700系列的NVIC支持16个优先级级别,优先级编号从0到15,其中0为最高优先级,15为最低优先级。每个中断源都可以配置其优先级,以便在多个中断同时发生时,处理器能够按照优先级顺序进行处理。
16.2.2中断分组
Cortex-M3内核的NVIC支持中断分组,即将中断优先级分为抢占优先级和子优先级。LPC1700系列的NVIC支持4位的中断优先级设置,可以通过编程来配置分组方式。例如,可以将4位优先级分为2位抢占优先级和2位子优先级,或者1位抢占优先级和3位子优先级。
16.2.2.1配置中断分组
配置中断分组可以通过NVIC的NVIC_IPR寄存器进行。以下是一个示例代码,展示了如何配置中断分组:
//配置中断分组
voidconfigure_interrupt_grouping(uint8_tgroup,uint8_tsub){
//计算分组配置值
uint32_tgrouping=(group4)|sub;
//设置分组配置
NVIC_SetPriorityGrouping(grouping);
}
//示例:配置2位抢占优先级和2位子优先级
configure_interrupt_grouping(2,2);
16.2.3设置中断优先级
设置中断优先级可以通过NVIC的NVIC_IPRn寄存器进行。以下是一个示例代码,展示了如何设置定时器0的中断优先级:
//设置定时器0的中断优先级
voidset_timer0_priority(uint8_tpriority){
//设置定时器0的中断优先级
NVIC_SetPriority(TIMER0_IRQn,priority);
}
//示例:设置定时器0的优先级为5
set_timer0_priority(5);
16.3中断使能和屏蔽
16.3.1使能中断
使能中断可以让处理器响应特定的中断请求。LPC1700系列的NVIC提供了使能中断的功能。以下是一个示例代码,展示了如何使能定时器0的中断:
//使能定时器0中断
voidenable_timer0_interrupt(void){
//使能定时器0中断
NVIC_EnableIRQ(TIMER0_IRQn);
}
//示例:使能定时器0中断
enable_timer0_interrupt();
16.3.2屏蔽中断
屏蔽中断可以暂时禁止处理器响应特定的中断请求。LPC1700系列的NVIC提供了屏蔽中断的功能。以下是一个示例代码,展示了如何屏蔽定时器0的中断:
//屏蔽定时器0中断
voiddisable_timer0_interrupt(void){
//屏蔽定时器0中断
NVIC_DisableIRQ(TIMER0_IRQn);
}
//示例:屏蔽定时器0中断
disable_timer0_interrupt();
16.4中断服务例程(ISR)
16.4.1中断服务例程的定义
中断服务例程(ISR)是在中断发生时由处理器自动调用的函数。每个中断源都有对应的ISR,通过在启动文件中定义中断向量表,可以指定每个中断的ISR。
16.4.1.1定义中断服务例程
以下是一个示例代码,展示了如何