📜  嵌入式系统-中断(1)

📅  最后修改于: 2023-12-03 14:53:57.928000             🧑  作者: Mango

嵌入式系统中断

什么是中断?

中断是一种计算机硬件和软件协作的机制,允许计算机在执行过程中暂停当前任务并处理外部事件。当中断事件发生时,CPU会暂停当前指令并响应中断请求,执行相应的中断服务程序,处理完毕后再回到原来的程序继续执行。

在嵌入式系统中,中断用于处理来自外部设备的事件,例如按键、定时器、串口等。使用中断机制可以提高系统的反应速度,避免在等待外部事件发生时浪费CPU资源。

中断的分类

针对不同的中断源,中断可以分为外部中断和内部中断两种。

外部中断

外部中断也称为硬件中断,是指由系统外部的事件或设备发出的中断请求。例如,按键、定时器、ADC转换等都可以作为外部中断源。当发生某个事件时,系统会向CPU发出中断请求,CPU暂停当前任务,转而执行中断服务程序。

内部中断

内部中断也称为软件中断,是指由CPU内部产生的中断。例如,除零、未定义指令、调试中断等都是内部中断。这类中断通常是由异常情况引起的,需要CPU立即响应并处理。

中断的优先级

由于嵌入式系统中可能同时存在多个中断源,因此需要对中断进行优先级处理。具体来说,当多个中断同时请求处理时,系统会按照中断的优先级依次处理。在处理高优先级中断时,低优先级的中断会被暂停,等待高优先级中断处理完毕后再继续处理下一个中断。

数值越低的中断优先级越高,因此通常会为每个中断源指定一个唯一的优先级。

中断服务程序

中断服务程序是指处理中断的过程,包含了中断的响应、处理和返回三个步骤。

中断响应

当中断事件发生时,系统会向CPU发送中断请求。CPU接收到请求后会立即中断原来的程序,转而执行相应的中断服务程序。中断响应过程的关键是保存现场,将当前的寄存器等状态保存到指定的位置。

中断处理

中断处理是指执行中断服务程序的过程,这个过程中主要是对触发中断的事件进行处理。处理完毕后,可以修改相应的状态,例如清除中断标志位、更新定时器计数器等。

中断返回

中断返回是指将CPU状态恢复到中断前的状态,继续执行中断之前的程序。此时需要将中断服务程序中保存的现场数据还原,然后使用返回指令恢复之前的程序和状态。

中断编程

在嵌入式系统中,中断编程是一个相对复杂的过程。需要针对具体的中断源进行配置,并编写相应的中断服务程序。下面是一个STM32中断编程的示例代码:

// 配置外部中断
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* GPIO信号源初始化 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //使用PC0端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* 中断线初始化 */
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //PC0对应的外部中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
EXTI_Init(&EXTI_InitStructure);

/* 中断服务程序 */
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        /* 处理外部中断事件 */
        GPIO_ToggleBits(GPIOA, GPIO_Pin_5);   //使对应LED翻转
        EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位
    }    
}

上述代码中通过配置外部中断线和GPIO信号源,实现了对PC0端口下降沿的外部中断检测。当检测到外部中断事件时,会执行相应的中断服务程序。在服务程序中可以进行事件处理等操作,并清除中断标志位,以备下一次中断发生。