3. 点亮第一个灯
3.1 LED 灯结构组成
LED 灯(发光二极管)是一种半导体光源,主要结构包括以下部分:
- 外壳:通常由塑料或玻璃制成,用于保护内部元件。
- 发光材料:LED 最核心的部分,由特殊半导体材料制成,例如:常见的 InGaN(氮化铟镓)或 AlInGaP(铝铟镓磷)。
- 芯片:用于产生光的发光二极管芯片。
- 引线:提供电连接的金属引线。
- 焊点:将LED 芯片与引线连接在一起的焊接点。
- 电极:负责连接半导体材料与外部电路,通常由金属制成。
- 反射腔:用于增强发光效果的一个结构,将发出的光反射到正面。
3.2 LED 灯发光原理
LED(发光二极管)发光原理基于半导体特性。在半导体中,存在着两类载流子:电子(n型半导体)和空穴(p型半导体)。当n型与p型半导体材料接触时,会在交界处形成一个层结。当施加适当的电压时,层结中空穴和电子可重组并释放能量。这个能量以光子的形式释放出来,产生光。
3.3 LED 灯驱动原理
LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。 LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。
- 灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。
- 输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。
需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。
3.4 LED灯原理图
原理图中,将LED的正极接入开发板的PA14引脚,负极接入限流电阻R17再到GND。通过LED灯的驱动原理可以知道,我们只要控制开发板的PA14引脚输出高电平,即可点亮LED;
3.5 LED 灯驱动流程
3.5.1 开启SYSCONFIG配置工具
在Keil中打开SDK中的空白工程 empty。
在Keil的主界面打开empty.syscfg文件,在empty.syscfg文件打开的情况下,再打开SYSCONFIG的GUI界面。
在sysconfig中,左侧可以选择MCU的外设,我们找到并点击GPIO选项卡,在GPIO中点击ADD,就可以添加一组GPIO。
3.5.2 设置端口参数
设置GPIO的参数。
参数说明
Name :GPIO实例的自定义名称。默认情况下,名称从数字后缀“0”开始;不过,我们可自定义名称以反映模块用途(例如,将 GPIO 命名为“LED1”,这样我们就知道这个引脚是专门用于控制LED)。
Port :GPIO实例在所在端口。LED是接到了GPIOA14引脚,只能选择GPIOA。
Port Segment :设置端口上下拉电阻。注意是端口上下拉,是设置整个GPIOA端口。
3.5.3 设置引脚参数
设置引脚为输出模式,设置引脚默认输出低电平,设置引脚为下拉模式,设置引脚为GPIOA_14引脚,不开启中断事件。
参数说明
Name:为用户自定义的引脚名称,为了见名知意这里直接根据引脚号进行设置,设置为PIN_14。
Direction:设置引脚模式或者说设置方向,有两个选项,输入和输出。这里我们是控制灯,选择为输出模式。
Initial Value:设置引脚的初始状态,只有在配置为输出模式时才可以设置。有两个选项,清除和置位。清除即输出低电平,置位即输出高电平。
IO Structure:设置IO结构。有多个选项,默认(Any)、标准(Standard)、唤醒(Standard with Wake)、高速(High-Speed)以及可以容忍5V(5V Tolerant Open Drain)的结构。
Internal Resistor:设置引脚的上下拉电阻。有三个选项,不设置、设置上拉和设置下拉电阻。这里根据LED灯的接法,选择了下拉电阻。
Assigned Pin:设置引脚号。要控制哪一个引脚就填写对应的引脚号,比如开发板中的LED是接到了GPIOA14,那么就填入14。
3.5.4 更新文件
将之前在SYSCONFIG中的配置保存。
回到Keil中更新操作。
确认更新之后,可以看到我们的 empty.syscfg 文件内容更新为我们设置的参数。
到这里还没有结束,我们还需要确认.c和.h文件是否更新。我们直接编译,编译后就会自动的更新到Keil中。如果没有更新,我们将sysconfig中的文件的内容复制过来。在sysconfig中打开配置的.C文件。
将文件内容全部复制更新到Keil中的.c文件中。
.h文件同上,一起全部复制更新到Keil的.h文件中。
3.5.5 控制引脚状态
在dl_gpio.h库函数文件中,有三个函数可以控制引脚状态。
相关函数说明
__STATIC_INLINE void DL_GPIO_setPins(GPIO_Regs* gpio, uint32_t pins)
该函数为控制引脚输出高电平,按照本例程中LED的引脚,则可以写为 DL_GPIO_setPins(LED1_PORT,LED1_PIN_14_PIN);
__STATIC_INLINE void DL_GPIO_clearPins(GPIO_Regs* gpio, uint32_t pins)
该函数为控制引脚输出低电平,按照本例程中LED的引脚,则可以写为 DL_GPIO_clearPins(LED1_PORT,LED1_PIN_14_PIN);
__STATIC_INLINE void DL_GPIO_togglePins(GPIO_Regs* gpio, uint32_t pins)
该函数为控制引脚的电平翻转,如果原来是高电平则变为低电平,如果原来是低电平则变为高电平。按照本例程中LED的引脚,则可以写为DL_GPIO_togglePins(LED1_PORT,LED1_PIN_14_PIN);
3.6 点灯验证
在empty.c中,输入以下代码:
#include "ti_msp_dl_config.h"
//自定义延时(不精确)
void delay_ms(unsigned int ms)
{
unsigned int i, j;
// 下面的嵌套循环的次数是根据主控频率和编译器生成的指令周期大致计算出来的,
// 需要通过实际测试调整来达到所需的延时。
for (i = 0; i < ms; i++)
{
for (j = 0; j < 8000; j++)
{
// 仅执行一个足够简单以致于可以预测其执行时间的操作
__asm__("nop"); // "nop" 代表“无操作”,在大多数架构中,这会消耗一个或几个时钟周期
}
}
}
int main(void)
{
SYSCFG_DL_init();
while (1)
{
DL_GPIO_clearPins(LED1_PORT,LED1_PIN_14_PIN);//输出低电平
delay_ms(1000);//延时大概1S
DL_GPIO_setPins(LED1_PORT,LED1_PIN_14_PIN); //输出高电平
delay_ms(1000);//延时大概1S
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
代码扩展
asm("nop"); 是一个内联汇编指令,表示“无操作”(NOP)。它用来确保循环内有一定的延时。
编译下载就可以看到开发板上的A14这个灯开始缓慢闪烁了。