CC2541蓝牙学习——通用I/O口中断

学习目标:掌握中断使能寄存器IEN0、IEN1、IEN2,中断标志寄存器PxIFG、IRCON、IRCON2,端口中断触发沿控制寄存器PICTL

CC2541有18个中断源,每个中断源都可以产生中断请求,这18个中断源如下

中断请求通过SFR寄存器IEN0、IEN1、IEN2使能或禁止,定义如下:

其中IEN0和IEN1可以位寻址,寄存器IEN2不可以位寻址

EA:1开总中断

IEN1.P0IE:P0端口中断使能

IEN2.P1IE:P1端口中断使能

IEN2.P2IE:P2端口中断使能

IEN1寄存器的第5位控制P0口的中断,当设置IEN1.P0IE时,将设置P0端口所有引脚的中断使能

IEN2寄存器的第4位和第1位分别控制P1端口和P2端口,控制P1和P2端口的所有引脚中断使能

如果要对P0、P1、P2端口具体某一个引脚设置使能,则需要设置寄存器P0IEN、P1IEN、P2IEN,其定义如下:

0xAB、0x8D、0xAC 不可位寻址

端口 Bit位 名称 初始化 读写 描述
P0IEN 7:0 P0_[7:0]IEN 0x00 R/W 端口0,位7至位0中断使能。0:中断禁止;1:中断使能
P1IEN 7:0 P1_[7:0]IEN 0x00 R/W 端口1,位7至位0中断使能。0:中断禁止;1:中断使能
P2IEN 7:6 --- 00 R0 未使用
P2IEN 5 DPIEN 0 R/W USB D+ 中断使能。
P2IEN 4:0 P2_[4:0]IEN 00000 R/W 端口2,位4至位0中断使能。0:中断禁止;1:中断使能

所以通用I/O口中断使能有三层:总中断使能、端口中断使能、引脚中断使能

I/O中断除了配置中断使能之外,还需要配置中断触发方式,中断触发方式可由端口中断控制寄存器PICTL设置,I/O中断触发方式分为输入的上升沿触发和下降沿触发,PICTL寄存器定义如下:

0x8c  不可位寻址

端口 Bit位 名称 初始化 读写 描述
PICTL 7 PADSC 0 R/W 强制引脚在输出模式。选择输出驱动能力,由DVDD引脚提供。0:最小驱动能力;1:最大驱动能力
PICTL 6:4 --- 000 R0 未使用
PICTL 3 P2ICON 0 R/W 端口2,引脚4至0输入模式下的中断配置,0:输入的上升沿引起中断;1:输入的下降沿引起中断
PICTL 2 P1ICONH 0 R/W 端口1,引脚7至4输入模式下的中断配置,0:输入的上升沿引起中断;1:输入的下降沿引起中断
PICTL 1 P1ICONL 0 R/W 端口1,引脚3至0输入模式下的中断配置,0:输入的上升沿引起中断;1:输入的下降沿引起中断
PICTL 0 P0ICON 0 R/W 端口0,引脚7至0输入模式下的中断配置,0:输入的上升沿引起中断;1:输入的下降沿引起中断

与中断使能有三层类似,中断标志也有两层,分别为端口中断标志和引脚中断标志

端口中断标志位在寄存器IRCON和IRCON1中,分别为P0IF、P1IF、P2IF,都可以位寻址

由于CC2541的外部中断共用一个中断向量,因此需要判断是哪个引脚发生中断,通过判断中断状态标志寄存器(P0IFG,P1IFG,P2IFG)可以判断是哪一个引脚发生中断,寄存器定义如下:

0x89、0x8A、0x8B 不可位寻址

端口 Bit位 名称 初始化 读/写 描述
P0IFG 7:0 P0IF[7:0] 0x00 R/W0 端口0,位7至位0输入中断状态标志。0:未发生中断,1:发生中断
P1IFG 7:0 P1IF[7:0] 0x00 R/W0 端口1,位7至位0输入中断状态标志。0:未发生中断,1:发生中断
P2IFG 7:5 --- 000 R0 未使用
P2IFG 4:0 P2IF[4:0] 0x00 R/W0 端口2,位4至位0输入中断状态标志。0:未发生中断,1:发生中断

通用I/O口中断配置过程:

  1. 设置需要发生中断的I/O口为通用I/O口,配置寄存器PxSEL
  2. 设置I/O口为输入方式,配置寄存器PxDIR
  3. 清除中断标志,对应的寄存器PxIFG状态标志位置0
  4. 设置I/O口的中断触发方式
  5. 开端口中断,设置对应引脚的端口的中断使能位为1,设置寄存器IEN0或IEN1
  6. 开总中断,设置IEN0中的EA为1

