[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭

简介:


 

 

1、CC2530的IO口概述

  CC2530芯片有21 个数字输入/输出引脚,可以配置为通用数字I/O 或外设I/O 信号,配置为连接到ADC、定时器或USART外设。这些I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现。

  I/O 端口具备如下重要特性:

       􀁺 21 个数字I/O 引脚
    􀁺 可以配置为通用I/O 或外部设备I/O
    􀁺 输入口具备上拉或下拉能力
    􀁺 具有外部中断能力。


21 个I/O 引脚都可以用作于外部中断源输入口。因此如果需要外部设备可以产生中断。外部中断功能也可以从睡眠模式唤醒设备

 

2、未使用的I/O 引脚处理

  未使用的I/O 引脚电平是确定的,不能悬空。一个方法是使引脚不连接,配置引脚为具有上拉电阻的通用I/O输入。这也是所有引脚复位后的状态(除了P1.0 和P1.1 没有上拉/下拉功能)。或者引脚可以配置为通用I/O输出。这两种情况下引脚都不能直接连接到VDD 或GND,以避免过多的功耗

 

3、低I/O 电压
在数字I/O 电压引脚DVDD1 和DVDD2 低于2.6V 的应用中,寄存器位PICTL.PADSC 应设置为1,以获得DC 特性表中所述的输出DC 特性。

 

4、通用I/O

  用作通用I/O 时,引脚可以组成3 个8 位端口,端口0、端口1 和端口2,表示为P0、P1 和P2。其中,P0和P1 是完全的8 位端口,而P2 仅有5 位可用。所有的端口均可以通过SFR 寄存器P0、P1 和P2 位寻址和字节寻址。每个端口引脚都可以单独设置为通用I/O 或外部设备I/O。

  (驱动电流很重要,有时候和MOS管电路、上拉电阻的选择等密切相关)除了两个高驱动输出口P1.0 和P1.1 各具备20 mA 的输出驱动能力之外,所有的输出均具备4 mA 的驱动能力。

  寄存器PxSEL(选择为通用IO模式还是外设IO信号),其中x 为端口的标号0~2,用来设置端口的每个引脚为通用I/O 或者是外部设备I/O 信号。作为缺省的情况,每当复位之后,所有的数字输入/输出引脚都设置为通用输入引脚。在任何时候,要改变一个端口引脚的方向,就使用寄存器PxDIR(选择输入或输出)来设置每个端口引脚为输入或输出。因此只要设置PxDIR 中的指定位为1,其对应的引脚口就被设置为输出了。当读取端口寄存器P0、P1 和P2 的值,不管引脚配置如何,输入引脚上的逻辑值都被返回。这在执行读-修改-写指令期间不适用。读-修改-写指令是:ANL,ORL,XRL,JBC,CPL,INC,DEC,DJNZ,MOV,CLR和SETB。在一个端口寄存器上操作,以下是正确的:当目标是端口寄存器P0、P1 或P2 中一个独立的位,寄存器的值,而不是引脚上的值,被读取、修改并写回端口寄存器。

  用作输入时,通用I/O 端口引脚可以设置为上拉、下拉或三态操作模式。作为缺省的情况,复位之后,所有的端口均设置为带上拉的输入。要取消输入的上拉或下拉功能,就要将PxINP(输入上拉、下拉、三态模式选择)中的对应位设置为1。I/O 端口引脚P1.0 和P1.1 没有上拉/下拉功能。注意配置为外设I/O 信号的引脚没有上拉/下拉功能,即使外设功能是一个输入。

  在电源模式PM1、PM2 和PM3 下I/O 引脚保留当进入PM1/PM2/PM3 时设置的I/O 模式和输出值(如果可用的话)。

 

5、通用I/O 中断

  通用I/O 引脚设置为输入后,可以用于产生中断。中断可以设置在外部信号的上升或下降沿触发。P0、P1或P2 端口都有中断使能位,对位于IENl(端口中断使能寄存器)寄存器内的端口所有的位都是公共的,如下:

􀁺 IENI.P0 IE:P0 中断使能
􀁺 IEN2.PI IE:P1 中断使能
􀁺 IEN2.P2IE:P2 中断使能

  除了这些公共中断使能之外,每个端口的位都有位于SFR 寄存器P0IEN、P1IEN 和P2IEN(单独引脚中断使能寄存器)的单独的中断使能。即使配置为外设I/O 或通用输出的I/O 引脚使能时都有中断产生。

  当中断条件发生在I/O 引脚之一上面,P0-P2 中断标志寄存器P0IFG、P1IFG 或P2IFG(中断标志寄存器)中相应的中断状态标志将设置为1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态标志被清除,该标志写入0。这个标志必须在清除CPU 端口中断标志(PxIF)之前被清除。用于中断的SFR 寄存器描述在下一节。寄存器总结如下:

􀁺 P0IEN: P0 中断使能
􀁺 P1IEN: P1 中断使能
􀁺 P2IEN: P2 中断使能
􀁺 PICTL: P0、P1 和P2 触发沿设置
􀁺 P0FG: P0 中断标志
􀁺 P1IFG: P1 中断标志
􀁺 P2IFG: P2 中断标志

 

6、通用I/O DMA

  当用作通用I/O 引脚时,每个P0 和P2 端口都关联一个DMA 触发。这些DMA 触发对于P0 为IOC_0,对于P1 为IOC_1。当一个中断发生在P0 引脚时IOC_0 触发是被激活的。当一个中断发生在P1 引脚时IOC_1 触发是被激活的。

 

7、外设I/O

  本节描述了数字I/O 引脚是如何配置为外设I/O 的。对于可以通过数字输入/输出引脚和外部系统接口的每个外设单元,如何配置外设I/O 的描述给定在以下小节中。

  对于USART 和定时器I/O,在一个数字I/O 引脚上选择外设I/O 功能,需要设置对应的PxSEL 位为1。

  注意,该外部单元具有两个可以选择的位置对应它们的I/O 引脚,参见下表。如果有关于I/O 映射的冲突设置,可以在这些之间设置优先级(使用P2SEL.PRIxP1 和P2DIR.PRIP0 位)。所有不会导致冲突的组合都可以使用。

  注意即使没有使用,外设一般也会出现在选定的位置,使用引脚的其他外设必须给予较高的优先级。例外情况是流量控制禁用时UART 模式下USART 的RTS 和CTS 引脚, 以及SPI 主模式下USART 配置的SSN 引脚。

  还要注意不管PxINP 的设置,有输入引脚的外设单元是从引脚接收输入,这可能会影响外设单元的状态。例如如果RX 引脚在用作一个UART 引脚之前,可能已经有活动, UART 在使用之前必须被清除。

 

7.1、定时器1

  PERCFG.T1CFG 选择是否使用备用位置1 或备用位置2。

  在上表中,定时器1 的信号显示如下:

● 0:通道0 捕获/比较引脚
● 1:通道1 捕获/比较引脚
● 2:通道2 捕获/比较引脚
● 3:通道3 捕获/比较引脚
● 4:通道4 捕获/比较引脚

  P2DIR.PRIP0(指派端口0一些外设的优先顺序)选择为端口0 指派一些外设的优先顺序。当设置为10,定时器通道0-1 优先,当设置为11,定时器通道2-3 优先。要所有定时器1 通道在备用位置1 上可见,移动USART 0 和USART 1 到备用位置2。P2SEL.PRI1P1 和P2SEL.PRI0P1(外设优先级设置)选择为端口1 指派一些外设的优先顺序。当前者设置为低电平而后者设置为高电平时,定时器1 通道优先。

 

 

7.2、定时器3

  PERCFG.T3CFG 选择是否使用备用位置1 或备用位置2。

  在表中,定时器3 的信号显示如下:

● 0:通道0 比较引脚
● 1:通道1 比较引脚

  P2SEL.PRI2P1 和P2SEL.PRI3P1 选择为端口1 指派一些外设的优先顺序。当这两个位都设置为高电平时,定时器3 通道优先。如果P2SEL.PRI2P1 设置为高电平且P2SEL.PRI3P1 设置为低电平时,定时器3 通道优先于USART 1,但是USART 0 优先于定时器3 通道以及USART 1。

 

 

7.3、定时器4

  PERCFG.T4CFG 选择是否使用备用位置1 或备用位置2。

  在表中,定时器4 的信号显示如下:

● 0:通道0 比较引脚
● 1:通道1 比较引脚

  P2SEL.PRI1P1 选择为端口1 指派一些外设的优先顺序。当这个位设置时,定时器4 通道优先。

 

 

7.4、USART 0

  SFR 寄存器位PERCFG.U0CFG 选择是否使用备用位置1 或备用位置2。

  在表中,USART 0 信号显示如下:

UART:
● RX:RXDATA
● TX:TXDATA
● RT:RTS
● CT:CTS


SPI:
● MI:MISO
● MO:MOSI
● C:SCK
● SS:SSN

  P2DIR.PRIP0 选择为端口0 指派一些外设的优先顺序。当设置为00 时,USART 0 优先。注意如果选择了UART 模式,且硬件流量控制禁用,UART 1 或定时器1 将优先使用端口P0.4 和P0.5。P2SEL.PRI3P1 和P2SEL.PRI0P1 选择为端口1 指派一些外设的优先顺序。当它们两个都设置为0 时,USART0 优先。注意如果选择了UART 模式,且硬件流量控制禁用,定时器1 或定时器3 将优先使用端口P1.2 和P1.3。

 

 

7.5、USART 1

  SFR 寄存器位PERCFG.U1CFG 选择是否使用备用位置1 或备用位置2。

  在表中,USART 1 信号显示如下:

UART:
● RX:RXDATA
● TX:TXDATA
● RT:RTS
● CT:CTS


SPI:
● MI:MISO
● MO:MOSI
● C:SCK
● SS: SSN

  P2DIR.PRIP0 选择为端口0 指派一些外设时的优先顺序。当设置为01,USART 1 优先。注意如果选择了UART 模式,且硬件流量控制禁用,USART 0 或定时器1 将优先使用P0.2 和P0.3。P2SEL.PRI3P1 和P2SEL.PRI2P1 选择为端口1 指派一些外设的优先顺序。当前者设置为1 而后者设置为0时,USART 1 优先。注意如果选择了UART 模式,且硬件流量控制禁用,USART 0 或定时器3 将优先使用P1.4和P1.5。

 

 

7.6、ADC

  当使用ADC 时,端口0 引脚必须配置为ADC 输入。可以使用多达八个ADC 输入引脚。要配置一个端口0引脚为一个ADC 输入,APCFG 寄存器中相应的位必须设置为1。这个寄存器的默认值选择端口0 引脚为非ADC输入,即数字输入/输出。

  APCFG 寄存器的设置将覆盖P0SEL的设置。

  ADC 可以配置为使用通用I/O 引脚P2.0 作为内部触发器来启动转换。当用作ADC 内部触发器时,P2.0 必须在输入模式下配置为通用I/O。

 

 

7.7、调试接口

  端口P2.1 和P2.2 分别用于调试数据和时钟信号。这些显示为表中的DD(调试数据)和DC(调试时钟)。当处于调试模式,调试接口控制这些引脚的方向。当处于调试模式在这些引脚上禁用上拉/下拉。

 


7.8、32 kHz XOSC 输入

  端口P2.3 和P2.4 用于连接一个外部32 kHz 晶振。当CLKCONCMD.OSC32K 是低电平时,不管寄存器设置如何,这些端口引脚由32 kHz XOSC 使用。当CLKCONCMD.OSC32K 是低电平,这些端口引脚将设置在模拟模式。


7.9 无线测试输出信号

  通过使用OBSSELx 寄存器(OBSSEL0-OBSSEL5),用户可以从RF 内核输出不同的信号到GPIO 引脚。这些信号可以用于调试低级别的协议或控制外部PA、LNA 或交换机。控制寄存器OBSSEL0-OBSSEL5 可以用于覆盖标准的GPIO 行为,以及在引脚P1[0:5]上输出RF 内核信号(rfc_obs_sig0、rfc_obs_sig1 和rfc_obs_sig2)。可用信号的列表见第19 章。


7.10、掉电信号MUX (PMUX)

  PMUX 寄存器可以用于输出32 kHz 时钟和/或数字稳压器的状态。所选的32 kHz 时钟源可以输出在P0 其中的一个引脚上。使能位CKOEN 使得输出在P0 上,使用CKOPIN(详细信息见PMUX 寄存器描述)选择P0 的引脚。当CKOEN 被设置,所选引脚的所有其他配置都被覆盖。时钟在所有供电模式下都输出;但是,在PM3 下时钟停止(见第4 章的PM3)。而且,数字稳压器的状态可以输出在P1 其中的一个引脚上。当DREGSTA 位被设置,数字稳压器的状态就被输出。DREGSTAPIN 选择P1 引脚(详细信息见PMUX 寄存器描述)。当DREGSTA 被设置,所选引脚的所有其他配置都被覆盖。当1.8V 片上数字稳压器上电(芯片有调整过的电压),所选的引脚输出1。当1.8V片上数字稳压器掉电,即在PM2 和PM3 下,所选的引脚输出0。

 

7.11 I/O 引脚

  I/O 端口的寄存器描述在本节中。寄存器如下:

● P0 :端口0

● P1 :端口1
● P2 :端口2
● PERCFG :外设控制寄存器
● APCFG :模拟外设I/O 配置
● P0SEL :端口0 功能选择寄存器
● P1SEL :端口1 功能选择寄存器
● P2SEL :端口2 功能选择寄存器
● P0DIR :端口0 方向寄存器
● P1DIR :端口1 方向寄存器
● P2DIR :端口2 方向寄存器
● P0INP :端口0 输入模式寄存器
● P1INP :端口1 输入模式寄存器
● P2INP :端口2 输入模式寄存器
● P0IFG :端口0 中断状态标志寄存器
● P1IFG :端口1 中断状态标志寄存器
● P2IFG :端口2 中断状态标志寄存器
● PICTL :中断边缘寄存器
● P0IEN :端口0 中断掩码寄存器
● P1IEN :端口1 中断掩码寄存器
● P2IEN :端口2 中断掩码寄存器
● PMUX :掉电信号Mux 寄存器
● OBSSEL0 :观察输出控制寄存器0
● OBSSEL1 :观察输出控制寄存器1
● OBSSEL2 :观察输出控制寄存器2
● OBSSEL3 :观察输出控制寄存器3
● OBSSEL4 :观察输出控制寄存器4
● OBSSEL5 :观察输出控制寄存器5

 

 

8、隔一秒闪烁例程(引脚输出控制)

  下面代码是控制P1_0引脚上的LED每隔1s闪烁一次的实验。黄色部分P1DIR用来设置P1的8个端口的每个的输入输出方向。

 

复制代码
 1 /****************************************************************************
 2 * 文 件 名: main.c
 3 * 作    者: Andy
 4 * 修    订: 2013-01-08
 5 * 版    本: 1.0
 6 * 描    述: GPIO输出控制实验1 操作IO口控制LED灯的亮和灭
 7 ****************************************************************************/
 8 #include <ioCC2530.h>
 9 
10 typedef unsigned char uchar;
11 typedef unsigned int  uint;
12 
13 #define LED1 P1_0                //定义P1.0口为LED1控制端
14 
15 
16 /****************************************************************************
17 * 名    称: DelayMS()
18 * 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
19 * 入口参数: msec 延时参数,值越大,延时越久
20 * 出口参数: 无
21 ****************************************************************************/
22 void DelayMS(uint msec)
23 { 
24     uint i,j;
25     
26     for (i=0; i<msec; i++)
27         for (j=0; j<535; j++);
28 }
29 
30 /****************************************************************************
31 * 名    称: InitLed()
32 * 功    能: 设置LED灯相应的IO口
33 * 入口参数: 无
34 * 出口参数: 无
35 ****************************************************************************/
36 void InitLed(void)
37 {
38     P1DIR |= 0x01;               //P1.0定义为输出口
39 }
40 
41 /****************************************************************************
42 * 程序入口函数
43 ****************************************************************************/
44 void main(void)
45 {     
46     InitLed();                   //设置LED灯相应的IO口
47 
48     while(1)                     //死循环
49     {
50         LED1 = 0;                //点亮LED1      
51         DelayMS(1000);           //延时1秒
52 
53         LED1 = 1;                //LED1熄灭
54         DelayMS(1000);           //延时1秒
55     }    
56 }
复制代码

上面的例子是控制1个引脚,下面的流水灯例子展示了同时控制3个引脚,其实大同小异:

  流水灯例子

 

 

9、按键控制LED亮灭(外部信号输入读取)

  外设电路图如下,P10低电平时LED亮,按键没有按下P01为高电平,按下为低电平:

 

 

  这里重点讲P01按键信号读取的设置:黄色部分P0SEL将P01设置为通用IO:

  

  P0DIR将P01设置为输入模式:

 

  P0INP打开P01上的上拉电阻:

 

  这里读取一个引脚的状态,和读取51单片机一个引脚状态一样,比较简单~

复制代码
 1 /****************************************************************************
 2 * 文 件 名: main.c
 3 * 作    者: Andy
 4 * 修    订: 2013-01-08
 5 * 版    本: 1.0
 6 * 描    述: 按下按键S1控制LED1灯亮和灭
 7 ****************************************************************************/
 8 #include <ioCC2530.h>
 9 
10 typedef unsigned char uchar;
11 typedef unsigned int  uint;
12 
13 #define LED1 P1_0       // P1.0口控制LED1
14 #define KEY1 P0_1       // P0.1口控制S1
15 
16 /****************************************************************************
17 * 名    称: DelayMS()
18 * 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
19 * 入口参数: msec 延时参数,值越大,延时越久
20 * 出口参数: 无
21 ****************************************************************************/
22 void DelayMS(uint msec)
23 { 
24     uint i,j;
25     
26     for (i=0; i<msec; i++)
27         for (j=0; j<535; j++);
28 }
29 
30 /****************************************************************************
31 * 名    称: InitLed()
32 * 功    能: 设置LED相应的IO口
33 * 入口参数: 无
34 * 出口参数: 无
35 ****************************************************************************/
36 void InitLed(void)
37 {
38     P1DIR |= 0x01;      // P1.0定义为输出
39     LED1 = 1;           // LED1灯熄灭     
40 }
41 
42 /****************************************************************************
43 * 名    称: InitKey()
44 * 功    能: 设置按键相应的IO口
45 * 入口参数: 无
46 * 出口参数: 无
47 ****************************************************************************/
48 void InitKey(void)
49 {
50     P0SEL &= ~0x02;     //设置P0.1为普通IO口  
51     P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 
52     P0INP &= ~0x02;     //打开P0.1上拉电阻
53 }
54 
55 /****************************************************************************
56 * 名    称: KeyScan()
57 * 功    能: 读取按键状态
58 * 入口参数: 无
59 * 出口参数: 0为抬起   1为按键按下
60 ****************************************************************************/
61 uchar KeyScan(void)
62 {
63     if (KEY1 == 0)
64     {
65         DelayMS(10);
66         if (KEY1 == 0)
67         {
68             while(!KEY1); //松手检测
69             return 1;     //有按键按下
70         }
71     }
72     
73     return 0;             //无按键按下
74 }
75 
76 /****************************************************************************
77 * 程序入口函数
78 ****************************************************************************/
79 void main(void)
80 {
81     InitLed();              //设置LED1相应的IO口
82     InitKey();            //设置S1相应的IO口
83     
84     while(1)
85     {
86         if (KeyScan())    //按键按下则改变LED状态
87             LED1 = ~LED1;       
88     }
89 }
复制代码
相关文章
STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)
原理:当捕捉到信号的跳变沿时,将CNT的值所存到捕获寄存器CCR中,然后把两次的值相减,就可以得到脉宽或者频率。
1541 0
|
异构计算
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
865 0
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(上)
LED驱动控制专用电路
一、基本概述 TM1628是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU 数 字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电 表等数码管或LED显示设备。 二、特性说明 采用CMOS工艺 多种显示模式(10 段×7 位 ~ 13段×4 位) 最大支持矩阵按键10×2 辉度调节电路(8 级占空比可调) 串行接口(CLK,STB,DIO) 振荡方式:内置RC振荡 内置上电复位电路 内置数据锁存电路
123 0
LabVIEW控制Arduino采集电位器电压(基础篇—4)
利用LIAT函数库中模拟IO的功能,通过Arduino Uno控制板上模拟输入端口实现对电压的测量,并显示在LabVIEW前面板上。
|
编解码 机器人 芯片
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
2062 0
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
|
异构计算
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
1290 0
实验二 基于FPGA的分频器的设计(基本任务:设计一个分频器,输入信号50MHz,输出信号频率分别为1KHz、500Hz及1Hz。拓展任务1:用按键或开关控制蜂鸣器的响与不响。拓展任务2:用按键或开)
|
异构计算
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(下)
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(下)
851 0
实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计(下)
|
传感器 开发工具 git
STM32:GPIO输入(硬件部分)(内含实验现象+按键介绍+传感器模块介绍+硬件电路)
STM32:GPIO输入(硬件部分)(内含实验现象+按键介绍+传感器模块介绍+硬件电路)
258 0
STM32:GPIO输入(硬件部分)(内含实验现象+按键介绍+传感器模块介绍+硬件电路)
|
存储 编解码 芯片
单片机:ADC模数转换实验(内含ADC介绍+XPT2046芯片介绍+硬件电路设计+软件编程设计+原始代码)
单片机:ADC模数转换实验(内含ADC介绍+XPT2046芯片介绍+硬件电路设计+软件编程设计+原始代码)
992 0
单片机:ADC模数转换实验(内含ADC介绍+XPT2046芯片介绍+硬件电路设计+软件编程设计+原始代码)