1. 点亮第一个灯
1.1 LED 灯结构组成
LED 灯(发光二极管)是一种半导体光源,主要结构包括以下部分:
- 外壳:通常由塑料或玻璃制成,用于保护内部元件。
- 发光材料:LED 最核心的部分,由特殊半导体材料制成,例如:常见的 InGaN(氮化铟镓)或 AlInGaP(铝铟镓磷)。
- 芯片:用于产生光的发光二极管芯片。
- 引线:提供电连接的金属引线。
- 焊点:将LED 芯片与引线连接在一起的焊接点。
- 电极:负责连接半导体材料与外部电路,通常由金属制成。
- 反射腔:用于增强发光效果的一个结构,将发出的光反射到正面。
1.2 LED 灯发光原理
LED(发光二极管)发光原理基于半导体特性。在半导体中,存在着两类载流子:电子(n型半导体)和空穴(p型半导体)。当n型与p型半导体材料接触时,会在交界处形成一个层结。当施加适当的电压时,层结中空穴和电子可重组并释放能量。这个能量以光子的形式释放出来,产生光。
1.3 LED 灯驱动原理
LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。 LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。
- 灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。
- 输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。
需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。
1.4 LED灯原理图
原理图中,将LED的正极接入开发板的PA14引脚,负极接入限流电阻R17再到GND。通过LED灯的驱动原理可以知道,我们只要控制开发板的PA14引脚输出高电平,即可点亮LED;
1.5 LED 灯驱动流程
1.5.1 开启SYSCONFIG配置工具
在CCS中新建一个空白工程 empty。
在CCS的左侧工作区中找到并打开empty.syscfg文件。
在sysconfig的UI界面中,左侧可以选择MCU的外设,我们找到并点击GPIO选项卡,在GPIO中点击ADD,就可以添加一组GPIO。
1.5.2 设置端口参数
设置GPIO的参数。
参数说明
Name :GPIO实例的自定义名称。默认情况下,名称从数字后缀“0”开始;不过,我们可自定义名称以反映模块用途(例如,将 GPIO 命名为“LED1”,这样我们就知道这个引脚是专门用于控制LED)。
Port :GPIO实例在所在端口。LED是接到了GPIOA14引脚,只能选择GPIOA。
Port Segment :设置端口上下拉电阻。注意是端口上下拉,是设置整个GPIOA端口。
1.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。
1.5.4 更新文件
将之前在.syscfg文件中的配置保存。
可以通过快捷键
Ctrl+S
进行快速保存
保存.syscfg文件后,将工程编译。
编译方法:在CCS中的工程文件夹处,右键工程文件夹选择
Build Project(s)
选项。
编译之后,可以看到在Debug文件夹下多了两个文件,ti_msp_dl_config.c
和 ti_msp_dl_config.h
。这两个文件就是基于刚才我们保存的.sysfig文件生成的外设底层驱动配置代码。
1.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. 点灯验证
3.6.1. 灯的控制代码
在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)。它用来确保循环内有一定的延时。
3.6.2. 编译工程并下载仿真
编译。
对下载选项配置。对工程文件夹名右键,进入工程配置界面。
当前我使用的是J-LINK OB进行仿真下载。所以在下载选项的配置如图。
J-LINK OB与开发板的接线如下:
J-LINK OB | 地猛星 |
---|---|
GND | GND |
VCC(3V3) | 3V3 |
SWCLK | CLK |
SWDIO | DIO |
以上操作完成之后,进行下载仿真。
下载之后,打开仿真界面:
点击蓝色按钮即可运行仿真了。这个时候代码就已经下载进去了。 编译下载成功就可以看到开发板上的A14这个灯开始缓慢闪烁了。