如P0.1作为按键中断的初始化子函数如下

 1 /******************************************************************************
 2 *函 数 名:InitKey
 3 *功    能:按键中断初始化
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 void InitKey(void)
 8 {
 9   P0SEL &= ~0x02;      //P0.1设置为通用I/O口
10   P0DIR &= ~0x02;      //P0.1设置为输入
11   P0IFG &= ~0x02;      //P0.1中断状态标志位清0
12   PICTL |=  0x00;      //P0端口下降沿触发
13   P0IEN |=  0x02;      //P0.1中断使能
14   IEN1  |=  0x20;      //端口P0中断使能
15   EA = 1;              //开总中断
16 }

中断服务程序中需要做的:

  1. 判断引脚中断是否发生(如果该端口只有一个引脚中断,可以不判断)
  2. 完成具体中断工作
  3. 清引脚中断标志,PxIFG对应引脚位清0(必须软件清0,不清0的话中断服务程序反复执行)
  4. 清端口中断标志,P0IF/P1IF/P2IF位清0(实验验证端口中断标志不清0也可以,但是该位不会自动清0,需要软件清0,为了保险,统一为清0)

中断服务程序书写格式

 1 /******************************************************************************
 2 *函 数 名:P0_ISR
 3 *功    能:中断服务子程序
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 #pragma vector = P0INT_VECTOR
 8 __interrupt void P0_ISR(void)
 9 {
10   if(0x02 & P0IFG)           //判断按键中断
11   {
12   //具体功能代码
13   }
14  P0IFG = 0;              //清中断标志
15  P0IF  = 0;              //清中断标志,IRCON[5],P0口中断
16 }

示例程序:按键控制LED灯

 1 /******************************************************************************
 2 *文 件 名:KEY.c
 3 *作    者:陈照
 4 *时    间:2015-04-23
 5 *版    本:1.0
 6 *描    述:按键中断方式控制流水灯
 7 ******************************************************************************/
 8 #include <iocc2541.h>
 9 #include "delay.h"
10
11 typedef unsigned char uchar;
12 typedef unsigned int  uint;
13
14 #define LED1 P1_0
15 #define LED2 P1_1
16 #define LED3 P1_4
17 #define KEY  P0_1
18
19 /******************************************************************************
20 *函 数 名:InitLED
21 *功    能:LED灯初始化
22 *入口参数:mode,mode为1则点亮所有LED,mode为0则熄灭所有LED
23 *出口参数:无
24 ******************************************************************************/
25 void InitLED(uchar mode)
26 {
27   P1SEL &= ~0x13;      //P1.0,P1.1,P1.4设置为通用I/O口
28   P1DIR |=  0x13;      //P1.0,P1.1,P1.4设置为输出
29   LED1 = mode;         //LED灯亮熄控制
30   LED2 = mode;
31   LED3 = mode;
32 }
33
34 /******************************************************************************
35 *函 数 名:InitKey
36 *功    能:按键中断初始化
37 *入口参数:无
38 *出口参数:无
39 ******************************************************************************/
40 void InitKey(void)
41 {
42   P0SEL &= ~0x02;      //P0.1设置为通用I/O口
43   P0DIR &= ~0x02;      //P0.1设置为输入
44   P0IFG &= ~0x02;      //P0.1中断状态标志位清0
45   PICTL |=  0x00;      //P0端口下降沿触发
46   P0IEN |=  0x02;      //P0.1中断使能
47   IEN1  |=  0x20;      //端口P0中断使能
48   EA = 1;              //开总中断
49 }
50
51 /******************************************************************************
52 *函 数 名:P0_ISR
53 *功    能:中断服务子程序
54 *入口参数:无
55 *出口参数:无
56 ******************************************************************************/
57 #pragma vector = P0INT_VECTOR
58 __interrupt void P0_ISR(void)
59 {
60   if(0x02 & P0IFG)           //判断按键中断
61   {
62     LED1 = !LED1;          //流水灯
63     Delay1ms(1000);        //延时1s
64     LED2 = !LED2;
65     Delay1ms(1000);
66     LED3 = !LED3;
67     Delay1ms(1000);
68   }
69  P0IFG = 0;              //清中断标志
70  P0IF  = 0;              //清中断标志,IRCON[5],P0口中断
71 }
72
73 /******************************************************************************
74 *程序入口函数
75 ******************************************************************************/
76 int main(void)
77 {
78   InitLED(0);                //LED初始化,熄灭LED1~3
79   InitKey();                 //按键中断初始化
80
81   while(1)
82   {
83   }
84 }
时间: 2024-10-27 07:04:31

CC2541蓝牙学习——通用I/O口中断的相关文章

CC2541蓝牙学习——外设I/O

学习目标:I/O口的配置,掌握I/O外设功能及位置分布,寄存器“PERCFG”.“P2SEL”和“P2DIR”. 前面CC2541蓝牙学习——I/O口介绍过CC2541有21个I/O引脚,这些引脚可以作为通用I/O引脚,同时通过独立编程还可以作为外设I/O引脚用作ADC.串口.定时器和调试接口.当设置为外设I/O时,需要将对应的寄存器位PxSEL置1,每个外设单元对应两组可以选择的I/O引脚,即“外设位置1”和“外设位置2”,如下表所示. 从表中我们可以看出整个P0口都可作为ADC使用,因此可以

