如何在CC1310的GPIO中断中传递自定义参数?(TI SDK环境)
在TI CC1310 GPIO中断中传递自定义参数的实现方案
无需修改SDK的通用方案
由于TI SDK v4.20.XX中GPIO_CallbackFxn的定义仅传入引脚index(无自定义参数入口),无法像SPI那样通过SPI_Transaction.arg直接传递参数,但可以通过引脚索引与参数的映射表来实现,完全不需要修改SDK源码:
- 定义绑定引脚与自定义参数的结构体
#include <ti/drivers/GPIO.h> #include <ti/drivers/SPI.h> // 自定义参数结构体,可根据需求扩展字段 typedef struct { SPI_Handle spiHandle; // 可添加其他需要传递的参数,如状态标志、外设句柄等 } GPIO_CallbackArgs; // 静态全局映射表,按GPIO引脚index作为索引 static GPIO_CallbackArgs gpioArgsMap[GPIO_COUNT];
- 初始化时关联引脚与参数
在GPIO中断初始化代码中,将需要传递的SPI句柄(或其他参数)存入映射表对应索引的位置,再注册中断回调:
// 示例:绑定GPIO_PIN_2与SPI句柄mySpiHandle gpioArgsMap[GPIO_PIN_2].spiHandle = mySpiHandle; // 注册GPIO中断回调 GPIO_setCallback(GPIO_PIN_2, gpioInterruptCallback); GPIO_enableInt(GPIO_PIN_2);
- 在中断回调中获取参数
在GPIO中断回调函数内,通过传入的index从映射表中取出对应的自定义参数:
void gpioInterruptCallback(uint_least8_t index) { SPI_Handle targetSpiHandle = gpioArgsMap[index].spiHandle; // 此处可使用targetSpiHandle执行SPI操作,如启动传输、处理数据等 // SPI_transfer(targetSpiHandle, &transaction); }
可选优化(升级SDK后的方案)
如果可以升级到TI SDK v5.x及以上版本,部分GPIO驱动的GPIO_HwAttrsV2结构体新增了callbackArg字段,允许直接在初始化时传入自定义参数,无需额外维护映射表。例如:
// 初始化GPIO属性时指定回调参数 GPIO_HwAttrsV2 gpioAttrs = { .pinConfig = GPIO_CFG_INPUT | GPIO_CFG_INTR_FALLING, .callbackArg = mySpiHandle, // 直接传入SPI句柄 }; GPIO_Handle gpioHandle = GPIO_open(GPIO_PIN_2, &gpioAttrs); GPIO_setCallback(gpioHandle, gpioInterruptCallbackV2);
此时回调函数的定义也会对应调整(需使用支持参数的回调类型):
void gpioInterruptCallbackV2(GPIO_Handle handle, void *callbackArg) { SPI_Handle spiHandle = (SPI_Handle)callbackArg; // 使用spiHandle进行操作 }
不过该特性在SDK v4.20.XX中并不存在,因此映射表方案是当前版本下最可靠的实现方式。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

