3.STM32_GPIO 程序控制LED

目录

前言

GPIO简介

点灯原理图

点灯程序


前言

        做为一个点灯工程师,首先第一步当然是点灯啦,使用单片机点灯就如同软件工程师的 “Hello World" 一样,这将是我们跨入单片机的第一步。下面就让我们一起来看一下如何使用C语言搭配标准库来控制一颗LED灯珠吧!!!

水平有限,如有错漏之处,敬请指正

GPIO简介

        GPIO:全名General Purpose Input Output  (其实不重要),我们只需要知道它是单片机的一个管脚,可以实现输入和输出的功能,并且可以使用我们写的程序对其进行控制。       

        GPIO可以通过软件配置为以下模式:

  • GPIO_Mode_AIN                          模拟输入
  • GPIO_Mode_IN_FLOATING         浮空输入
  • GPIO_Mode_IPD                          下拉输入
  • GPIO_Mode_IPU                          上拉输入
  • GPIO_Mode_Out_OD                   开漏输出
  • GPIO_Mode_Out_PP                    推挽输出
  • GPIO_Mode_AF_OD                    复用开漏输出
  • GPIO_Mode_AF_PP                     复用推挽输出

其特征为:

模式功能及用法
模拟输入该功能接入模拟量,不使用ADC
浮空输入可读取引脚电平,若引脚悬空,则电平不确定
下拉输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
上拉输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
开漏输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出由片上外设控制,高电平接VDD,低电平接VSS

点灯原理图

GPIO可以输出高低电平,既然可以控制高低电平了,那么我们就可以直接通过这个电平来控制LED的亮和灭,这里博主使用的是一颗RGB的三色灯,原理图如下:

 由这个图我们可以得知,当PE13,PE14,PE15为低电平时LED导通从而使小灯点亮,接下来一起看一下怎么样控制这个管脚为低电平吧。

点灯程序

创建好标准库的程序模板后,我们可以单独创建一个.c文件,用于控制LED

 然后再创建一个对应的头文件.h,为了方便主函数调用

用于STM32单片机的管脚功能可以复用为其他的功能,所以我们在使用一些功能之前要对其进行初始化,打开对应的时钟,我们可以定义一个GPIO初始化的一个函数。

用RCC_APB2PeriphClockCmd()函数打开时钟,对应的挂载关系为:

标准库中提供了GPIO初始化的结构体GPIO_InitTypeDef

其成员有:

GPIO_Pin  --  需要配置的管脚

GPIO_Mode  --  需要配置的模式

 GPIO_Speed  --  这个管脚输出的速度

GPIO_Init()                初始化这个管脚

GPIO_SetBits()         将这个管脚设置为1

void led_init(void)
{
	GPIO_InitTypeDef GPIO_typeDef;									//定义一个结构体用于初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);			//使能GPIOE的时钟信号
	GPIO_typeDef.GPIO_Pin = LED_R_PIN| LED_G_PIN| LED_B_PIN;		//初始化的pin脚
	GPIO_typeDef.GPIO_Mode = GPIO_Mode_Out_PP;						//初始化模式为输出
	GPIO_typeDef.GPIO_Speed = GPIO_Speed_50MHz;						//初始化速度为高速
	GPIO_Init(GPIOE,&GPIO_typeDef);
	GPIO_SetBits(GPIOE,LED_R_PIN| LED_G_PIN| LED_B_PIN);			//输出管脚
}

 然后可以配置一些宏定义,用于更方便的移植程序和操作GPIO

//开灯
#define LED_R_OPEN()		 {GPIO_SetBits(LED_RGB_GPIO,LED_R_PIN);}
#define LED_G_OPEN()		 {GPIO_SetBits(LED_RGB_GPIO,LED_G_PIN);}
#define LED_B_OPEN()         {GPIO_SetBits(LED_RGB_GPIO,LED_B_PIN);}
//关灯					
#define LED_R_CLOSE()        {GPIO_ResetBits(LED_RGB_GPIO,LED_R_PIN);}
#define LED_G_CLOSE()        {GPIO_ResetBits(LED_RGB_GPIO,LED_G_PIN);}
#define LED_B_CLOSE()        {GPIO_ResetBits(LED_RGB_GPIO,LED_B_PIN);}

然后再主函数里调用初始化,然后在循环里调用循环,就可以控制GPIO的状态了

#include "main.h"

void delay(int time);
int main(void)
{
	led_init();
	while(1)
	{
		LED_G_OPEN();
		delay(1000);
		LED_G_CLOSE();
		delay(1000);
	}
}


void SystemInit(void)
{

}

void delay(int time)
{
	while(--time)
	{
	int i;
		for(i=0;i<50000;i++);
	}

}

下载程序就可以看到led一闪一闪亮的啦!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值