这是最新(主)开发分支的文档。如果您正在查找以前版本的文档,使用左侧的下拉菜单选择所需的版本。

IRQ

简介

IRQ(Interrupt Request)指来自设备的中断请求。驱动提供了一组用于管理硬件和软件中断的函数。该模块提供软硬件中断的注册以及注销接口,启用和禁用中断,并管理中断挂起状态。

功能列表

  1. 注册硬件中断向量——附加硬件中断向量并替换软件向量。

  2. 注销硬件中断向量——分离硬件中断向量。

  3. 注册软件中断向量——附加软件中断向量和回调函数。

  4. 注销软件中断向量——分离软件中断向量。

  5. 禁用并保存中断状态——禁用全局中断并保存之前的状态。

  6. 恢复中断状态——通过之前保存的状态启用全局中断。

  7. 启用中断——启用指定中断。

  8. 禁用中断——禁用指定中断。

  9. 设置中断挂起——设置指定中断为挂起状态。

  10. 清除中断挂起——清除指定中断的挂起状态。

  11. 设置唤醒中断——设置指定中断为唤醒中断。

功能概述

下图示例了中断向量表的管理

中断向量表示意图

在中断管理中,提供了一套软件中断的注册机制,原则上对于用户仅需要注册软件表即可,处于性能考虑,也提供了直接写硬件向量表的接口,需注意,当在同一中断向量上注册硬件中断和软件中断时,硬件中断的优先级较高,会覆盖对应的软件中断,导致软件中断失效。如果先注册了硬件中断,再注册软件中断时,软件中断则无法注册。

主要功能

注册硬件中断向量

调用函数 wm_drv_irq_attach_hw_vector() 注册硬件中断向量并替换软件向量。示例如下:

void irq_callback(void) {
}

wm_drv_irq_attach_hw_vector(WM_IRQ_I2C, irq_callback);

第一个参数是中断编号,W800芯片共有32个中断编号,每个中断编号对应W800芯片的一个中断源。类型为 wm_irq_no_t

第二个参数是中断回调函数,类型为 wm_drv_hw_irq_handle

注销硬件中断向量

调用函数 wm_drv_irq_detach_hw_vector() 分离硬件中断向量。示例如下:

wm_drv_irq_detach_hw_vector(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

注册软件中断向量

调用函数 wm_drv_irq_attach_sw_vector() 附加软件中断向量和回调函数。示例如下:

void irq_callback(void *arg) {
}

wm_drv_irq_attach_sw_vector(WM_IRQ_I2C, irq_callback, NULL);

第一个参数是中断编号,类型为 wm_irq_no_t

第二个参数是中断回调函数,类型为 wm_drv_sw_irq_handle

第三个参数是用户数据,类型为 void *

注销软件中断向量

调用函数 wm_drv_irq_detach_sw_vector() 分离软件中断向量。示例如下:

wm_drv_irq_detach_sw_vector(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

禁用并保存中断状态

调用函数 wm_drv_irq_save() 禁用中断并保存之前的状态。示例如下:

uint32_t irq_state;
irq_state = wm_drv_irq_save();

此函数返回之前的中断状态,类型为 uint32_t

恢复中断状态

调用函数 wm_drv_irq_restore() 通过之前保存的状态启用中断。示例如下:

uint32_t irq_state;
irq_state = wm_drv_irq_save();

wm_drv_irq_restore(irq_state);

其中, irq_state 用于保存中断状态,可以使用这个保存的状态来恢复中断状态。其参数是之前保存的中断状态,类型为 uint32_t

启用中断

调用函数 wm_drv_irq_enable() 启用指定中断。示例如下:

wm_drv_irq_enable(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

禁用中断

调用函数 wm_drv_irq_disable() 禁用指定中断。示例如下:

wm_drv_irq_disable(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

设置中断挂起

调用函数 wm_drv_irq_set_pending() 设置指定中断为挂起状态。示例如下:

wm_drv_irq_set_pending(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

清除中断挂起

调用函数 wm_drv_irq_clear_pending() 清除指定中断的挂起状态。示例如下:

wm_drv_irq_clear_pending(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

设置唤醒中断

调用函数 wm_drv_irq_set_wakeup() 设置指定中断为唤醒中断,当设备处于低功耗模式时,唤醒中断可以触发设备从低功耗模式恢复正常运行。示例如下:

wm_drv_irq_set_wakeup(WM_IRQ_I2C);

其参数是中断编号,类型为 wm_irq_no_t

API参考

查找IRQ相关API请参考:

IRQ API 参考