CC3220学习笔记---中断
我们还是先把所有中断相关寄存器列出来吧。与中断有关的寄存器一共7个,结构都差不多,下面一一讲解:
- 使能特定端口时钟GPIO0CLKEN、GPIO1CLKEN、GPIO2CLKEN、GPIO3CLKEN和GPIO4CLKEN 。
- 通过GPIODIR寄存器配置GPIO引脚的方向。1表示输出,0表示输入。
- 通过 GPIO_PAD_CONFIG_#寄存器来配置引脚功能(引脚复用,这些寄存器的配置可参考这篇日志)。GPIODMACTL可将GPIO引脚配置为 μDMA触发。
- 通过 GPIOIS、GPIOIBE、GPIOEV和GPIOIM寄存器配置中断类型、事件和掩码。
/** @} */
/** @} end of GPIO_PinConfigSettings group *//*!* @brief GPIO回调函数类型** @param index GPIO index。它和GPIO_setCallback()函数中传递的index* 是同一个值。通过使用index来标识导致中断的GPIO,使得你可* 以在多个GPIO中断中使用相同的回调函数。*/
typedef void (*GPIO_CallbackFxn)(uint_least8_t index);
/** 回调函数数组指针* NOTE: 此处引脚配置顺序必须与CC3220SF_LAUNCHXL.h中的所定义的保持一致* NOTE: 不用于中断的引脚可在此处省略,以减少内存使用(前提是不使用中断的* 引脚排放在数组未尾)*/
GPIO_CallbackFxn gpioCallbackFunctions[] = {NULL, /* CC3220SF_LAUNCHXL_GPIO_SW2 */NULL /* CC3220SF_LAUNCHXL_GPIO_SW3 */
};/* 具体设备 GPIO_config 结构体 */
const GPIOCC32XX_Config GPIOCC32XX_config = {.pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,.callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,.numberOfPinConfigs = sizeof(gpioPinConfigs)/sizeof(GPIO_PinConfig),.numberOfCallbacks = sizeof(gpioCallbackFunctions)/sizeof(GPIO_CallbackFxn),.intPriority = (~0)
};
/*!* @def CC3220SF_LAUNCHXL_GPIOName* @brief Enum of GPIO names on the CC3220SF_LAUNCHXL dev board*/
typedef enum CC3220SF_LAUNCHXL_GPIOName {CC3220SF_LAUNCHXL_GPIO_SW2 = 0,CC3220SF_LAUNCHXL_GPIO_SW3,CC3220SF_LAUNCHXL_GPIO_LED_D7,CC3220SF_LAUNCHXL_GPIOCOUNT
} CC3220SF_LAUNCHXL_GPIOName;
- 所有中断回调函数被放在了gpioCallbackFunctions数组之中。它的存放顺序必须与CC3220SF_LAUNCHXL.h中的CC3220SF_LAUNCHXL_GPIOName枚举中的顺序保持一致。
- 为节省内存,有中断回调函数的引脚应定义在CC3220SF_LAUNCHXL_GPIOName中的前面。这样放在gpioCallbackFunctions数组后方的无回调函数的引脚定义就可省略。
- 即使中断没有定义回调函数,也需要在gpioCallbackFunctions数组中加NULL,以方便之后使用GPIO_setCallback将真正的回调函数加入其中。
/** 赋予一个端口的8个引脚的用户定义引脚索引。* 用于端口中断函数,来定位一个引脚的回调函数。*/
typedef struct PortCallbackInfo {/** 端口的8个相应的用户定义pinId索引*/uint8_t pinIndex[NUM_PINS_PER_PORT];
} PortCallbackInfo;/** portCallbackInfos表,每端口一个。*/
static PortCallbackInfo gpioCallbackInfo[NUM_PORTS];
驱动库中,给每个引脚安排了一块内存地址,用于存放回调函数的索引号,把上面代码抽象成下图更好理解:
void GPIO_setCallback(uint_least8_t index, GPIO_CallbackFxn callback)
{uint32_t pinNum;uint32_t portIndex;PinConfig *config = (PinConfig *) &GPIOCC32XX_config.pinConfigs[index];DebugP_assert(initCalled && index < GPIOCC32XX_config.numberOfCallbacks);/** 此段代码将回调函数索引号加入gpioCallbackInfo数组。*/pinNum = getPinNumber(config->pin);portIndex = config->port & PORT_MASK;if (callback == NULL) {gpioCallbackInfo[portIndex].pinIndex[pinNum] =CALLBACK_INDEX_NOT_CONFIGURED;}else {gpioCallbackInfo[portIndex].pinIndex[pinNum] = index;}/** 此段代码将回调函数加入 callBackFunctions 数组.*/if (GPIOCC32XX_config.callbacks[index] != callback) {GPIOCC32XX_config.callbacks[index] = callback;}
}
GPIO_PinConfig gpioPinConfigs[] = {GPIOCC32XX_GPIO_22 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, //SW2GPIOCC32XX_GPIO_13 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, //SW3GPIOCC32XX_GPIO_09 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,GPIOCC32XX_GPIO_10 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,GPIOCC32XX_GPIO_11 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
};
typedef enum CC3220SF_LAUNCHXL_GPIOName{CC3220SF_LAUNCHXL_GPIO_SW2 = 0,CC3220SF_LAUNCHXL_GPIO_SW3,CC3220SF_LAUNCHXL_GPIO_LED_09,CC3220SF_LAUNCHXL_GPIO_LED_10,CC3220SF_LAUNCHXL_GPIO_LED_11,CC3220SF_LAUNCHXL_GPIOCOUNT
} CC3220SF_LAUNCHXL_GPIOName;
4、打开Board.h文件,更改为:
#ifndef __BOARD_H
#define __BOARD_H#ifdef __cplusplus
extern "C" {
#endif#include "CC3220SF_LAUNCHXL.h"#define BUTTON0 CC3220SF_LAUNCHXL_GPIO_SW2
#define BUTTON1 CC3220SF_LAUNCHXL_GPIO_SW3#define LED_ON CC3220SF_LAUNCHXL_GPIO_LED_ON
#define LED_OFF CC3220SF_LAUNCHXL_GPIO_LED_OFF
#define RED_LED CC3220SF_LAUNCHXL_GPIO_LED_09
#define YELLOW_LED CC3220SF_LAUNCHXL_GPIO_LED_10
#define GREEN_LED CC3220SF_LAUNCHXL_GPIO_LED_11#ifdef __cplusplus
}
#endif#endif /* __BOARD_H */
5、打开main_tirtos.c文件,更改为:
#include <ti/drivers/GPIO.h>
#include <ti/drivers/gpio/GPIOCC32XX.h>
#include "Board.h"
#include <ti/sysbios/BIOS.h>//Button0中断服务函数
void Button0_isr(uint_least8_t index)
{GPIO_toggle(RED_LED);
}//Button1中断服务函数
void Button1_isr(uint_least8_t index)
{GPIO_toggle(GREEN_LED);
}int main(void)
{GPIO_init();//关联BUTTON0的中断回调函数GPIO_setCallback(BUTTON0, Button0_isr);GPIO_enableInt(BUTTON0);//关联BUTTON1的中断回调函数GPIO_setCallback(BUTTON1, Button1_isr);GPIO_enableInt(BUTTON1);BIOS_start();return (0);
}
GPIO_PinConfig gpioPinConfigs[] =
{GPIOCC32XX_GPIO_22 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, //SW2GPIOCC32XX_GPIO_13 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, //SW3GPIOCC32XX_GPIO_08 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, //外接SWGPIOCC32XX_GPIO_09 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,GPIOCC32XX_GPIO_10 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,GPIOCC32XX_GPIO_11 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
};GPIO_CallbackFxn gpioCallbackFunctions[] =
{NULL, /* CC3220SF_LAUNCHXL_GPIO_SW2 */NULL, /* CC3220SF_LAUNCHXL_GPIO_SW3 */NULL /* CC3220SF_LAUNCHXL_GPIO_EXTERNAL_SW */
};
typedef enum CC3220SF_LAUNCHXL_GPIOName {CC3220SF_LAUNCHXL_GPIO_SW2 = 0,CC3220SF_LAUNCHXL_GPIO_SW3,CC3220SF_LAUNCHXL_GPIO_EXTERNAL_SW,CC3220SF_LAUNCHXL_GPIO_LED_09,CC3220SF_LAUNCHXL_GPIO_LED_10,CC3220SF_LAUNCHXL_GPIO_LED_11,CC3220SF_LAUNCHXL_GPIOCOUNT
} CC3220SF_LAUNCHXL_GPIOName;
#ifndef __BOARD_H
#define __BOARD_H#ifdef __cplusplus
extern "C" {
#endif#include "CC3220SF_LAUNCHXL.h"#define BUTTON0 CC3220SF_LAUNCHXL_GPIO_SW2
#define BUTTON1 CC3220SF_LAUNCHXL_GPIO_SW3
#define BUTTON2 CC3220SF_LAUNCHXL_GPIO_EXTERNAL_SW#define LED_ON CC3220SF_LAUNCHXL_GPIO_LED_ON
#define LED_OFF CC3220SF_LAUNCHXL_GPIO_LED_OFF
#define RED_LED CC3220SF_LAUNCHXL_GPIO_LED_09
#define YELLOW_LED CC3220SF_LAUNCHXL_GPIO_LED_10
#define GREEN_LED CC3220SF_LAUNCHXL_GPIO_LED_11#ifdef __cplusplus
}
#endif#endif /* __BOARD_H */
#include <unistd.h>
#include <xdc/runtime/System.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/gpio/GPIOCC32XX.h>
#include "Board.h"
#include <ti/sysbios/BIOS.h>#define DELAY_TIME (0x18fff)void delay(int temp)
{int i = 0;for (i = 0; i < temp; i++);
}
//Button0中断服务函数
void Button0_isr(uint_least8_t index)
{delay(DELAY_TIME); //8毫秒延时if(GPIO_read(index)){GPIO_toggle(RED_LED);}
}//Button1中断服务函数
void Button1_isr(uint_least8_t index)
{delay(DELAY_TIME); //8毫秒延时if(GPIO_read(index)){GPIO_toggle(GREEN_LED);}
}void Button2_isr(uint_least8_t index)
{delay(DELAY_TIME); //8毫秒延时if(GPIO_read(index)){GPIO_toggle(YELLOW_LED);}
}int main(void)
{GPIO_init();//关联BUTTON0的中断回调函数GPIO_setCallback(BUTTON0, Button0_isr);GPIO_enableInt(BUTTON0);//关联BUTTON1的中断回调函数GPIO_setCallback(BUTTON1, Button1_isr);GPIO_enableInt(BUTTON1);//关联外接BUTTON2的中断回调函数GPIO_setCallback(BUTTON2, Button2_isr);GPIO_enableInt(BUTTON2);BIOS_start();return (0);
}
现在,终于可以使用按钮控制黄灯了。这回添加了消抖代码,虽然代码不是很正规,但用起来舒服了很多。这个消抖延时时间经过试验,基本可以达到百分之百的命中。
CC3220学习笔记---中断相关推荐
- 009 - STM32学习笔记 - 中断
009 - STM32学习笔记 - 中断 这节的内容,野火的官方视频我反复看了好几次,但是感觉火哥在这块讲解的特别绕,理解起来很吃力,后来在看了一下其他老师的视频,结合一些书本资料和官方手册,才搞清楚 ...
- 10.FreeRTOS学习笔记-中断管理
FreeRTOS 的中断管理支持: 开/关中断. 恢复中断. 中断使能. 中断屏蔽. 可选择系统管理的中断优先级 中断管理的运作机制 当中断产生时,处理机将按如下的顺序执行: 保存当前处理机状态信息 ...
- stm32学习笔记-中断系统
文章目录 问题引入 1.中断系统概述. 1.1 为什么要中断(中断意义) 中断和轮询比较: 1.2 中断处理过程 1.3 中断笔试题 1.4 中断服务函数 2.STM32中断的体系结构. 2.1 结构 ...
- 7、江科大stm32视频学习笔记——中断的应用:对射式红外传感器计次旋转编码器计次
目录 1.标志位函数 2. 初始化的中断的步骤 3.对射式红外传感器计次 (1)接线图 (2)CountSensor.c (3)main.c 4.旋转编码器计次 (1)接线图(旋转编码器接在PB1.P ...
- 微机原理学习笔记——中断系统
中断系统 目录 中断系统 一.中断的基本概念 中断源 开中断和关中断 中断优先权 中断向量表 中断过程 二.8086中断系统 中断源 可屏蔽中断周期 中断向量表 中断过程 三.可编程中断控制器8259 ...
- 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...
<嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...
- Windows保护模式学习笔记(四)—— 中断门陷阱门
Windows保护模式学习笔记(四)-- 中断门&陷阱门 要点回顾 中断描述符表(IDT) 一.中断门 实验:构造一个中断门 第一步:初步构造参数 第二步:确定 Offset in Segme ...
- 【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码
本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十 ...
- 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码
本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...
最新文章
- python连接数据库,处理数据结果后生成excel文件
- 基于Springboot实现企业人事管理系统
- Tensorflow: 保存和复原模型(save and restore)
- LeetCode Odd Even Linked List
- jupyter kernel_jupyter增加多版本python内核
- anaconda换源和恢复默认源
- hystrix 单独使用_Spring cloud微服务架构-Hystrix工作原理(微服务故障熔断)
- python实现冒泡排序视频_Python实现冒泡排序
- 第二天linux,yum源配置和ftp部分设置
- Open VSwitch简介
- 百度地图API学习之路(1)
- python获取验证码_python如何获取验证码
- 混沌世界里的临界点(博弈论的诡计)
- 使用plupload压缩图片
- ODL(C版本)安装过程
- 惠普微型计算机 使用教程,惠普打印机怎么用 打印机使用注意事项【图文教程】...
- hive分区表之insert overwrite 注意事项
- final修饰变量、方法、类的作用
- c语言Int16_t 什么意思,__IO uint16_t 是什么意思,在定义参数时为什么不直接写成 uint16...
- 大数据的一生一世——谈数据冷热分离技术