下面是我的CC2530的学习笔记之点灯部分。
第一步:分析原理图
找到需要对应操作的硬件
图 1
通过这个图1我们可以找到LED1和LED2连接的引脚,分别是P1_0和P1_1。
第二步 分析原理图
图 2
- 通过图2 确认P1_0和P1_1引脚连接到LED,并且这些引脚可以通过单片机控制。
LED连接到两个引脚:P1_0和P1_1,这两个引脚属于并行IO口。可以看到当P1_0和P1_1输出高电平时,LED灯就会亮。这两个引脚由单片机控制,当P1_0和P1_1输出1(0低电平)时,LED灯亮。
第三步 查手册设置引脚和配置寄存器:
第一步 将引脚设为通用模式
首先我们要知道 CC2530 有3组端口 P0 P1 P2 ---> P0 P1 有8个引脚 P2 有5个引脚。合起来有21个数字输入/输出引脚。可以配置为通用数字I/O或外设I/O信号,配置为连接到ADC、定时器或 USART 外设。这些 I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现。
I/O 端口具备如下重要特性:
- 21 个数字 I/O 引脚
- 可以配置为通用 I/O 或外部设备 I/O
- 输入口具备上拉或下拉能力
- 具有外部中断能力。
21 个 I/O 引脚都可以用作于外部中断源输入口。因此如果需要外部设备可以产生中断。外部中断功能也可以从睡眠模式唤醒设备。
对于CC2530单片机的P1_0和P1_1引脚,配置为通用I/O口而不是外设I/O口是因为我们需要直接控制这些引脚的电平状态来实现LED的点亮和熄灭。外设I/O口通常用于特定的硬件外设(如UART、SPI、I2C等),而在这种情况下,选择通用I/O口更适合用于简单的引脚电平控制。别纠结 反正就是选通用就对了。
图 3
图 4 此图来自手册
我们根据图3 和图4 篮框部分可以看到如果我们需要配置端口功能为通用IO口,就选择PxSEL寄存器因为我们是P1_0和P1_1引脚。 所以我们就选择P1SEL寄存器。
PxSEL寄存器:
PxSEL寄存器(这里的x可以是0、1或2)用来决定每个引脚的用途。你可以把它想象成一个开关板,每个开关对应一个引脚。这个开关可以让引脚变成普通的输入/输出口(就像家里的开关控制灯的开关),或者让引脚连接到单片机内部的特殊功能(比如UART、SPI等外设)。
默认情况下,当单片机复位(重启)后,所有的引脚都会被设置成普通的输入口。这就像家里的所有开关在重启后都默认是关闭状态,等你需要的时候再手动打开。
图 5 此图来自手册
要将P1_0和P1_1引脚配置为普通I/O口,可以这样设置:
P1SEL &= ~0x03; /将P1_0和P1_1配置为通用I/O 把第0位和第1位置为0。
引脚从0 开始 0 1 2 3 4 5 6 7 共8位0 0 0 0 0 0 0 0
/// 0 0 0 0 0 0 1 1 如果你要配置为外设IO 就把对应位,置为1就可以了
第二步 设置引脚方向为输出
在将方向设置为输出的时候,我们要先知道什么是输入输出,不需要多懂,简单了解一下就好了,懂这个为啥设为输出即可。
输入:输入是指检测各个引脚上的电平状态。
电平状态:电平状态分为高电平和低电平。高电平表示有电压,通常用数字符号1表示;低电平表示接地,通常用数字符号0表示。
应用示例:一个常见的输入例子是按钮。当按钮按下时,引脚检测到高电平(1);当按钮松开时,引脚检测到低电平(0)。
输出:输出是指控制引脚电平的高低状态。
电平状态:通过设置引脚的电平状态,可以控制外部设备。例如,高电平(1)可以点亮LED,低电平(0)可以熄灭LED。
应用示例:你提供的图片就是一个输出的例子。P1_0和P1_1引脚通过电阻连接到LED,当引脚输出高电平时,LED亮起;当引脚输出低电平时,LED熄灭。
图 6 此图来自手册
图 7
我们根据图6 和图7 篮框部分可以看到如果我们需要配置改变方向为输入,就选择PxDIR寄存器因为我们是P1_0和P1_1引脚。 所以我们就选择P1DIR寄存器。
PxDIR寄存器的作用
PxDIR寄存器就像一个控制面板,用来决定每个引脚是作为输入还是输出。每个引脚都有一个对应的开关(位),你可以通过这个开关来设置引脚的方向是输入还是输出。
图 8
代码如下:
P1SEL &= ~0x03; /将P1_0和P1_1配置为通用I/O
P1DIR |= 0x03; // 将P1_0和P1_1设置为输出
写到这里我们的寄存器配置就完成了。
第四步 软延时
void delay(int num)
{ int i = 0; for(i = 0; i < num; i++) { int j = 0; for(j = 0; j <400; j++) {}}
}
这个软延时不精准,但是能达到延时的作用了,为了闪烁嘛
下面我们就可以来编写简单的LED闪烁的代码了,下面是代码的流程图;
代码
那下面就请你根据这个图来完善你的代码喽 实现LED灯闪烁
#include "ioCC2530.h"
#define LED1 P1_0
#define LED2 P1_1 void LED_Init()
{ P1SEL &= ~0X03; P1DIR |= 0X03; LED1 = 0; LED2 = 0;
} void delay(int num)
{ int i = 0; for(i = 0; i < num; i++) { int j = 0; for(j = 0; j <400; j++) ; }
} void main()
{ LED_Init(); while(1) {LED1 = !LED1; LED2 = !LED2; delay(1000); }
}
芜湖 完结 撒花
附上原理图