欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第二部分 基础篇-第 1章 CC2530流水灯

程序员文章站 2022-06-09 19:27:14
...

1 理论分析

1.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 引脚都可以用作于外部中断源输入口。因此如果需要外部设备可以产生
中断。外部中断功能也可以从睡眠模式唤醒设备。图1是 CC2530 所有 IO 端口的功能图,在 CC2530 所有 IO 端口的功能中,我们用的最多就是:
 调试接口
 通用 IO
 通用 IO 中断
 外设 IO

第二部分 基础篇-第 1章 CC2530流水灯

图 1 CC2530 所有 IO 端口的功能图

其中,调试接口就是给我们烧程序的,我们并不用管它;通用 IO 就是我们今天的实验要讲解的;通用 IO 中断将会在按键的中断实验里讲解;外设 IO 将会在定时器、串口、ADC 里都会有讲解。
最后说明一下,就是 CC2530 的 IO 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 IO 的所有寄存器的类型及其具体内容。

1.2 CC2530 与 51 单片机比较

跟传统的 8051 单片机不一样,CC2530 虽然也是 8051 内核,但是其 IO 端口的输入输出,需要配置寄存器来实现,这个类似于 AVR、ARM 等单片机,而 51 单片机可以直接给某个 IO 端口赋值,或者直接读取某个 IO 端口的输入电平。下面给出 51 单片机与CC2530 管脚输入输出对比表。

表 1 51 单片机与 CC2530 管脚输入输出对比

第二部分 基础篇-第 1章 CC2530流水灯

2 实验详解

2.1 实验目的

1)、通过实验掌握CC2530芯片GPIO的配置方法,带你一步步走进嵌入式大门;
2)、握Led驱动电路及开关Led的原理。

2.2实验设备

硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。

2.3实验相关电路图

第二部分 基础篇-第 1章 CC2530流水灯

图2 LED电路图

发光二极管是属于二极管的一种,具有二级管单向导电特性,即只有在正向电压(二极管的正极接正,负极接负)下才能导通发光。P1.0引脚接发光二极管(D1)的负极,所以P1.0引脚输出低电平D1亮,P1.0引脚输出高电平D1熄灭, D2, D3同理。

2.4实验分析

现在我们知道了CC2530 的IO端口的使用,是要配置寄存器的,那么接下来,我们编写代码前需要知道的就是:
有哪些类型的 IO 端口控制寄存器;怎么配置这些 IO 端口控制寄存器。
本实验用到的 通用 IO,只需要配置 PxSEL、PxDIR这三个寄存器,那么
接下来对其进行配置:
(1) 希望配置P0.4、P1.0、P1.1 端口为:通用 IO、输出;
(2) PxSEL、PxDIR这两个寄存作用和配置方法如表1、2、3所示(以P0口为例):

表2 端口0的功能选择

第二部分 基础篇-第 1章 CC2530流水灯

表3 端口0的方向

第二部分 基础篇-第 1章 CC2530流水灯

(3) 由于CC2530寄存器初始化时默认值为(参考《CC2530中文数据手册完全版.pdf》):
P1SEL = 0x00;
P1DIR |= 0xff;
按照表格寄存器的内容,对LED配置如下:
P1SEL &=~0x03; //配置P1.0为通用IO口,默认为0的,可以不设
P1DIR |= 0x03; //P1.0、P1.1定义为输出
P0DIR |= 0x10; // P1.4 定义为输出
注意:(1) 0x01=0000 0001; (2) “|=”是先执行按位或运算,再赋值; (3) P1DIR |= 0x01;
最终结果是:bit0 相或后得 1,其它位保持不变。

2.5参考代码

/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED1 P1_0 //定义 LED1 为 P10 口控制
#define LED2 P1_1 //定义 LED2 为 P11 口控制
#define LED3 P0_4 //定义 LED3 为 P04 口控制

/**函数声明*********************************************************************/
void Delay(uint);  //延时函数
void InitIO(void); //初始化 LED 控制 IO 口函数

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
  InitIO();           //初始化 LED 灯控制 IO 口
  while(1)           //死循环
  {
    LED1 = !LED1;    // LED1 灯闪一次
    Delay(1000);
    LED2 = !LED2;    // LED2 灯闪一次
    Delay(1000);
    LED3 = !LED3;    // LED3 灯闪一次
    Delay(1000);
  }
}

/**
  * @brief     普通延时函数
  * @param     xms 延时长度
  * @retval    None
  */
void Delay(uint xms)
{
   uint i,j;
    for(i=xms;i>0;i--)
     for(j=587;j>0;j--);   
}

/**
  * @brief     初始化IO口
  * @param     None
  * @retval    None
  */
void InitIO(void)
{
  P1DIR |= 0x03;  //P10、 P11 定义为输出
  P0DIR |= 0x10;  //P04定义为输出
  LED1 = 1;
  LED2 = 1;
  LED3 = 1;       //LED 灯初始化为关
}

2.6实验现象

LED1、LED2、LED3依次闪烁。

2.7 实验总结

通过本实验,大家需要掌握以下 3 点:
 CC2530 通用 IO 使用需要配置相关寄存器;
 CC2530 通用 IO 寄存器的类型以及每个类型如何配置。
 I/O 端口具备如下重要特性:
(1) 21 个数字 I/O 引脚
(2) 可以配置为通用 I/O 或外部设备 I/O
(3) 输入口具备上拉或下拉能力
(4) 具有外部中断能力。

附:管理 IO 端口的寄存器类型

●IEN0(0xA8) — 中断使能 0
●IEN1(0xB8) — 中断使能 1
●IEN2(0x9A) — 中断使能 2
●P0 — 端口 0
●P1 — 端口 1
●P2 — 端口 2
●PERCFG — 外设控制寄存器
●APCFG — 模拟外设 IO 配置
●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

本章参考代码

点击进入

相关标签: CC2530 ZigBee