CC2541蓝牙学习——看门狗

看门狗是在软件跑飞的情况下CPU自恢复的一个方式,看门狗分为硬狗和软狗,硬狗就是由专门的看门狗硬件电路实现看门狗功能,看门狗芯片也比较多,比如DS1232,除了看门狗功能外还有电源电压监测功能.软狗就是由软件实现的看门狗功能,现在很多CPU都自带了软狗,很难说硬狗好还是软狗好,如果软狗够用,尽量使用软狗简化设计,看门狗说白了就是一个定时器!,当软件在选定的时间间隔内不能置位看门狗定时器(WDT),WDT就复位系统.看门狗可用于电噪声,电源故障或静电放电等恶劣工作环境或高可靠性要求的环境.如果系统

CC2541蓝牙学习——定时器3和定时器4

定时器3和定时器4与定时器1功能类似,都有三种模式:自由运行模式.模模式.正计数/倒计数模式,都有输入捕获和输出比较功能,不同的是定时器3和定时器4是8位计数器,而定时器1是16位的,另外定时器3和定时器4只有2个通道,定时器多了一个模式:倒计数模式.由于定时器3和定时器4相似,下面以定时器3为例说明. 定时器3和定时器4是两个8位定时器,每个定时器有两个独立的捕获/比较通道,每一通道使用一个I/O引脚. 定时器3/4有以下特点: 两个捕获/比较通道: 设置,清除或切换输出比较: 每时钟可以被以

CC2541蓝牙学习——ADC

CC2541的ADC支持多达14位的模拟数字转换与高达12位的有效位数.它包括一个模拟多路转换器,具有多达8个各自可独立配置的通道,一个参考电压发生器.转换结果通过DMA写入存储器.还具有若干运行模式. ADC主要特性如下: 可选的抽取率,设置了7~12位的分辨率: 8个独立输入通道,可接受单端或差分信号: 参考电压可选为内部,外部单端,外部差分,或AVDD5: 产生中断请求: 转换结束时的DMA触发: 温度传感器输入: 电池测量功能. 图1 P0引脚上的信号可以作为ADC输入来使用.在下面,这

CC2541蓝牙学习——定时器1的捕获/比较功能

CC2541定时器1有5个捕获/比较通道,首先介绍什么是捕获和比较功能. 捕获通道: 设置的捕获开始的时候,CPU会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这时 计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获.下降沿捕获.或者上升沿下降沿 都捕获.捕获通道可以用来测量信号的频率周期或者波形的宽度,捕获通道类似于秒表的功能. 比较通道: 这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不

CC2541蓝牙学习——定时器1自由运行模式

学习目标:定时器1的自由运行模式 CC2541有4个定时器,分别实现不同的功能,定时器1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM功能.定时器1有5个独立的捕获/比较通道,每个通道定时器使用一个I/O引脚. 定时器1的功能如下: 五个捕获/比较通道 上升沿.下降沿或任何的边沿输入捕获 设置.清除或切换输出比较 自由运行.模或正技术/倒技术操作 可被1.8.32.128整除的时钟分频器 在每个捕获/比较和最终计数上生成中断请求 DMA触发功能 定时器包括一个

CC2541蓝牙学习——时钟设置

CC2541有四个振荡器,分别是: 32MHz外部晶振 16MHz内部RC振荡器 32kHz外部晶振 32kHz内部RC振荡器 由此可以看出,CC2541内部自带了振荡器,也就是说即使外部电路不接振荡器,CC2541也可以工作,答案是肯定的,但是作为无线RF收发,只能使用外部32MHz晶振,除非准备将CC2541当做一个普通的增强型51单片机来用,否者32MHz外部晶振是必不可少的,那么这4个晶振有什么区别和用途呢? 32MHz的外部晶振有两个作用:为内部时钟提供时钟源和用于RF收发器 16MH

(3)MSP430F5529 通用I/O口的设置

这一部分讲外部中断. 看介绍再加弄懂程序才是王道 外部中断是MSP430优先级最低的中断而且是可屏蔽中断.用起来比较简单. 1.2.7  简单的端口中断(外部中断)   P1.P2的所有端口都具有中断能力,可以通过寄存器PxIFG,PxIE和PxIES来配置.其他端口则需参照具体的引脚说明书.所有的P1中断标志是最优先的(相比其它引脚的外部中断),其中P1IFG.0又最优. PXIV中断向量寄存器:只有P1IV和P2IV.最高优先级使能中断在P1IV寄存器中产生一个序号,这个数字会被程序计数器识

(2)MSP430F5529 通用I/O口的设置

初学,有什么错误或者不恰当的地方多多指正,大家一起交流学习. 推荐一个好去处:TI官方MSP430交流社区http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55.aspx需要注册.在这里面提问题,都会有TI的在职工程师为你解答. 第一章,先学习I/O.I/O的操作是最基本的,而且这些寄存器也都要牢牢掌握.MSP430难就难在它有大量的寄存器需要设置,虽然不是每个都必须掌握,但I/O控制寄存器我觉得肯定还要记住