第二部分 基础篇-第 1章 CC2530流水灯
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
其中,调试接口就是给我们烧程序的,我们并不用管它;通用 IO 就是我们今天的实验要讲解的;通用 IO 中断将会在按键的中断实验里讲解;外设 IO 将会在定时器、串口、ADC 里都会有讲解。
最后说明一下,就是 CC2530 的 IO 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 IO 的所有寄存器的类型及其具体内容。
1.2 CC2530 与 51 单片机比较
跟传统的 8051 单片机不一样,CC2530 虽然也是 8051 内核,但是其 IO 端口的输入输出,需要配置寄存器来实现,这个类似于 AVR、ARM 等单片机,而 51 单片机可以直接给某个 IO 端口赋值,或者直接读取某个 IO 端口的输入电平。下面给出 51 单片机与CC2530 管脚输入输出对比表。
2 实验详解
2.1 实验目的
1)、通过实验掌握CC2530芯片GPIO的配置方法,带你一步步走进嵌入式大门;
2)、握Led驱动电路及开关Led的原理。
2.2实验设备
硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。
2.3实验相关电路图
发光二极管是属于二极管的一种,具有二级管单向导电特性,即只有在正向电压(二极管的正极接正,负极接负)下才能导通发光。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口为例):
(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
本章参考代码
推荐阅读
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第4章 定时器(HAL库)
-
第二部分 基础篇 - 第2章 Systick系统定时器
-
第二部分 基础篇-第4章 定时器 - CC2530查询方式使用定时器T1
-
第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3
-
《嵌入式-STM32开发指南》第二部分 基础篇 - 第2章 Systick系统定时器(HAL)
-
第二部分 基础篇 - 第10章 低功耗
-
第二部分 基础篇-第8章 CC2530系统睡眠唤醒--定时器唤醒
-
第二部分 基础篇-第11章 CC2530随机数发生器
-
第二部分 基础篇-第4章 定时器-CC2530中断方式使用定时器T3
-
第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11