功能描述:使用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