1-1 STM32F405--GPIO点亮LED

功能描述:使用STM32F405RGT6的GPIO实现LED的点亮与熄灭。这里的LED都是外部上拉。

  •  main.c文件内容如下
#include "stm32f4xx.h"                  // Device header
#include "Delay.h"
#include "LED.h"

int main(void)
{
	LED_Init(LED1 | RGBLED1);
	
	while(1)
	{
		RGBLED_Write(RGBLED1, LEDR);
		LED_Write(LED1, LED_OFF);
		Delay_ms(500);
		RGBLED_Write(RGBLED1, LEDOFF);
		LED_Write(LED1, LED_ON);
		Delay_ms(500);
		RGBLED_Write(RGBLED1, LEDG);
		LED_Write(LED1, LED_OFF);
		Delay_ms(500);
		RGBLED_Write(RGBLED1, LEDOFF);
		LED_Write(LED1, LED_ON);
		Delay_ms(500);
		RGBLED_Write(RGBLED1, LEDB);
		LED_Write(LED1, LED_OFF);
		Delay_ms(500);
		RGBLED_Write(RGBLED1, LEDOFF);
		LED_Write(LED1, LED_ON);
		Delay_ms(500);
	}
}

  •  LED.c文件内容如下
#include "LED.h"

/**
  * @摘要  		初始化LED(初始化相应的GPIO端口)
  * @参数  		LEDx: LEDx为要初始化的LED(根据硬件定义,这里可选LED1、RGBLED1及它们的组合)
  * @返回值  	无
  * @说明  		无
  */
void LED_Init(uint8_t LEDx)
{
	//开启GPIOC时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	//定义GPIO初始化结构体
	GPIO_InitTypeDef GPIOInitStructure;
	//初始化上述结构体
	GPIO_StructInit(&GPIOInitStructure);
	//配置GPIO模式为输入模式
	GPIOInitStructure.GPIO_Mode = GPIO_Mode_OUT;
	//配置GPIO输出类型为推挽输出
	GPIOInitStructure.GPIO_OType = GPIO_OType_PP;
	//配置GPIO输入类型为浮空输入(此处无用)
	GPIOInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	//配置GPIO的速度为快速50MHZ
	GPIOInitStructure.GPIO_Speed = GPIO_Fast_Speed;
	if(LEDx == (LED1|RGBLED1))
	{
		//指定GPIO引脚为Pin0、Pin1、Pin2、Pin3
		GPIOInitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	}
	else if(LEDx == LED1)
	{
		//指定GPIO引脚为Pin3
		GPIOInitStructure.GPIO_Pin = GPIO_Pin_3;
	}
	else if(LEDx == RGBLED1)
	{
		//指定GPIO引脚为Pin0、Pin1、Pin2
		GPIOInitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
	}
	//初始化对应的GPIO
	GPIO_Init(GPIOC, &GPIOInitStructure);
	
	//熄灭LED
	if(LEDx == (LED1|RGBLED1))
		GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
	else if(LEDx == LED1)
		GPIO_SetBits(GPIOC,GPIO_Pin_3);
	else if(LEDx == RGBLED1)
		GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
}

/**
  * @摘要  		对普通LED进行点亮或熄灭操作
  * @参数  		LEDx: LEDx为要操作的LED(根据硬件定义,这里可选LED1)
  * @参数  		LEDState: LEDState为LED的写入状态
				可选ON(开)、OFF(关)、TOG(翻转)
  * @返回值  	无
  * @说明  		不能用于三色LED
  */
void LED_Write(uint8_t LEDx, LEDState_TypeDef LEDState)
{
	if(LEDx == LED1)
	{
		if(LEDState == LED_ON)
			GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_RESET);
		else if(LEDState == LED_OFF)
			GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_SET);
		else if(LEDState == LED_TOG)
		{
			if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3))
				GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_RESET);
			else
				GPIO_WriteBit(GPIOC, GPIO_Pin_3, Bit_SET);
		}
	}
}

/**
  * @摘要  		读取普通LED的状态
  * @参数  		LEDx: LEDx为要读取的LED(根据硬件定义,这里可选LED1)
  * @返回值  	LED_ON(打开状态)、LED_OFF(关闭状态)
  * @说明  		不能用于三色LED
  */
LEDState_TypeDef LED_Read(uint8_t LEDx)
{
	LEDState_TypeDef state = LED_OFF;
	if(LEDx == LED1)
	{
		if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_3) == 0)
			state = LED_ON;
	}
	return state;
}

/**
  * @摘要  		对三色LED进行点亮或熄灭操作
  * @参数  		LEDx: LEDx为要操作的LED(根据硬件定义,这里可选RGBLED1)
  * @参数  		LEDRGB: LEDRGB为LED的写入状态
				可选LEDOFF(关)、LEDR(红)、LEDG(绿)、LEDB(蓝)以及后三者的组合
  * @返回值  	无
  * @说明  		不要随意更改三色LED的硬件连线
  */
void RGBLED_Write(uint8_t RGBLEDx, RGBLEDState_TypeDef LEDRGB)
{
	if(RGBLEDx == RGBLED1)
	{
		GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
		if(LEDRGB != LEDOFF)
			GPIO_WriteBit(GPIOC, LEDRGB, Bit_RESET);
	}
}

/**
  * @摘要  		读取三色LED的状态
  * @参数  		LEDx: LEDx为要读取的LED(根据硬件定义,这里可选RGBLED1)
  * @返回值  	LEDR、LEDG、LEDB以及它们的任意组合或者LEDOFF
  * @说明  		不能用于普通LED
  */
RGBLEDState_TypeDef RGBLED_Read(uint8_t RGBLEDx)
{
	RGBLEDState_TypeDef state = LEDOFF;
	if(RGBLEDx == RGBLED1)
	{
		if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0) == 0)
			state |= LEDR;
		if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_1) == 0)
			state |= LEDG;
		if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_2) == 0)
			state |= LEDB;
	}
	return state;
}

  •  LED.h文件内容如下
#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"                  // Device header

#define LED1  0x01
#define RGBLED1  0x02

typedef enum
{
	LED_OFF = 0x00,
	LED_ON = 0x01,
	LED_TOG = 0X02
}LEDState_TypeDef;

typedef enum
{
	LEDOFF = 0x00,
	LEDR = 0x01,
	LEDG = 0x02,
	LEDB = 0X04
}RGBLEDState_TypeDef;

void LED_Init(uint8_t LEDx);
void LED_Write(uint8_t LEDx, LEDState_TypeDef LEDState);
LEDState_TypeDef LED_Read(uint8_t LEDx);
void RGBLED_Write(uint8_t RGBLEDx, RGBLEDState_TypeDef LEDRGB);
RGBLEDState_TypeDef RGBLED_Read(uint8_t RGBLEDx);

#endif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值