硬件连接
- 将一个LED的正极(阳极)连接到STM32的一个GPIO引脚(例如PA5),并将LED的负极(阴极)连接到GND,同时串联一个合适的电阻(例如220欧姆)以限制电流。
完整代码
/**
******************************************************************************
* @file bsp_led.c
* @author fire
* @version V1.0
* @date 2017-xx-xx
* @brief led应用函数接口
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F103 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "./led/bsp_led.h"
/**
* @brief 初始化控制LED的IO
* @param 无
* @retval 无
*/
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStruct;
/*开启LED相关的GPIO外设时钟*/
LED1_GPIO_CLK_ENABLE();
// LED2_GPIO_CLK_ENABLE();
// LED3_GPIO_CLK_ENABLE();
// LED4_GPIO_CLK_ENABLE();
/*选择要控制的GPIO引脚*/
GPIO_InitStruct.Pin = LED1_PIN;
/*设置引脚的输出类型为推挽输出*/
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/*设置引脚为上拉模式*/
GPIO_InitStruct.Pull = GPIO_PULLUP;
/*设置引脚速率为高速 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
// /*选择要控制的GPIO引脚*/
// GPIO_InitStruct.Pin = LED2_PIN;
// HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
// /*选择要控制的GPIO引脚*/
// GPIO_InitStruct.Pin = LED3_PIN;
// HAL_GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStruct);
//
// /*选择要控制的GPIO引脚*/
// GPIO_InitStruct.Pin = LED4_PIN;
// HAL_GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStruct);
/*关闭RGB灯*/
LED_ALLOFF;
}
/*********************************************END OF FILE**********************/
#ifndef __LED_H
#define __LED_H
#include "stm32f1xx.h"
//引脚定义
/*******************************************************/
//LED1
#define LED1_PIN GPIO_PIN_13
#define LED1_GPIO_PORT GPIOC
#define LED1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
//LED2
#define LED2_PIN GPIO_PIN_9
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
//LED3
#define LED3_PIN GPIO_PIN_10
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
//LED4
#define LED4_PIN GPIO_PIN_14
#define LED4_GPIO_PORT GPIOE
#define LED4_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
/************************************************************/
/** 控制LED灯亮灭的宏,
* LED低电平亮,设置ON=0,OFF=1
* 若LED高电平亮,把宏设置成ON=1 ,OFF=0 即可
*/
//#define ON GPIO_PIN_RESET
//#define OFF GPIO_PIN_SET
/* 带参宏,可以像内联函数一样使用 */
#define LED1(a) HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1_PIN,a)
#define LED2(a) HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN,a)
#define LED3(a) HAL_GPIO_WritePin(LED3_GPIO_PORT,LED3_PIN,a)
#define LED4(a) HAL_GPIO_WritePin(LED4_GPIO_PORT,LED4_PIN,a)
/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //设置为高电平
#define digitalLo(p,i) {p->BSRR=(uint32_t)i << 16;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_PIN)
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_PIN)
#define LED4_TOGGLE digitalToggle(LED4_GPIO_PORT,LED4_PIN)
#define LED4_OFF digitalHi(LED4_GPIO_PORT,LED4_PIN)
#define LED4_ON digitalLo(LED4_GPIO_PORT,LED4_PIN)
//黑(全部关闭)
#define LED_ALLOFF \
LED1_OFF;\
// LED2_OFF;\
// LED3_OFF;\
// LED4_OFF
void LED_GPIO_Config(void);
#endif /* __LED_H */