ESP32实现点亮led灯
前言
点亮一个LED灯虽然简单,但代表的意义不一样,都说程序员入门第一个项目是“hello world”,但在嵌入式方面程序员的第一个项目是点亮led灯,接下来就一起点亮第一盏led灯。
一、如何点亮
1、通用输入/输出(GPIO)
在点亮led之前先来了解一下通用输入/输出(GPIO) GPIO 驱动可以用作多个用途,包括管脚设置,单位设置/重置,锁定机制,从端口管脚读入或者向端口管脚写入数据。
GPIO的工作模式: 输入: 浮空输入:在空闲状态下,输入高/低电平,GPIO_Mode_IN_FLOATING 浮空输入 上拉输入:在空闲状态下,输入高电平,GPIO_Mode_IPU 上拉输入 下拉输入:在空闲状态下,输入低电平,GPIO_Mode_IPD 下拉输入 模拟输入:输入的是模拟量 ADC,GPIO_Mode_AIN 模拟输入 输出: 推挽输出:高低电平都可输出,GPIO_Mode_Out_PP 推挽输出 开漏输出:只能输出低电平 (要得到高电平状态需要外接上拉电阻),GPIO_Mode_Out_OD 开漏输出 复用推挽:GPIO_Mode_AF_PP 复用推挽输出 复用开漏:GPIO_Mode_AF_OD 复用开漏输出 在这里给大家几个对学习stm32系列有实用的资料 链接:https://pan.baidu.com/s/1MTTv7eE0YStBRTwcGKBJwg 提取码:lwm2
2、LED工作原理
先来了解led的原理图 可以看出只要给输出一个低电平就可以将led点亮,高电平熄灭。 而通用输入/输出(GPIO)控制电平输入输出,换言之让控制led的GPIO口输出高电平,led灯就可以点亮。 查看开发板原理图,确定需要控制的LED灯位于哪个引脚 可以看到四个LED灯的引脚依次为PE2~PE5,在确定引脚的工作方式,这里是推免输出
二、开始实现
1、点亮LED灯
1.1定义函数
在.c文件里面定义函数写函数的主题,在.h文件里面声明函数。
代码如下:
#include "led.h"
void Led_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void LED1(int flag)
{
if(flag==1)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_2);
}
else if(flag==0)
{
GPIO_SetBits(GPIOE, GPIO_Pin_2);
}
}
void LED2(int flag)
{
if(flag==1)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_3);
}
else if(flag==0)
{
GPIO_SetBits(GPIOE, GPIO_Pin_3);
}
}
void LED3(int flag)
{
if(flag==1)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
}
else if(flag==0)
{
GPIO_SetBits(GPIOE, GPIO_Pin_4);
}
}
void LED4(int flag)
{
if(flag==1)
{
GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}
else if(flag==0)
{
GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
}
在这里用了比较简单的选择语句来控制led的亮灭,当定义的的变量flag=1,打开引脚,GPIO输出低电平,led灯亮;反之,当定义的的变量flag=0,关闭引脚,GPIO输出高电平,led灯灭。
1.2函数声明
代码如下(示例):
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void Led_Config(void);
void LED1(int flag);
void LED2(int flag);
void LED3(int flag);
void LED4(int flag);
#endif
注:.h文件定义时#endif要前后空一行(没有报错的话就不用空)
1.3主函数
#include "main.h"
#include "delay.h"
#include "led.h"
int main(void)
{
JTAG_SWD_Config();
SysTick_Init(72000);
Led_Config();
LED1(1);
LED2(1);
LED3(1);
LED4(1);
while(1)
{
}
}
void JTAG_SWD_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
}
2、实现流水灯
代码如下:
LED1(1);
Delay_nms(300);
LED1(0);
LED2(1);
Delay_nms(300);
LED2(0);
LED3(1);
Delay_nms(300);
LED3(0);
LED4(1);
Delay_nms(300);
LED4(0);
在点亮四盏灯的基础上可以很容易实现流水灯,只要在每盏灯点亮之后加上延时,点亮下一盏灯之前把上一盏灯熄灭就能实现流水灯效果。
总结
这篇文章介绍了怎样点亮LED灯并实现流水灯效果,我第一次点亮也是参考【STM32中文参考手册】和【STM32固件库使用手册的中文翻译版】,这些资料在前面的链接里都有,有需要可以自行下载。至于怎么实现跑马灯,呼吸灯这里就不再赘述了,大家可以自己摸索,自己摸索出来的最开心。
|