点灯可以说是嵌入式界的Hello world了,基本在开始学习嵌入式编程的时候都是先点灯,
同事开玩笑说,点一盏灯是Hello world,点流水灯是Hello Hello world,按键点灯就是
外语版的Hello world,^_^
1.点灯肯定是要结合原理图的,所以我们的第一步就是先看看原理图,原理图上可以看到,有5盏灯是接在GPIO上的,
并且是GPIO输出方式,那我们首先确认的是GPIO需要输出低电平,灯才会亮,因为灯的另一端是接的3.3V电源,也就
是高电平,需要形成一个通路,灯才会亮,所以需要GPIO输出一个低电平
2.还可以看到GPIO上有不同的分组,如GPIOE/GPIOC,这个分组会影响到我们配置的寄存器地址,这个需要看看datasheet,以下将与GPIO输入输出的寄存器列出来了,一般点灯需要用到的也就是这几个寄存器
点灯的程序流程:
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
GPIOEOUTENB |= (1<<13); //设置为输出模式,13bit置1
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);
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,都能做出来
以此记录,以备不时之需,加油走下去