嵌入式学习2--点灯

本文详细介绍了一种基于嵌入式系统的流水灯实现方法,包括理解原理图、配置GPIO寄存器、设置输入输出模式及输出电平。通过具体代码示例,展示了如何控制GPIO输出高低电平,实现LED灯的点亮与熄灭,适用于初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点灯可以说是嵌入式界的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,都能做出来

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值