CC2640R2F学习笔记(二.gpiointerrupt例程解析)


前言

gpiointerrupt例程使用2个按键控制2个LED灯的点亮。使用的外设如下:

  • Board_GPIO_LED0
  • Board_GPIO_LED1
  • Board_GPIO_BUTTON0- 切换Board_GPIO_LED0
  • Board_GPIO_BUTTON1- 切换Board_GPIO_LED1

LED和BUTTON对应的芯片引脚如下:

LED0LED1BUTTON0BUTTON1
DIO6DIO7DIO13DIO14

一、导入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中断的使用

参考

CC2640驱动API

基于电能的产生多数仰赖高风险或高污染的原料所转换,如何有效或实时的管理及监控电能当下使用情况就显得格外的重要。 TI在MSP430产品特别开发一系列专门为计算电源消耗功率的微处理器MSP430i20xx,其简洁优化的设计为电消耗功率与功率因素计算提供了一个低成本,容易快速完成的设计条件,且因本身的样本数据读取与计算都是由微处理器自身所完成,设计者只要依不同需求选择不同等级的版本,就可轻易的增加通讯传输或其他额外的功能。以监控单一负载功耗为例,只要加上蓝牙传输接口功能且配合对应的行动装置APP,一般用户就能快速且简易的达到监控用电耗能的情况。 核心技术优势MSP430-16位微处理器 (1) 1个可产生系统时钟基于DCO的时钟系统 (2) 1个内置电压基准和电压监视器的电源管理模块(PMM) (3) 2至4个24Bit (ADC) (4) 1个温度传感器 (5) 1个16位硬件乘法器 (6) 两个16位定时器 (7) 1个eUSCI-A模块和一个eUSCI-B模块 (8) 1个看门狗定时器(WDT) (9) 1个低功耗模数转换器和多达16个I / O引脚 BLE SimpleLink ultra-low power wireless MCU for Bluetooth (1) 强大的 ARM:registered: Cortex:registered:-M3 (2) 48MHz 的时钟速度/128KB 系统内可程序设计闪存 (3) 内置蓝牙4.2传输协议 (4) 高达 28KB 系统 SRAM (5) 支持无线升级 (OTA) (6) 超低功耗传感器控制器 (7) 12 位模数转换器 (ADC)200MSPS、8 通道仿真多任务器 方案规格(1) BLE4.2协议。兼容多少安卓/IOS 系统 (2) 连接稳定,超低功耗 (3) 负载装配容易 (4) 两颗微处理器架构易于增加附加功能 方案来源于大大通。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值