一,了解LED灯的原理
LED灯也叫做发光二极管,具有二极管的单向导电的特征,即只有在正极输入高电平和负极输入低电平时才会形成回路,二极管才能够发光。
三极管特性,三极管常用作开关和放大电路,三极管分为NPN型和PNP型,NPN管内部由1个P型半导体和2个N型半导体组成而PNP管由2个P型半导体和1个N型半导体组成,所以在结构上是不同的
分别如下:
另外两种三级管的电流的输出方向不同:
在NPN管种电流从B(基极)极和C(集电极)极流入,从E(发射极)极输出,而PNP管种E极作为输入极,B极和C极作为输出极,二者应用场合也有所不同。NPN型三极管在B极接入高电平时导通,低电平时不导通 ,而PNP型三极管在B极接入低电平时导通,高电平时不导通。
二,找到发光二极管在CPU中对应的引脚设置功能
1,在开发板上找到LED灯的位置,并找到对应的器件名,例如以LED5为例
2,找到后在设备板的原理图上搜索LED5得到如下电路图:
思路:紫色箭头代表LED5所在位置,可以看出LED5的正极接的是电源正极的33V电压,高电平,所以如果想要LED5能够成功点亮的话应该在负极施加一个低电平,在电路图中LED5的负极接上了一个三极管(NPN型,黄色箭头处),之后再接地,所以我们只有让LED5的负极成功接地才可以使电路导通,即要使三极管导通,通过前面可知NPN型三极管在基极通高电平时导通,所以应想法设法将三极管的基极通高电平,顺着电路向左看,红色箭头处所指即为LED5接在核心板上的引脚号。
3,通过上一步找到的引脚号,复制到核心板中查询该引脚由芯片中的哪个寄存器控制
如上图为搜索结果,图中,红色箭头所指处为该引脚由寄存器GPF组中的第三组中的第五号引脚控制,复制该寄存器组名(GPF3) 到芯片手册中进行查找,并将该寄存器配置为输出功能,再将其输出电平设置为高电平即可。
Base Address (寄存器组的基地址) :0x1140_0000
Address (寄存器实际地址) = 基地址 + 0x01e0 =0x114001e0
该寄存器中只使用 20 - 23 号共4个bit位作为配置功能,且当该4个bit位的值为0x1时配置为输出功能。即将第20号bit位置为1即可,但由于考虑到,可能其他3个bit位可能不为1,因此保险起见先将这4个bit位先进行置零操作再将第20号bit位置一。
现在我们只成功配置了该寄存器为输出功能,还没有将其输出模式设置为输出高电平,因此还需找到其对应的数据寄存器,该寄存器与配置寄存器同属一个寄存器组GPF3,关键字为GPF3DAT,表示数据寄存器,查找后可得:
同样:
Base Address (寄存器组的基地址) :0x1140_0000
Address (寄存器实际地址) = 基地址 + 0x01e4 =0x114001e4
该引脚使用0 - 5号bit位表示数据位。
紫色下划线的翻译大致为:当配置为输出端口时,引脚的状态应与对应的位相同,由于该寄存器引脚为5,因此对应的第五个bit为应被置为1时代表输出高电平,LED5灯亮起,当将该位置为0时输出低电平时LED5灯熄灭。
三,实现LED5灯的各种点亮
1,最简单的常亮,由上可知修改对应的bit位即可达到控制LED5灯的亮灭,所以将该引脚的bit位置为1后即可点亮。程序如下:
#define GPF3CON *(volatile unsigned int*) 0x114001e0
#define GPF3DAT *(volatile unsigned int*) 0x114001e4
void init_led5() //初始化LED灯,即配置功能
{
GPF3CON = GPF3CON & (~(0xf << 20)) | (0x1 << 20); //将配置寄存器的20-23号位清零后将第20位置为1 表示为输出功能
}
void led5_on() //控制LED灯亮
{
GPF3DAT |= (0x1 << 5); //将数据寄存器的第五号比特位置为1 后LED灯亮
}
void led5_off() //控制LED灯灭
{
GPF3DAT &=(~(0x1 <<5)) ; //将数据寄存器的第五号比特位置为0后LED灯灭
}
int main()
{
init_led5();
led5_on();
while(1) ; //使程序不结束,保持LED灯为常亮状态
}
结果为常亮。
如果想实现闪烁的样式,在亮灯与灭灯之后加入一个消耗时间的循环(让CPU短暂处于循环)如:
#define GPF3CON *(volatile unsigned int*) 0x114001e0
#define GPF3DAT *(volatile unsigned int*) 0x114001e4
void init_led5()
{
GPF3CON = GPF3CON & (~(0xf << 20)) | (0x1 << 20); //将配置寄存器的20-23号位清零后将第20位置为1 表示为输出功能
}
void led5_on()
{
GPF3DAT |= (0x1 << 5); //将数据寄存器的第五号比特位置为1
}
void led5_off()
{
GPF3DAT &=(~(0x1 <<5)) ;
}
void delay() //设置延时函数
{
int i;
for(i=1;i<100000;i++);
}
int main()
{
init_led5();
while(1)
{
led5_on(); //实现亮-灭循环
delay();
led5_off();
delay();
}
}
结果为闪烁。
如果想实现流水灯,那么将使用这个步骤实现其他LED灯的初始化和配置即可。