ISR 是中断服务程序(Interrupt Service Routine)的缩写。中断服务程序是在响应中断时执行的一段特定的程序代码。当嵌入式系统或计算机硬件检测到特定的事件(例如硬件中断、定时器溢出、外部设备触发等),它会中断当前正在执行的程序,转而执行与该中断相关的中断服务程序。
IRQHandler
是指中断请求处理程序(Interrupt Request Handler)的缩写。在嵌入式系统中,当一个外部事件(如硬件中断、定时器溢出等)发生时,中断请求被触发,系统会中断正在执行的程序,转而执行与该中断相关联的中断处理程序。
中断服务程序(ISR)和中断请求处理程序(IRQHandler)通常用来描述相同的概念,即处理中断事件的程序。
void CSI_IRQHandler(void)
{
CSI_DriverIRQHandler(); // 调用SDK自带的中断函数 这个函数最后会调用我们设置的回调函数
__DSB(); // 数据同步隔离
}
这段代码是一个中断服务程序(ISR)的实现,针对 CSI(Camera Serial Interface)模块。在这个 ISR 中,调用了 来处理 CSI 模块的中断,然后使用 指令进行数据同步。
每行代码的作用:
void CSI_IRQHandler(void)
这是一个中断服务程序(ISR)的定义,处理 CSI 模块的中断。ISR 是在中断触发时由系统调用的函数,用于处理特定中断事件。
CSI_DriverIRQHandler();
该行代码调用了 函数,这是一个由 SDK 或底层驱动提供的函数,用于处理 CSI 模块的中断。具体的操作和功能会依赖所使用的 SDK 或底层驱动。
__DSB();
这是一个数据同步障碍指令(Data Synchronization Barrier)。在 ARM Cortex-M 架构中, 用于确保在执行该指令之前的所有指令都已经完成,从而确保数据的同步。在中断服务程序中,这样的同步可能是为了确保对共享数据的正确操作。
这段代码是处理 CSI 模块中断的一部分。具体的操作和处理逻辑需要查看 函数的实现,以及与该中断相关的硬件和驱动程序的文档。
注:Camera Serial Interface(CSI)是一种用于连接图像传感器(摄像头)与图像处理器或其他设备的串行接口标准。它是一种专门用于传输图像和控制信号的接口,广泛应用于嵌入式系统、数字相机、手机和其他需要图像传感器的设备中。
void PIT_IRQHandler(void)
{
if(pit_flag_get(PIT_CH0))
{
pit_flag_clear(PIT_CH0);
}
if(pit_flag_get(PIT_CH1))
{
pit_flag_clear(PIT_CH1);
}
if(pit_flag_get(PIT_CH2))
{
pit_flag_clear(PIT_CH2);
}
if(pit_flag_get(PIT_CH3))
{
pit_flag_clear(PIT_CH3);
}
__DSB();
}
这是一个典型的中断服务程序(ISR)的示例,用于处理由四个不同的周期定时器(PIT_CH0、PIT_CH1、PIT_CH2、PIT_CH3)触发的中断事件。
以下是对这段代码的解释:
PIT_IRQHandler
是中断服务程序的函数名,用于处理周期定时器的中断事件。PIT_CH0
到 PIT_CH3
)进行检查:pit_flag_get
用于检查特定通道的中断标志是否被触发,如果被触发,则执行相应的处理。pit_flag_clear
用于清除相应通道的中断标志,以便下一次中断事件能够被正确检测。__DSB()
是数据同步屏障指令,确保在执行该指令之前的所有内存访问都已完成。这在某些情况下是必要的,以确保数据的一致性。总体而言,该中断服务程序用于处理四个周期定时器通道的中断事件,清除相应的中断标志,并使用数据同步屏障确保内存一致性。
注:PIT 是周期定时器(Periodic Interrupt Timer)的缩写,是一种常见于嵌入式系统和计算机体系结构中的定时器。其主要功能是产生定期的中断信号,以便系统可以在特定时间间隔内执行某些任务。
void LPUART1_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART1))
{
// 接收中断
#if DEBUG_UART_USE_INTERRUPT // 如果开启 debug 串口中断
debug_interrupr_handler(); // 调用 debug 串口接收处理函数 数据会被 debug 环形缓冲区读取
#endif // 如果修改了 DEBUG_UART_INDEX 那这段代码需要放到对应的串口中断去
}
LPUART_ClearStatusFlags(LPUART1, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART2_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART2))
{
// 接收中断
}
LPUART_ClearStatusFlags(LPUART2, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART3_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART3))
{
// 接收中断
}
LPUART_ClearStatusFlags(LPUART3, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART4_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART4))
{
// 接收中断
flexio_camera_uart_handler();
gps_uart_callback();
}
LPUART_ClearStatusFlags(LPUART4, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART5_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART5))
{
// 接收中断
camera_uart_handler();
}
LPUART_ClearStatusFlags(LPUART5, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART6_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART6))
{
// 接收中断
}
LPUART_ClearStatusFlags(LPUART6, kLPUART_RxOverrunFlag); // 不允许删除
}
void LPUART8_IRQHandler(void)
{
if(kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags(LPUART8))
{
// 接收中断
wireless_module_uart_handler();
}
LPUART_ClearStatusFlags(LPUART8, kLPUART_RxOverrunFlag); // 不允许删除
}
代码是多个 LPUART(低功耗通用异步接收器/发送器)外设的中断服务例程 (ISR)。当相应的 LPUART 模块中出现某些条件(例如接收数据)时,会触发这些 ISR。
以下是每个 ISR 的细分:
LPUART1_IRQHandler:
#if DEBUG_UART_USE_INTERRUPT
LPUART2_IRQHandler:
LPUART3_IRQHandler:
LPUART4_IRQHandler:
flexio_camera_uart_handler()
,调用gps_uart_callback()
LPUART5_IRQHandler:
camera_uart_handler()
LPUART6_IRQHandler:
LPUART8_IRQHandler:
wireless_module_uart_handler()
这些 ISR 旨在处理不同 LPUART 模块上的传入数据,并根据模块执行特定操作。条件编译 () 表示根据是否启用调试 UART 中断来有条件地编译某些功能。#if DEBUG_UART_USE_INTERRUPT
注:
LPUART(低功耗通用异步接收器/发射器)是一种用于微控制器和其他嵌入式系统的 UART(通用异步接收器/发射器)通信外设。UART 是一种流行的串行通信协议,允许设备之间的异步点对点通信。LPUART 是一种低功耗 UART 变体,通常用于微控制器中的串行通信。
void GPIO1_Combined_0_15_IRQHandler(void)
{
if(exti_flag_get(B0))
{
exti_flag_clear(B0);// 清除中断标志位
}
}
void GPIO1_Combined_16_31_IRQHandler(void)
{
wireless_module_spi_handler();
if(exti_flag_get(B16))
{
exti_flag_clear(B16); // 清除中断标志位
}
}
void GPIO2_Combined_0_15_IRQHandler(void)
{
flexio_camera_vsync_handler();
if(exti_flag_get(C0))
{
exti_flag_clear(C0);// 清除中断标志位
}
}
void GPIO2_Combined_16_31_IRQHandler(void)
{
// -----------------* ToF INT 更新中断 预置中断处理函数 *-----------------
tof_module_exti_handler();
// -----------------* ToF INT 更新中断 预置中断处理函数 *-----------------
if(exti_flag_get(C16))
{
exti_flag_clear(C16); // 清除中断标志位
}
}
void GPIO3_Combined_0_15_IRQHandler(void)
{
if(exti_flag_get(D4))
{
exti_flag_clear(D4);// 清除中断标志位
}
}
代码针对不同的 GPIO 中断进行了处理。这些函数主要包含了对外部中断标志位的检查和清除,以及一些特定模块的处理函数的调用。以下是对每个函数的简要说明:
GPIO1_Combined_0_15_IRQHandler:
GPIO1_Combined_16_31_IRQHandler:
wireless_module_spi_handler
GPIO2_Combined_0_15_IRQHandler:
flexio_camera_vsync_handler
GPIO2_Combined_16_31_IRQHandler:
tof_module_exti_handler
GPIO3_Combined_0_15_IRQHandler:
这些函数主要通过检查特定引脚的中断标志位来确定是否有中断发生,如果有,则执行相应的处理操作。同时,清除中断标志位是为了在处理完中断后通知系统该中断已被处理。