This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2650 GPIO 中断问题?

Other Parts Discussed in Thread: CC2650, SYSBIOS

最近学习CC2650,参考PIN.h中的事例,自己改写了一个按键输入中断任务,代码如下:

#include <string.h>
#include <xdc/std.h>

#include "ioservice.h"

#include <ti/sysbios/knl/Semaphore.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Queue.h> // Needed for util.h

#include "Board.h"
#include "peripheral.h"
#include "sensor.h"
#include "util.h"
#include <ti/drivers/pin/PINCC26xx.h>
#include <ti/drivers/PIN.h>

#include "Max_led.h"

// Max_led
#define Max_Led_Red    IOID_6
#define Max_Led_Green    IOID_7

// Max_Button
#define Max_BTN_1    IOID_13
#define Max_BTN_2    IOID_14

#define ST_TASK_PRIORITY                      1

/* -----------------------------------------------------------------------------
*                           Local variables
* ------------------------------------------------------------------------------
*/
static PIN_Config Max_Pin_led[] =
{
    Max_Led_Red | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,       /* Max_Led_Red */
    Max_Led_Green | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* Max_Led_Green */
    Max_BTN_1 | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS ,    /* Max_BTN_1 */
    Max_BTN_2 | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS ,    /* Max_BTN_2 */

    PIN_TERMINATE
};

// Pin configuration
static PIN_State Max_pinState;
static Task_Struct Max_taskStart;
uint8_t     Max_taskStartStack[512];

void Max_DoSomething();

void Max_Led_createTask(void)
{
 // Configure startup task
         Task_Params Max_taskParams;
         Task_Params_init(&Max_taskParams);
         Max_taskParams.stack = Max_taskStartStack;
        // taskParams.stackSize = ST_TASK_STACK_SIZE;
         Max_taskParams.stackSize = sizeof(Max_taskStartStack);
         Max_taskParams.priority = ST_TASK_PRIORITY;
         Task_construct(&Max_taskStart, Max_taskStartFxn, &Max_taskParams, NULL);
}

static void Max_taskStartFxn(UArg a0, UArg a1)
{
       // Get handle to this collection of pins
         if (!PIN_open(&Max_pinState, Max_Pin_led)) {
             // Handle allocation error
         }
          Max_DoSomething();
         // Before ending task, make sure to deallocate pins. They will return
         // to the default configurations provided in PIN_init()
         //PIN_close(&Max_pinState);
}


   //## Pin Interrupt ##
 /*  An example that handles pin inputs in the GPIO example above using PIN interrupts
 *  instead:*/
    // volatile variable used to communicate between callback and task
     static volatile int32_t moveDir = 0;    // <0: left, 0: stop, >0 right
 
     // Pin interrupt callback
     void Max_PinIntCb(PIN_Handle handle, PIN_Id pinId) {
         // Ignore pinId and read input from both buttons simultaneously
         uint32_t buttons = PIN_getPortInputValue(&Max_pinState);
         if (buttons&(1<<Max_BTN_1) == 0){     //红色标示的语句不知道是什么意思?可否请大牛帮忙介绍一下
             moveDir = 1;
         } else if (buttons&(1<<Max_BTN_2) == 0) {
              moveDir = 2;
         } else if (buttons&((1<<Max_BTN_1)|(1<<Max_BTN_2))) {
             moveDir = 0;
         }
     }
 
     void Max_DoSomething() {
         // Running lights on LEDs A-B-C (left to right). Button A causes left
         // movement, button B causes right movement, both simultaneously aborts
         // and disables LED output drivers
 
         // LED initial state (A off, B off, C on). Only our outputs are affected
         moveDir = 1;    // <0: left, 0: stop, >0 right
 
         // Setup pin interrupts and register callback
         PIN_registerIntCb(&Max_pinState, Max_PinIntCb);
         PIN_setInterrupt(&Max_pinState, Max_BTN_1 | PIN_IRQ_NEGEDGE);
         PIN_setInterrupt(&Max_pinState, Max_BTN_2 | PIN_IRQ_NEGEDGE);
 
         while (moveDir) {
             // Update LEDs
             if (moveDir==1) {
                 // Left movement
                // uint32_t t = PIN_getOutputValue(Max_Led_Red);
                 PIN_setOutputValue(&Max_pinState, Max_Led_Red, 1);
                 PIN_setOutputValue(&Max_pinState, Max_Led_Green, 0);
                 //PIN_setOutputValue(&Max_pinState, Max_Led_Red, t);
             } else {
                 // Right movement
                // uint32_t t = PIN_getOutputValue(Max_Led_Green);
                 PIN_setOutputValue(&Max_pinState, Max_Led_Green, 0);
                 PIN_setOutputValue(&Max_pinState, Max_Led_Red, 1);
                // PIN_setOutputValue(&Max_pinState, Max_Led_Green, t);
             }
 
             // Sleep for 3 ms (we will likely go into standby)
             Task_sleep(3000/10);
         }
         // Disable output enable for all pins (only our pins affected)
         PIN_setPortOutputEnable(&Max_pinState, 1);
         // Disable pin interrupts
         PIN_setInterrupt(&Max_pinState, Max_BTN_1 | PIN_IRQ_DIS);
         PIN_setInterrupt(&Max_pinState, Max_BTN_2 | PIN_IRQ_DIS);
     }

测试结果:不管按BTN_1或者BTN_2按键,moveDir 值始终为0,无法进入对应中断?

请大牛帮忙看下代码,指正问题所在,谢谢!