TI-RTOS 之 GPIO中断(按键)

前面已经用过LED, 定时器,这次来了解GPIO的中断是怎么用的,从CC1310+TI-RTOS的例程可以直接找到相应的例子程序,它的关键是在于要使能中断,也就是在引脚配置时要选择方向为输入(PIN_INPUT_EN), 中断选项为(PIN_IRQ_NEGEDGE)下降沿有效。代码如下:

/*

* Application button pin configuration table:

*   - Buttons interrupts are configured to trigger on falling edge.

*/

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

};

在初始化之后,还要注册中断回调函数,应用TI-RTOS就不能再去写中断函数了,而使用回调函数,这个回调函数就相当于中断函数的一个子函数了。它的写法是:

/**************************************************************************************************

* @fn      buttonCallbackFxn

*

* @brief   按键中断的回调函数

*

* @param   PIN_Handle handle, PIN_Id pinId

*

* @return  void

**************************************************************************************************/

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)

{

uint_t ledState;

/* Debounce logic, only toggle if the button is still pushed (low) */

CPUdelay(8000*50);

// 延时之后再次读 IO, 仍然为低则按键有效

if (!PIN_getInputValue(pinId))

{

// 不同的按键控制不同的灯

if ( pinId == Board_BUTTON0 )

{

ledState = PIN_getOutputValue(Board_LED0);

PIN_setOutputValue(ledPinHandle, Board_LED0, !ledState);

}

else if ( pinId == Board_BUTTON1 )

{

ledState = PIN_getOutputValue(Board_LED1);

PIN_setOutputValue(ledPinHandle, Board_LED1, !ledState);

}

}

}

这里将按键的触发和执行都写在回调函数了,看起来比较简单些,在实际应用中,可能是得到按键键值并传递到应用的任务或者菜单任务。

最后是演示任务的整体代码:

/**************************************************************************************************

Filename:       keyDemo.c

Editor:         Tome @ newbit

Revised:        $Date: 2016-8-10 11:20:02 +0800  $

Revision:       $Revision: 00001 $

Description:    了解 TI-RTOS的使用之,IO中断【按键】

History:

Notes:          要了解到这部分的接口,可阅读TI文档

1. TI-RTOS 2.20  User's Guide.pdf

2. Bios User Guide.pdf

硬件平台  CC1130_LAUNCHPAD Rev1.3

**************************************************************************************************/

/**************************************************************************************************

// INCLUDES

**************************************************************************************************/

/* XDCtools Header files */

#include <xdc/std.h>

#include <xdc/runtime/System.h>

/* BIOS Header files */

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>

/* TI-RTOS Header files */

#include <ti/drivers/PIN.h>

#include "Board.h"

/**************************************************************************************************

// TYPEDEF

**************************************************************************************************/

/**************************************************************************************************

// CONSTANTS

**************************************************************************************************/

#define TASKSTACKSIZE     768

/**************************************************************************************************

// LOCAL VERIABLE

**************************************************************************************************/

Task_Struct keyTaskStruct;

Char keyTaskStack[TASKSTACKSIZE];               // 本任务的栈空间,静态分配

/* Global memory storage for a PIN_Config table */

static PIN_State ledPinState;

static PIN_State buttonPinState;

PIN_Handle ledPinHandle;

PIN_Handle buttonPinHandle;

/*

* Initial LED pin configuration table

*   - LEDs Board_LED0 is on.

*   - LEDs Board_LED1 is off.

*/

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

};

/*

* Application button pin configuration table:

*   - Buttons interrupts are configured to trigger on falling edge.

*/

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

};

/**************************************************************************************************

// FUNCTIONS DECLERATION

**************************************************************************************************/

Void keyFxn(UArg arg0, UArg arg1);

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId);

/**************************************************************************************************

// FUNCTIONS

**************************************************************************************************/

/**************************************************************************************************

* @fn      keyTaskAdd

*

* @brief

*

* @param   void

*

* @return  void

**************************************************************************************************/

void keyTaskAdd(void)

{

Task_Params taskParams;

/* Construct BIOS objects */

Task_Params_init(&taskParams); // 创建任务所要的参数,都设置为默认值

taskParams.stackSize = TASKSTACKSIZE; // 栈空间

taskParams.stack = &keyTaskStack;     // 栈地址

// 向bios 传递参数,建立控制灯的任务

Task_construct(&keyTaskStruct, (Task_FuncPtr)keyFxn, &taskParams, NULL);

}

/*

*  ======== keyFxn ========

*  Task for this function is created statically. See keyTaskAdd().

*/

Void keyFxn(UArg arg0, UArg arg1)

{

// 这里不是为了初始化,而是为了拿到操作的句柄 (handle)

// 函数说明:Allocate one or more pins for a driver or an application.

ledPinHandle = PIN_open(&ledPinState, ledPinTable);

if(!ledPinHandle) {

System_abort("Error initializing board LED pins\n");

}

// 得到按键IO的操作句柄

buttonPinHandle = PIN_open(&buttonPinState, buttonPinTable);

if(!buttonPinHandle) {

System_abort("Error initializing button pins\n");

}

/* Setup callback for button pins */

// 注册按键的中断回调函数

if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn) != 0) {

System_abort("Error registering button callback function");

}

