
关于按钮,TI公司有现成例子,只需将例子pinInterrupt导入CCS即可,以下代码是我在pinInterrupt基础上稍做修改,去掉异常判断,使得看上去更简单、轻松些。

#include "Board.h"
/* Pin driver handles */
static PIN_Handle buttonPinHandle;
static PIN_Handle ledPinHandle;
/* Global memory storage for a PIN_Config table */
static PIN_State buttonPinState;
static PIN_State ledPinState;
PIN_Config ledPinTable[] = {
    Board_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW  | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    PIN_TERMINATE
};
/* 按钮中断被配置为下降沿触发,其实就是从高电平变为低电平的那一瞬间触发 */
PIN_Config buttonPinTable[] = {
    Board_BUTTON0  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    Board_BUTTON1  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    PIN_TERMINATE
};
 /*  ======== buttonCallbackFxn ========
 *  引脚中断回函数,准备用于buttonPinTable,如果把LED3和LED4都加入buttonPinTable,
 *  那么LED3和LED4都可以触发此中断回调函数
 */
void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId) {
    uint32_t currVal = 0;
    //按键消抖
    CPUdelay(8000*50);
    if (!PIN_getInputValue(pinId)) {
        /*切换LED亮灭状态*/
        switch (pinId) {
            case Board_BUTTON0:
                currVal =  PIN_getOutputValue(Board_LED0);
                PIN_setOutputValue(ledPinHandle, Board_LED0, !currVal);
                break;
            case Board_BUTTON1:
                currVal =  PIN_getOutputValue(Board_LED1);
                PIN_setOutputValue(ledPinHandle, Board_LED1, !currVal);
                break;
            default:
                /* Do nothing */
                break;
        }
    }
}
int main(void)
{
    Board_initGeneral();
    ledPinHandle = PIN_open(&ledPinState, ledPinTable);
    buttonPinHandle = PIN_open(&buttonPinState, buttonPinTable);
    /* 在按钮配置集中注册回调函数*/
    PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn);
    /* Start kernel. */
    BIOS_start();
    return (0);
}
运行程序,UP键控制LED4,DOWN键控制LED1,按下按键灯亮,再按,灯灭,如此反复。此程序主要演示了外部中断的使用方法。用起来还是很方便的,大至分三步走:
1.在配置表中配置中断
2.添加中断回调函数
3.在引脚配置集中注册回调函数
下面分析下关键代码:
PIN_Config buttonPinTable[] = {
    Board_BUTTON0  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    Board_BUTTON1  | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    PIN_TERMINATE
};
这里将按钮配置为输入状态,初始状态为高电平,按钮按下则导致引脚变为低电平,由于配置了下降沿中断,所以此时会触发中断,从而执行回调函数。
void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)
此句代码声明了回调函数,此函数原型可在PIN.h中找到,代码如下:
typedef void (*PIN_IntCb)(PIN_Handle handle, PIN_Id pinId);
所以在声明时必须参照此原型。
PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn);
这句代码演示了如何将回调函数注册进配置表
另外,CC2650中,所有GPIO都可以配置外部中断。
来源: abatei的博客