CC2530 通用IO口输出_流水灯实验

实验内容

  • 使用IAR Embedded Workbench编写实验代码,使得LED功能模块上的四个LED(LED1、LED2、LED3、LED4)灯呈流水灯顺时针转动。

实验目的

  • 熟悉IAR集成开发环境;
  • 了解LED的工作原理;
  • 掌握CC2530上的IO口作为普通输出端口的配置方法。

实验环境

实验所需硬件

序号 名称 数量 备注
1 电脑 1台 系统Windows7及以上
2 CC2530底座模块 1个 ·
3 LED模块 1个 ·
4 CC Debugger 仿真器和连接线 1套 ·
5 USB线 1根 ·
6 流水灯实验代码 1份 ·

实验所需软件

CC2530底座 & LED模块 & CC Debugger 仿真器和连接线

实验硬件

USB线

实验硬件

实验要求

  • 掌握IAR程序编写、编译、链接和下载方法;
  • 掌握PxDIR和PxSEL两个寄存器的功能以及配置方法;
  • 能够自行编程控制LED模块上四个LED的亮和灭,并编程实现流水效果。

实验原理

I/O介绍-IO口作为输出端口

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

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

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

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

本实验使用P02、P03、P16、P17口为输出,驱动LED1、LED2 、LED3、LED4。实验相关寄存器:P0DIR、P1DIR和P0SEL、P1SEL定义如表所示:

寄存器 备注
P0(0x80) P0[7:0] 可位寻址的I/O寄存器
P0DIR(0xFD) P0口输入输出设置寄存器,0:输入,1:输出
P0SEL(0xF3) P0口功能选择,0:通用I/O,1:外部设备功能

P0_2 定义为P0的2口,当输出低电平时,LED1 灯亮; P0_3 定义为P0的3口,当输出低电平时,LED2 灯亮; P1_6 定义为P1的6口,当输出低电平时,LED3 灯亮; P1_7 定义为P1的7口,当输出低电平时,LED4 灯亮。

按照表格寄存器内容,我们对LED1,也就是P0_2口进行配置,当P0_2输出低电平时LED1被点亮,所以LED1相关的配置如下。

P0SEL &=~0x04; // P0_2作为普通IO口
P0DIR |= 0x04; // P0_2定义为输出

硬件设计

本次实验用到的元器件是4个LED灯。其电路在蜂巢实验套件上已经设计好了(如图所示)。LED1接P0_2,LED2接P0_3,LED3接P1_6,LED4接P1_7。其连接原理图如下:
连接原理图

实验步骤

① CC2530底座模块安装LED模块,用CC Debugger连接底座与计算机:

模块组装

② 轻按CCDebugger复位按键,指示灯变绿,表示连接正常。如下图:

模块组装

③ 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:

操作步骤

④ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):

cd workspace

⑤ 运行clone命令:

git clone https://github.com/aiotcom/eps.git

下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code -> DownLoad ZIP 下载所有工程代码。如下图所示:
下载代码
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。

⑥ 打开 IAR Embedded Workbench 工程软件,点击工具栏: File -> Open -> Workspace,选择工程文件:CC2530基础实验\1.流水灯\LED.eww 并打开。

打开工程

选择文件

⑦ 点击Make按钮,重新编译文件,显示没有错误。

文件编译

⑧ 点击Download and Debug按钮,将程序下载到模块中。

下载程序

代码下载成功

⑨ 点击X退出仿真模式。

退出仿真

⑩ 移除CC Debugger仿真器,采用USB线供电。

采用USB线供电

⑪ 观察实验:LED1、LED2、LED3、LED4呈流水灯状闪烁,每次只点亮一个。

代码讲解

① 程序目录结构,如下图。主要的工程文件是delay.c、LED.C、main.c。

代码目录结构

② main.c代码,完成整个代码的逻辑控制:

void main(void)
{
    Hal_Init_32M();//初始化系统32M时钟
    LED_Init();//初始化LED控制接口

    while(1)
    {
        LED1=0;//点亮LED1
        delay_ms(500);//延时500ms
        LED1=1;//熄灭LED1
                
        LED2=0;//点亮LED2	
        delay_ms(500);//延时500ms
        LED2=1;//熄灭LED2
                
        LED3=0;//点亮LED3	
        delay_ms(500);//延时500ms
        LED3=1;//熄灭LED3
                
        LED4=0;//点亮LED4		
        delay_ms(500);//延时500ms
        LED4=1;//熄灭LED4
    }
}

③ LED.c为LED驱动代码,代码实现对LED灯控制的IO进行初始化设置IO口输出模式。

void LED_Init(void)
{
    P0DIR |= 0x0C;//P0.2、P0.3定义为输出
    P1DIR |= 0xC0;//P1.6、P1.7定义为输出
    LED1=1;LED2=1;LED3=1;LED4=1;//初始化熄灭四个LED灯
}

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认CCDebugger驱动否安装。
    • 轻按CCDebugger仿真器上的按键,指示灯是否为绿色。不是绿色连接有问题。
    • CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。

实验思考

  1. 实现LED1~LED4,以1秒的间隔依次亮起。

  2. LED1、LED2亮时LED3、LED4灭;LED1、LED2灭时LED3、LED4亮。