//任务只有休眠

while(1)

{

// 任务休眠 1 秒,  1000000us, 下面函数的单位是10us

Task_sleep(100000);

}

}

/**************************************************************************************************

* @fn      buttonCallbackFxn

*

* @brief   按键中断的回调函数

*

* @param   PIN_Handle handle, PIN_Id pinId

*

* @return  void

**************************************************************************************************/

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)

{

uint_t ledState;

/* Debounce logic, only toggle if the button is still pushed (low) */

CPUdelay(8000*50);

// 延时之后再次读 IO, 仍然为低则按键有效

if (!PIN_getInputValue(pinId))

{

// 不同的按键控制不同的灯

if ( pinId == Board_BUTTON0 )

{

ledState = PIN_getOutputValue(Board_LED0);

PIN_setOutputValue(ledPinHandle, Board_LED0, !ledState);

}

else if ( pinId == Board_BUTTON1 )

{

ledState = PIN_getOutputValue(Board_LED1);

PIN_setOutputValue(ledPinHandle, Board_LED1, !ledState);

}

}

}

/**************************************************************************************************

Copyright 2016 Newbit Studio. All rights reserved.

**************************************************************************************************/

TI-RTOS 之 GPIO中断(按键)的更多相关文章

  1. MSP430 G2553 LaunchPad GPIO中断

    P1.P2端口上的每个管脚都支持外部中断.P1端口的所有管脚都对应同一个中断向量(Interrupt Vector),类似的,P2端口的所有管脚都对应另一个中断向量:通过PxIFG寄存器来判断中断来源 ...

  2. 在xilinxFPGA上使用microblaze及自写GPIO中断

    很久很久没有更新过博客了,今天来扒一扒FPGA上CPU软核的使用. 主要完成的功能:使用的开发板是nexys 4 DDR,板上有16个switch以及16个LED,需要完成microblaze对led ...

  3. LPC1788的外部中断和GPIO中断

    首先是gpio中断,这一点和1768不同,1768使用的中断时和eint3共用中断通道,到了1788,专门为gpio开辟了中断 #ifndef __JOYPAD_H_ #define __JOYPAD ...

  4. LPC1768外部中断与GPIO中断

    LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...

  5. 8.中断按键驱动程序之poll机制

    本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...

  6. esp8266 SDK开发之GPIO中断

    先秀一下自己焊的板子,黑的开关用于复位,蓝的开关用于烧录程序. 首先要明确的是esp8622的大多数管脚都有多个功能, 比如可以用来当做GPIO管脚,还可以用来当做SPI管脚. 如下图所示 使用PIN ...

  7. 8.中断按键驱动程序之poll机制(详解)

    本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢.之前的测试程序是这样: ) { read(fd, &key_val, ); printf(" ...

  8. 第12章 GPIO输入—按键检测

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  9. 第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列

    第12章     GPIO输入—按键检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

随机推荐

  1. bzoj 3551: [ONTAK2010]Peaks加强版

    Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个数,第i个数为h_i 接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径. 接下来 ...

  2. 为什么要学ADO.NET。。。什么是ADO.NET。。。

    之前学的 •只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据.   •ADO.NET就是一组类库,这组类 ...

  3. MySQL 字符集问题及安全的更新操作

    一.字符集乱码 1.操作系统字符集 [root@mysql5 ~]# cat /etc/system-release /etc/sysconfig/i18n CentOS release 6.5 (F ...

  4. NumPy学习笔记 一

    NumPy学习笔记 一 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  5. 初学者福音——10个最佳APP开发入门在线学习网站

    根据Payscale的调查显示,现在的APP开发人员的年薪达到:$66,851.这也是为什么那么多初学的开发都想跻身到APP开发这行业的主要原因之一.每当你打开App Store时候,看着琳琅满目的A ...

  6. 使用line-height来垂直居中在安卓设备并不居中,利用ji调整

    先判断智能机浏览器的版本信息:方法有两种,但是第一种兼容性更好,但是使用了device插件 第一种: if (device.android()){ } 第二种: var ua = navigator. ...

  7. DBA 优化法则

    硬件资源是根本,DBA是为了充分利用硬件资源:(更新中--) 统一SQL语句: 减少SQL嵌套: 执行计划返回结果集(决定计划走向): 合理使用临时表: tempdb分多文件: OLTP 条件使用变量 ...

  8. js 类数组arguments详解

    arguments并不是一个真正的数组,而是一个"类似数组(array-like)"的对象: 就像下面的这段输出,就是典型的类数组对象: [, , callee: ƒ, Symbo ...

  9. appium-chromedriver@3.0.1 npm ERR! code ELIFECYCLE npm ERR! errno 1

    解决方法: npm install appium-chromedriver@3.0.1 --ignore-scripts 或者(安装方法): npm install appium-chromedriv ...

  10. hook键盘驱动中的分发函数实现键盘输入数据的拦截

    我自己在看<寒江独钓>这本书的时候,书中除了给出了利用过滤的方式来拦截键盘数据之外,也提到了另外一种方法,就是hook键盘分发函数,将它替换成我们自己的,然后再自己的分发函数中获取这个数据 ...