基于ARM的COTEX-A9开发板的LED灯点亮

一,了解LED灯的原理

         LED灯也叫做发光二极管,具有二极管的单向导电的特征,即只有在正极输入高电平和负极输入低电平时才会形成回路,二极管才能够发光。

        三极管特性,三极管常用作开关和放大电路,三极管分为NPN型和PNP型,NPN管内部由1个P型半导体和2个N型半导体组成而PNP管由2个P型半导体和1个N型半导体组成,所以在结构上是不同的

分别如下:

基于ARM的COTEX-A9开发板的LED灯点亮_第1张图片

 另外两种三级管的电流的输出方向不同:

基于ARM的COTEX-A9开发板的LED灯点亮_第2张图片在NPN管种电流从B(基极)极和C(集电极)极流入,从E(发射极)极输出,而PNP管种E极作为输入极,B极和C极作为输出极,二者应用场合也有所不同。NPN型三极管在B极接入高电平时导通,低电平时不导通 ,而PNP型三极管在B极接入低电平时导通,高电平时不导通。

 二,找到发光二极管在CPU中对应的引脚设置功能

        1,在开发板上找到LED灯的位置,并找到对应的器件名,例如以LED5为例

        2,找到后在设备板的原理图上搜索LED5得到如下电路图:

基于ARM的COTEX-A9开发板的LED灯点亮_第3张图片

         思路:紫色箭头代表LED5所在位置,可以看出LED5的正极接的是电源正极的33V电压,高电平,所以如果想要LED5能够成功点亮的话应该在负极施加一个低电平,在电路图中LED5的负极接上了一个三极管(NPN型,黄色箭头处),之后再接地,所以我们只有让LED5的负极成功接地才可以使电路导通,即要使三极管导通,通过前面可知NPN型三极管在基极通高电平时导通,所以应想法设法将三极管的基极通高电平,顺着电路向左看,红色箭头处所指即为LED5接在核心板上的引脚号。

        3,通过上一步找到的引脚号,复制到核心板中查询该引脚由芯片中的哪个寄存器控制

基于ARM的COTEX-A9开发板的LED灯点亮_第4张图片

         如上图为搜索结果,图中,红色箭头所指处为该引脚由寄存器GPF组中的第三组中的第五号引脚控制,复制该寄存器组名(GPF3) 到芯片手册中进行查找,并将该寄存器配置为输出功能,再将其输出电平设置为高电平即可。

基于ARM的COTEX-A9开发板的LED灯点亮_第5张图片

        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,表示数据寄存器,查找后可得:

基于ARM的COTEX-A9开发板的LED灯点亮_第6张图片

        同样:

        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灯的初始化和配置即可。

你可能感兴趣的:(ARM,arm,嵌入式硬件)