嵌入式学习2--点灯

点灯可以说是嵌入式界的Hello world了,基本在开始学习嵌入式编程的时候都是先点灯,

同事开玩笑说,点一盏灯是Hello world,点流水灯是Hello Hello world,按键点灯就是

外语版的Hello world,^_^

1.点灯肯定是要结合原理图的,所以我们的第一步就是先看看原理图,原理图上可以看到,有5盏灯是接在GPIO上的,

并且是GPIO输出方式,那我们首先确认的是GPIO需要输出低电平,灯才会亮,因为灯的另一端是接的3.3V电源,也就

是高电平,需要形成一个通路,灯才会亮,所以需要GPIO输出一个低电平

嵌入式学习2--点灯_第1张图片

 

2.还可以看到GPIO上有不同的分组,如GPIOE/GPIOC,这个分组会影响到我们配置的寄存器地址,这个需要看看datasheet,以下将与GPIO输入输出的寄存器列出来了,一般点灯需要用到的也就是这几个寄存器

嵌入式学习2--点灯_第2张图片

嵌入式学习2--点灯_第3张图片

 嵌入式学习2--点灯_第4张图片

点灯的程序流程:

1)配置PIN脚为GPIO工作模式(GPIOxALTFN0/GPIOxALTFN1)

2)设置输入输出模式(GPIOxOUTENB)

3)设置输出电平(GPIOxOUT) 

4)如果为输入模式,就可以检测GPIO 的电平来做处理(GPIOxPAD)

/*

配置GPIOE组的寄存器

GPIOEALTFN0:是负责GPIO 0-15的功能设置,原理图上可以看到E组为13,在此范围内

GPIOEOUTENB :一共有32位,每位代表一个GPIO

GPIOEOUT:一共32位,每位代表一个GPIO

*/ 

#define GPIOEALTFN0   (*((volatile unsigned int *)(0xC001E020)))
#define GPIOEOUTENB (*((volatile unsigned int *)(0xC001E004)))
#define GPIOEOUT         (*((volatile unsigned int *)(0xC001E000)))

/*

配置GPIOC组的寄存器

由于剩下的灯都是在C组,所以只需要配置一次就可以操作整个C组的灯了

*/ 

#define GPIOCALTFN0   (*((volatile unsigned int *)(0xC001C020)))
#define GPIOCALTFN1   (*((volatile unsigned int *)(0xC001C024)))
#define GPIOCOUTENB (*((volatile unsigned int *)(0xC001C004)))
#define GPIOCOUT        (*((volatile unsigned int *)(0xC001C000)))

void _start(void)  //裸板程序,没有main函数,从_start开始

void delay(int val);

void _start(void)
{
  

     GPIOEALTFN0 &= ~(3<<26);  //设置为GPIO,26.27、2个bit置0

嵌入式学习2--点灯_第5张图片
    嵌入式学习2--点灯_第6张图片

 

 

    GPIOEOUTENB |= (1<<13);   //设置为输出模式,13bit置1
    嵌入式学习2--点灯_第7张图片


    

    GPIOCALTFN0 |= (1<<16) | (1<<14) | (1<<24);  //设置C8/7/12为GPIO
    GPIOCALTFN1 |= (1<<2);  ////设置C17为GPIO
    GPIOCOUTENB |= (1<<17) | (1<<12) | (1<<8) | (1<<7);  //设置17,12,8,7输出使能
    
    while(1)
    {
        GPIOEOUT &= ~(1<<13);  //输出低电平
        delay(0x4000000); 
        GPIOEOUT |= (1<<13);   //输出高电平
        delay(0x4000000);
        嵌入式学习2--点灯_第8张图片

 


        GPIOCOUT &= ~(1<<17);  //输出低电平
        delay(0x4000000); 
        GPIOCOUT |= (1<<17);   //输出高电平
        delay(0x4000000);
        
        GPIOCOUT &= ~(1<<8);  //输出低电平
        delay(0x4000000); 
        GPIOCOUT |= (1<<8);   //输出高电平
        delay(0x4000000);
        
        GPIOCOUT &= ~(1<<7);  //输出低电平
        delay(0x4000000); 
        GPIOCOUT |= (1<<7);   //输出高电平
        delay(0x4000000);
        
        GPIOCOUT &= ~(1<<12);  //输出低电平
        delay(0x4000000); 
        GPIOCOUT |= (1<<12);   //输出高电平
        delay(0x4000000);
    }
}

void delay(int val)
{
    volatile int i = val;
    
    while(i--);
}

这个就是流水灯的点亮过程,点灯的就是加一个按键,检测按键是否按下,来判断一下然后对灯做处理,只要能看懂原理图和datasheet,都能做出来

以此记录,以备不时之需,加油走下去

 

 

你可能感兴趣的:(嵌入式)