基本信息
文件名称:TI 系列:TM4C123 系列_(13).TM4C123中断系统.docx
文件大小:31.6 KB
总页数:46 页
更新时间:2025-06-13
总字数:约2.54万字
文档摘要

PAGE1

PAGE1

TM4C123中断系统

中断系统概述

中断系统是嵌入式系统中一个非常重要的组成部分,它允许处理器在执行当前任务时,临时中断当前任务去处理更高优先级的事件。处理完中断事件后,处理器会恢复到中断前的状态,继续执行原来的任务。中断系统提高了系统的响应速度和效率,使得处理器可以更好地处理外部事件和内部事件。

TM4C123系列单片机的中断系统基于ARMCortex-M4内核的嵌套向量中断控制器(NVIC),提供了丰富的中断资源和强大的中断管理能力。NVIC支持多达100个中断源,包括外部中断和内部中断,并且可以配置中断优先级和使能状态。

中断源

TM4C123系列单片机的中断源分为两类:外设中断和系统异常。外设中断是由片上外设(如定时器、GPIO、UART等)触发的,而系统异常是由处理器内部的事件(如复位、硬故障、系统服务调用等)触发的。

外设中断

GPIO中断:通用输入输出端口可以配置为中断输入,用于检测外部信号的变化。

定时器中断:定时器可以配置为在特定时间间隔或事件发生时触发中断。

UART中断:串行通信接口可以在接收或发送数据时触发中断。

I2C中断:I2C总线在数据传输过程中触发中断。

SPI中断:SPI总线在数据传输过程中触发中断。

ADC中断:模数转换器在完成转换后触发中断。

DMA中断:直接存储器访问控制器在数据传输完成后触发中断。

系统异常

复位:当系统复位时触发。

NMI:非屏蔽中断,通常用于处理严重的系统错误。

硬故障:当系统发生不可恢复的错误时触发。

内存管理故障:当访问非法内存地址时触发。

总线故障:当总线访问失败时触发。

使用故障:当执行非法指令时触发。

SVCall:系统服务调用中断,用于调用操作系统服务。

调试监视器:用于调试目的,当调试器触发时触发。

PendSV:挂起系统调用中断,用于任务调度。

系统节拍定时器:用于生成系统时钟中断,常用于操作系统的时间管理。

中断优先级

NVIC支持多达16个优先级等级,每个中断源都可以配置其优先级。优先级的配置通过NVIC的寄存器实现,具体包括:

优先级分组:NVIC支持优先级分组,允许将优先级分为预占优先级和响应优先级。优先级分组通过NVIC的AIRCR寄存器配置。

优先级配置:每个中断源的优先级通过NVIC的IPR寄存器配置。

优先级分组

优先级分组决定了预占优先级和响应优先级的位数分配。例如,可以选择4位用于预占优先级,0位用于响应优先级,或者3位用于预占优先级,1位用于响应优先级等。优先级分组的配置代码如下:

//配置优先级分组,选择4位预占优先级,0位响应优先级

NVIC-AIRCR=NVIC_AIRCR_VECTKEY_MASK|NVIC_AIRCR_PRIGROUP_4;

优先级配置

每个中断源的优先级可以通过IPR寄存器设置。例如,配置定时器0中断的优先级为2:

//配置定时器0中断的优先级为2

NVIC-IP[0]=(NVIC-IP[0]~NVIC_IPR0_IP0_M)|NVIC_IPR0_IP0(2);

中断使能和禁用

中断的使能和禁用通过NVIC的ISER(中断使能寄存器)和ICER(中断清除寄存器)实现。这些寄存器允许对每个中断源进行独立的使能和禁用操作。

使能中断

使能某个中断源的示例如下:

//使能定时器0中断

NVIC-ISER[0]=1(TIMER0_IRQn0x1F);

禁用中断

禁用某个中断源的示例如下:

//禁用定时器0中断

NVIC-ICER[0]=1(TIMER0_IRQn0x1F);

中断服务例程(ISR)

中断服务例程(ISR)是中断发生时处理器执行的代码段。每个中断源都有一个对应的中断向量表条目,通过该条目可以跳转到相应的ISR。ISR的编写需要注意以下几点:

声明为裸函数:使用naked属性声明ISR,以避免编译器生成额外的函数调用开销。

保存和恢复寄存器:在ISR中保存和恢复寄存器,以确保中断返回时不会影响主程序的执行。

编写中断服务例程

以下是一个简单的定时器0中断服务例程示例:

//定义定时器0中断服务例程

voidTIMER0_IRQHandler(void){

//保存寄存器

__asm(PUSH{r0-r3,lr});

//清除中断标志

HWREG(TIMER0_BASE+TIMER_O_ICR)=TIMER_ICR_TATOCINT;

//处理中断

//例如,增量计数器

staticuint32_tcount=0;

count++;

//恢复寄存器