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. 大赛获奖选手专访 | 冷燕冰:最佳设计奖TIMING里的时机和时序

    Mockplus三周年原型设计大赛,从筹备到11月21日完美落幕,50余天的时光,已成为过去.这场近千人参赛的原型设计大赛,我想,无论是于主办方,于参赛选手,于专家评委,还是于每一个关注和参与的人,都 ...

  2. nginx php上传配置

    .file_uploads 设为On,允许通过HTTP上传文件 2.upload_tmp_dir 文件上传至服务器时用于临时存储的目录,如果没指定,系统会使用默认的临时文件夹(我的机器是/tmp). ...

  3. 为什么硬链接不能链接目录、文件inode 和目录 dentry 的区别联系

    我们对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定 ...

  4. C#的发展已经15年了 。。。历史发展

    C#是微软公司在2000年6月发布的一种新的编程语言,主要由安德斯·海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言,其源码会编译成msil再运行.它借鉴了Delp ...

  5. 连接虚拟机mysql无法访问,报错编号1130的解决方法

    新装一台虚拟机mysql的时候,往往会出现win无法连接的情况,报错信息1130,是因为没有权限的问题,解决方案如下: mysql -u root -p mysql>use mysql; mys ...

  6. xlwt 官网的例子

    from time import * from xlwt.Workbook import * from xlwt.Style import * style = XFStyle() wb = Workb ...

  7. 安装MySQL时提示3306端口已被占用的解决方案

    之前安装过mysql,用的好好的,但是今天开启服务时报异常,无法启动.为省事,于是想到卸载重装,安装过程中发现3306已经被占用,这也是一开始服务无法启动的原因. 看到有人说用fport查看端口号,于 ...

  8. 快速开发 jQuery 插件的 10 大技巧

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...

  9. Django ORM详解

    ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...

  10. Jupyter Notebook使用小技巧

    在 C:\Windows\Fonts目录下找到Mircosoft YaHei UI字体,然后复制到[你的Python安装路径]/Lib/site-packages/matplotlib/mpl-dat ...