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灯亮灭