外观
六、LED控制实验
LED灯基础知识
LED灯结构组成
LED灯,也称发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的内部是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,整个晶片被环氧树脂封装起来。
LED灯发光原理
半导体晶片由两部分组成,一部分是P型半导体,另一端是N型半导体。这两种半导体连接起来的时候,它们之间就形成了一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED灯发光的原理。
LED灯驱动原理
驱动LED灯,也就是使LED灯点亮,首先查看原理图,查看LED灯引脚的连接关系,可通过对应单片机引脚输出高低电平,从而改变LED灯两侧电势差形成电流回路,点亮LED灯。
LED灯引脚原理图
核心板板载LED引脚图:
底板板载LED引脚图:
点亮LED灯
项目分析
本次项目完成点亮底板LED灯实验,核心板板载LED灯留给大家自行修改进行点亮;
通过前面的基础知识说明,我们已经知道LED灯点亮的原理与LED灯连接的引脚;
- LED2--->PA28
- LED3--->PA31
在LED灯的正极是连接3.3V,中间接入了一个1K的限流电阻防止LED灯烧坏;
当我们将对应引脚配置为高电平时,单片机引脚高电平输出(3.3V),此时没有电压差,没有电流流过,不能点亮LED;
当我们将对应引脚配置为低电平时,单片机引脚低电平输出(0V),此时有电压差,有电流流过,LED灯被点亮;
配置流程
按照开发环境搭建的流程,导入一个空白工程,一般我们使用GPIO的端口,都需要有以下几个步骤。
- 开启GPIO的端口时钟
- 配置GPIO的模式
- 配置GPIO的输出
双击打开.syscfg配置界面,将芯片型号改为48Pin-MSPM0G3507
在sysconfig的UI界面中,左侧可以选择MCU的外设,我们找到并点击GPIO选项卡,在GPIO中点击ADD,就可以添加一组GPIO。
设置GPIO组的参数;
参数说明
Name : GPIO实例组的自定义名称,一般会将其命名为实际外设名称,例如“LED”,这样就知道这个组中的引脚都是用于LED灯;
Port :GPIO实例组所在端口,项目底板两个LED灯均是接在PA端口上,于是选择PortA;若有不同端口的引脚,则选择Any-任意;
Port Segment : GPIO实例组中端口引脚位于的位置,G3507芯片GPIO是32位的,分为高16位和低16位,此处可以指定减少不必要的判断代码;
设置GPIO引脚的参数:
参数说明
Name : GPIO引脚的自定义名称,一般会将其命名为实际外设名称,例如“LED2”,这样就知道这个引脚是连接LED2;
Direction :GPIO引脚方向,选择输入/输出,此处选择输出;
Initial Value : GPIO引脚初始化电平,选择高电平/低电平,此处选择高电平,默认不打开LED;
Assigned Port Segment : 指定GPIO引脚位于高16位还是低16位,此处选择高16位;
Assigned Pin : 指定GPIO引脚位号,仅支持输入0-31数字,此处选择28,也就是PA28;
Pinmux : LED2引脚位于PA28,自动根据参数进行识别,若没有指定,则可以自行选择;
按照一样的流程配置LED3引脚;
代码编写
配置完成,Ctrl+S保存关闭,选择上方的Project,编译工程,应该是无报错无警告;
为了方便程序复用,这里在项目中添加一个BSP_Library文件夹,并在其中增加四个文件;
C
#include "bsp_led.h"
/*
函数内容:led灯控制函数
函数参数:ledbit--LED灯,conbit--打开或关闭
返回值:无
*/
void control_Led(uint8_t ledbit, uint8_t conbit)
{
if(ledbit == LED2)
{
if(conbit == LED_OPEN){
DL_GPIO_clearPins(LED_PORT,LED_LED2_PIN);
}
else {
DL_GPIO_setPins(LED_PORT,LED_LED2_PIN);
}
}
if(ledbit == LED3)
{
if(conbit == LED_OPEN){
DL_GPIO_clearPins(LED_PORT,LED_LED3_PIN);
}
else {
DL_GPIO_setPins(LED_PORT,LED_LED3_PIN);
}
}
}
1
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
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
C
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "ti_msp_dl_config.h"
#define LED2 0x01
#define LED3 0x02
#define LED_OPEN 0x03
#define LED_CLOSE 0x04
void control_Led(uint8_t ledbit, uint8_t conbit);
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
C
#include "bsp_delay.h"
/*
函数内容:ms延时函数
函数参数:ms--延时时长
返回值:无
*/
void delay_ms(uint32_t ms) {
uint32_t i = 0;
for (i = 0; i < ms; i++) {
delay_cycles(CPUCLK_FREQ/1000);
}
}
/*
函数内容:us延时函数
函数参数:us--延时时长
返回值:无
*/
void delay_us(uint32_t us){
while(us--){
delay_cycles(CPUCLK_FREQ/1000000);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C
#ifndef __BSP_DELAY_H
#define __BSP_DELAY_H
#include "ti_msp_dl_config.h"
void delay_ms(uint32_t ms);
void delay_us(uint32_t us);
#endif
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
函数说明
这些函数均是官方编写好的API函数,在M0_SDK/docs/chinese/driverlib/Driverlib_Overview_CN.html中有详细介绍,强烈建议不懂的人自行查看。
DL_GPIO_clearPins : 将GPIO组中的引脚清零,也就是变成低电平;
DL_GPIO_setPins : 将GPIO组中的引脚设置为1,也就是变成高电平;
delay_cycles : 延迟指定的CPU周期数,此处默认时钟为CPUCLK_FREQ = 32Mhz,计数一个周期是1s,÷ 1000也就是延时1ms;
函数内容编写完成后,点击Project/Properties,设置工程参数信息;
烧录器根据自己手里的,选择Jlink或者TI的烧录器;
编译优化等级设置为-0;
将刚才新建的文件夹,包含到搜索库路径中;点击保存即可
在empty.c中包含两个头文件,再次编译,应该是0错误0警告;
在main函数中加入以下代码,按照环境搭建中的介绍烧录下载代码,观察底板LED是否间隔1s进行闪烁;自此,LED控制实验结束。
C
#include "ti_msp_dl_config.h"
#include "bsp_led.h"
#include "bsp_delay.h"
int main(void)
{
SYSCFG_DL_init();
while (1) {
control_Led(LED2,LED_OPEN);
control_Led(LED3,LED_CLOSE);
delay_ms(500);
control_Led(LED2,LED_CLOSE);
control_Led(LED3,LED_OPEN);
delay_ms(500);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17