前言
gpiointerrupt例程使用2个按键控制2个LED灯的点亮。使用的外设如下:
- Board_GPIO_LED0
- Board_GPIO_LED1
- Board_GPIO_BUTTON0- 切换Board_GPIO_LED0
- Board_GPIO_BUTTON1- 切换Board_GPIO_LED1
LED和BUTTON对应的芯片引脚如下:
LED0 | LED1 | BUTTON0 | BUTTON1 |
---|---|---|---|
DIO6 | DIO7 | DIO13 | DIO14 |
一、导入gpiointerrupt工程
点击CCS菜单“Project”-"import CCS Project ",在弹出的对话框中点击“Browse”选择gpiointerrupt 例程所在目录:“SDK安装目录\examples\rtos\CC2640R2_LAUNCHXL\drivers\gpiointerrupt”
导入gpiointerrupt工程成功后的界面
二、主要文件功能
- CC2640R2_LAUNCHXL.h
CC2640R2_LAUNCHXL板头文件,定义了板级资源和功能函数。 - CC2640R2_LAUNCHXL.c
CC2640R2_LAUNCHXL板的所有外设功能都在此文件中实现,包括GPIO、ADC等。 - Board.h
此文件将CC2640R2_LAUNCHXL.h定义的板级资源重新定义,方便将TIRTOS移植到其他类型的板。 - gpiointerrupt.c
获取按键BUTTON0、BUTTON1的状态,控制LED0、LED1的亮灭。 - main_tirtos.c
项目的主程序,负责板级初始化、创造线程、启动TI-RTOS。
三、代码解析
1.main_tirtos.c
main_tirtos.c主要实现三个功能:板级初始化、创造线程、启动TI-RTOS。
int main(void)
{
pthread_t thread;
pthread_attr_t attrs;
struct sched_param priParam;
int retc;
/* Call driver init functions */
Board_init();//LAUNCHXL初始化
/* Initialize the attributes structure with default values */
pthread_attr_init(&attrs);//线程属性初始化
/* Set priority, detach state, and stack size attributes */
priParam.sched_priority = 1;//将结构体priParam的线程优先级赋值为1
retc = pthread_attr_setschedparam(&attrs, &priParam);//设置线程优先级为1
retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);//设置线程为分离状态
retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);//设置线程堆栈大小
if (retc != 0) {
/* failed to set attributes */
while (1) {}
}
retc = pthread_create(&thread, &attrs, mainThread, NULL);//创建线程
if (retc != 0) {
/* pthread_create() failed */
while (1) {}
}
BIOS_start();//启动TI-RTOS
return (0);
}
Board_init()调用的是CC2640R2_LAUNCHXL.c中的CC2640R2_LAUNCHXL_initGeneral(),将CC2640R2F的电源初始化和IO初始化、休眠外部FLASH。
extern void Board_initHook(void);
/*
* ======== CC2640R2_LAUNCHXL_initGeneral ========
*/
void CC2640R2_LAUNCHXL_initGeneral(void)
{
Power_init();//电源初始化
if (PIN_init(BoardGpioInitTable) != PIN_SUCCESS) {
/* Error with PIN_init */
while (1);
}//IO初始化
/* Perform board-specific initialization */
Board_initHook();//休眠外部FLASH
}
/*
* ======== Board_init ========
*/
void Board_init(void)
{
CC2640R2_LAUNCHXL_initGeneral();
}
BoardGpioInitTable中的IO配置如下:
CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS, /* Button is active low */
CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN, /* External flash chip select */
CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX via debugger back channel */
CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /* UART TX via debugger back channel */
CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master out - slave in */
CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI master in - slave out */
CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN, /* SPI clock */
2.gpiointerrupt.c
* ======== gpiointerrupt.c ========
*/
#include <stdint.h>
#include <stddef.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
/* Example/Board Header files */
#include "Board.h"
/*
* ======== gpioButtonFxn0 ========
* Callback function for the GPIO interrupt on Board_GPIO_BUTTON0.
*/
void gpioButtonFxn0(uint_least8_t index)
{
/* Clear the GPIO interrupt and toggle an LED */
GPIO_toggle(Board_GPIO_LED0);
}
/*
* ======== gpioButtonFxn1 ========
* Callback function for the GPIO interrupt on Board_GPIO_BUTTON1.
* This may not be used for all boards.
*/
void gpioButtonFxn1(uint_least8_t index)
{
/* Clear the GPIO interrupt and toggle an LED */
GPIO_toggle(Board_GPIO_LED1);
}
/*
* ======== mainThread ========
*/
void *mainThread(void *arg0)
{
/* Call driver init functions */
GPIO_init();//初始化GPIO
/* Configure the LED and button pins */
GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);//配置与LED0相连的GPIO为输出模式、输出状态为低。
GPIO_setConfig(Board_GPIO_LED1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);//配置与LED1相连的GPIO为输出模式、输出状态为低。
GPIO_setConfig(Board_GPIO_BUTTON0, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);//配置与BUTTON0相连的GPIO为输入上拉模式、下降沿触发中断。
/* Turn on user LED */
GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);//点亮LED0
/* install Button callback */
GPIO_setCallback(Board_GPIO_BUTTON0, gpioButtonFxn0);//设置按键回调
/* Enable interrupts */
GPIO_enableInt(Board_GPIO_BUTTON0);//使能BUTTON0中断
/*
* If more than one input pin is available for your device, interrupts
* will be enabled on Board_GPIO_BUTTON1.
*/
if (Board_GPIO_BUTTON0 != Board_GPIO_BUTTON1) {
/* Configure BUTTON1 pin */
GPIO_setConfig(Board_GPIO_BUTTON1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
/* Install Button callback */
GPIO_setCallback(Board_GPIO_BUTTON1, gpioButtonFxn1);
GPIO_enableInt(Board_GPIO_BUTTON1);
}
return (NULL);
}
四、实验现象
运行gpiointerrupt例程,按下BUTTON0,红色LED0将会点亮或熄灭;按下BUTTON1,绿色LED1将会点亮或熄灭。
总结
在gpiointerrupt例程中能够获得的主要知识结构如下:
- 线程的创建
- GPIO的配置
- GPIO中断的使用