乐鑫技术交流
直播中

张龙祥

8年用户 1269经验值
擅长:连接器
私信 关注
[问答]

RTOS_SDK-1.4.2版本下GPIO中断服务程序不工作是怎么回事?


LOCAL void gpio_int_handler(void)
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
    //ETS_GPIO_INTR_DISABLE();
    ETS_INTR_LOCK();
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
    //GPIO_OUTPUT(GPIO_Pin_4,1);
    if (gpio_status & BIT(GPIO_ID_PIN(12)))
    {
        if( GPIO_ID_PIN(12) )
        {
            printf("yes----------------n");
            GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1);
        }
        else
        {
            printf("no-----------------n");
        }
    }
    //ETS_GPIO_INTR_ENABLE();
    ETS_INTR_UNLOCK();
}

void user_init(void)
{
    printf("SDK version:%sn", system_get_sdk_version());
    GPIO_ConfigTypeDef gpio_conf4;
    gpio_conf4.GPIO_Pin = GPIO_Pin_4;
    gpio_conf4.GPIO_Mode = GPIO_Mode_Output;
    gpio_conf4.GPIO_Pullup = GPIO_PullUp_EN;
    gpio_conf4.GPIO_IntrType = GPIO_PIN_INTR_DISABLE;
    gpio_config(&gpio_conf4);
    GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1);

    GPIO_ConfigTypeDef gpio_conf12;
    ETS_INTR_LOCK();
    gpio_conf12.GPIO_Pin = GPIO_Pin_12;
    gpio_conf12.GPIO_Mode = GPIO_Mode_Input;
    gpio_conf12.GPIO_Pullup = GPIO_PullUp_DIS;
    gpio_conf12.GPIO_IntrType = GPIO_PIN_INTR_POSEDGE;
    gpio_intr_handler_register(gpio_int_handler,NULL);
    gpio_config(&gpio_conf12);
    ETS_INTR_UNLOCK();
    GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0);
    while(1);
}

回帖(1)

siyugege

2024-7-12 17:52:57
根据您提供的代码片段和问题描述,RTOS_SDK-1.4.2版本下GPIO中断服务程序不工作可能有以下几个原因:

1. **中断使能未设置**:确保在初始化GPIO时,已经正确设置了中断使能。例如,使用`GPIO_PIN_INT_TYPE_SET(GPIO_PIN_SOURCE, GPIO_PIN_INTR_ANYEDGE)`来设置中断类型,并使用`GPIO.pin[GPIO_PIN_SOURCE].int_type = GPIO_PIN_INTR_ANYEDGE;`来启用中断。

2. **中断服务程序注册问题**:确保您已经正确注册了中断服务程序。例如,使用`xt_set_interrupt_handler(ETS_GPIO_INTR_SOURCE, gpio_int_handler, NULL);`来注册中断服务程序。

3. **中断锁的使用**:您的代码中使用了`ETS_INTR_LOCK()`和`ETS_INTR_UNLOCK()`,这是正确的。但是,请确保在处理中断时不要长时间占用中断锁,否则可能会影响其他中断的处理。

4. **中断状态清除**:您的代码中使用了`GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);`来清除中断状态。这是正确的,但请确保这个操作在中断处理过程中是有效的。

5. **中断触发条件**:您的代码中使用了`if (gpio_status & BIT(GPIO_ID_PIN(12)))`来判断是否是GPIO12的中断。请确保GPIO12的配置和触发条件与您的预期一致。

6. **硬件问题**:如果以上软件层面的检查都没有问题,那么可能需要检查硬件连接是否正确,GPIO12是否被正确地连接到了中断源。

7. **RTOS配置问题**:由于您使用的是RTOS,需要确保RTOS的中断管理机制没有影响到GPIO中断的正常工作。检查RTOS的相关配置,确保中断优先级、中断服务程序调度等设置正确。

8. **编译和链接问题**:检查您的项目是否正确编译和链接了中断服务程序的代码。有时候,编译器优化或链接错误可能导致中断服务程序没有被正确调用。

9. **调试和日志**:增加更多的调试信息和日志输出,可以帮助您更准确地定位问题。例如,在中断服务程序的不同位置添加打印语句,观察中断是否被正确触发。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分