CC2530 GPIO 控制LED灯

Posted 谭周强想学软件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CC2530 GPIO 控制LED灯相关的知识,希望对你有一定的参考价值。

GPIO简介

        I/O 也称为 General Purpose Input Output (通用输入/输出)简称为 GPIO、 I/O,是单片机通用输入输出接口的总称。通常情况下单片机的计算单元通过向 I/O 控制寄存器写入数据可以控制 I/O 口输入输出模式,实现对某些设备的控制或信号采集的功能。若将通用 I/O 进行组合配置可以实现较为复杂的总线控制接口和串行通信接口。

        CC2530 的 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。


寄存器介绍

CC2530的通用I/O端口相关的常用寄存器有下面4个:

(x表示端口)

PxSEL:端口功能选择,设置端口是通用I/O还是外设功能

 PxDIR:作为通用I/O时,用来设置数据的传输方向。

PxINP:作为通用输入端口时,选择输入模式是上拉下拉还是三态

 Px:数据端口,用来控制端口的输出或获取端口的输入。

C语言对寄存器位操作

1.某些位清0而不影响其他位

 使用“&=”将寄存器指定位清0,同时不影响其他位的值。

 例如:寄存器P0SEL的当前值是0x00,现需要将该寄存器的第1位、第3 位和第5位设置为0,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

首先将字节 0000 0000 中要操作的位设置为1,即0010 1010,在将该数值取反,即1101 0101,也就是~0x2A。再将该值与寄存器P1SEL“相与”,那么有0的位,即1、3、5位将被清0,其余的位会保持原来的值不变。

 正确写法:P0SEL &= ~0x2A;

对于寄存器的第n位的清0操作也可以写成:寄存器 &= ~(0x01<<(n));其道理是一样的。

2.某些位置1而不影响其他位

使用“|=”将寄存器指定位置1,同时不影响其他位的值

 例如:寄存器P1SEL的当前值是0x6c,现需要将该寄存器的第1位、第4位和第5位设置为1,同时不能影响该寄存器其他位的值,那么,在C语言中应该怎么编写代码呢?

首先将字节 0000 0000 中要操作的位设置为1,即0011 0010,也就是0x32。 再将该值与寄存器P1SEL“相或”,那个有1的位,即1、4、5位将被设置为1,其余的位会保持原来的值不变。

正确写法:P1SEL |= 0x32;

 对于寄存器的第n位的清0操作也可以写成:寄存器 |= (0x01<<(n));

通用I/O端口寄存器配置的基本思路

(LED灯接在P1_0、P1_1)

设置P0SEL寄存器,将P1_0、P1_1设置为通用I/O端口。

设置P0DIR寄存器,将P1_0和P1_1设置为输出。

设置I/O输出高电平或者低电平(0点亮/1熄灭)

代码实现

void LED_init(void)
{
   P1SEL&= ~(0x03<<0);      //设置P1_0,P1_1为通用I/O
   P1DIR |= (0x03<<0);      //设置P1.0 P1.1为输出
   P1_0=0;                  //P1_0点亮
   P1_1=1;                  //P1_1熄灭
}

主函数调用LED_init()函数就可以实现点亮灯。

以上是关于CC2530 GPIO 控制LED灯的主要内容,如果未能解决你的问题,请参考以下文章

CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭

cc2530控制两个LED灯交替闪烁,闪烁周期为0.5左右.其中p1_2连LED1p1-3连2

CC2530的通用IO端口(GPIO)输入和输出控制

#导入Word文档图片# CC2530 外部中断配置说明

CC2530的串口通信原理与应用

CC2530的中断系统及外部中断应用