LED原理图如图所示:
代码
DS0和DS1每过500ms一次交替闪烁,实现类似跑马灯的效果
GPIO输出配置步骤
(1)使能对应GPIO时钟
STM32在使用任何外设之前,我们都要先使能其时钟(下同)。本实验用到PB5和PE5 两 个IO 口,因此需要先使能GPIOB和GPIOE 的时钟
(2)设置对应 GPIO工作模式(推挽输出)
本实验GPIO使用推挽输出模式,控制LED亮灭,通过函数HAL_GPIO_Init设置实现。
(3)控制GPIO 引脚输出高低电平
在配置好GPIO工作模式后,我们就可以通过HAL_GPIO_WritePin 函数控制GPIO 引脚 输 出高低电平,从而控制LED的亮灭了。
led.h
#ifndef _LED_H
#define _LED_H
//led初始化
void led_init(void);
#endif
led.c
#include "./BSP/LED/led.h"
#include "./SYSTEM/sys/sys.h"
//led初始化
void led_init(void){
GPIO_InitTypeDef g_gppio_struct;
__HAL_RCC_GPIOE_CLK_ENABLE(); //使能时钟--PE5--LED1
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能时钟--PB5--LED0
g_gppio_struct.Pin=GPIO_PIN_5;
g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
g_gppio_struct.Pull=GPIO_NOPULL; //无上下拉
g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOE,&g_gppio_struct); //初始化LED1
g_gppio_struct.Pin=GPIO_PIN_5;
g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
g_gppio_struct.Pull=GPIO_NOPULL; //无上下拉
g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOB,&g_gppio_struct); //初始化LED0
}
1、使能外设时钟
我们要使用某个外设,必需先使能该外设时钟
(1)HAL库使能某个外设时钟的方法
__HAL_RCC_GPIOx_CLK_ENABLE();
例如:LED0被PB5管脚控制,则x为B
(2)HAL库禁止某个外设时钟的方法
__HAL_RCC_GPIOx_CLK_DISABLE();
2、HAL_GPIO_Init 函数
函数声明:
void HAL_GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
//用于配置GPIO功能模式,还可以设置EXTI功能
2.1 形参1:GPIO_TypeDef *GPIOx
是端口号,GPIOA~GPIOE
2.2 形参2:GPIO_InitTypeDef *GPIO_Init
是GPIO_InitTypeDef类型的结构体变量
typedef struct{
uint32_t Pin; /*!< 指定要配置的 GPIO 引脚。-------引脚号
此参数可以是 @ref GPIO_pins_define 的任何值 */uint32_t Mode; /*!< 指定所选引脚的模式。-------模式设置
此参数可以是 @ref GPIO_mode_define 的值 */uint32_t Pull; /*!< 指定所选引脚的 Pull-up 或 Pull-Down 激活。-------上拉下拉设置
此参数可以是 @ref GPIO_pull_define */uint32_t Speed; /*!< 指定选定引脚的速度。-------速度设置
此参数可以是 @ref GPIO_speed_define 的值 */
} GPIO_InitTypeDef;
2.2.1 Pin
表示引脚号,范围:GPIO_PIN_0 到 GPIO_PIN_15,另外还有 GPIO_PIN_All 和 GPIO_PIN_MASK可选
例如: LED0被PB5管脚控制,则为GPIO_PIN_5
2.2.2 Mode
是GPIO 的模式选择,有以下选择项:
#define GPIO_MODE_INPUT 0x00000000u /*!< 输入模式 */
#define GPIO_MODE_OUTPUT_PP 0x00000001u /*!< 推挽输出模式 */
#define GPIO_MODE_OUTPUT_OD 0x00000011u /*!< 开漏输出模式 */
#define GPIO_MODE_AF_PP 0x00000002u /*!< 推挽式复用模式 */
#define GPIO_MODE_AF_OD 0x00000012u /*!< 开漏式复用 */
#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT /*!< Alternate Function Input Mode */#define GPIO_MODE_ANALOG 0x00000003u /*!< Analog Mode */
#define GPIO_MODE_IT_RISING 0x10110000u /*!< External Interrupt Mode with Rising edge trigger detection */
#define GPIO_MODE_IT_FALLING 0x10210000u /*!< External Interrupt Mode with Falling edge trigger detection */
#define GPIO_MODE_IT_RISING_FALLING 0x10310000u /*!< External Interrupt Mode with Rising/Falling edge trigger detection */#define GPIO_MODE_EVT_RISING 0x10120000u /*!< External Event Mode with Rising edge trigger detection */
#define GPIO_MODE_EVT_FALLING 0x10220000u /*!< External Event Mode with Falling edge trigger detection */
#define GPIO_MODE_EVT_RISING_FALLING 0x10320000u /*!< External Event Mode with Rising/Falling edge trigger detection */
2.2.3 Pull
用于配置上下拉电阻,有以下选择项:
#define GPIO_NOPULL 0x00000000u /* 无上下拉 */
#define GPIO_PULLUP 0x00000001u /* 上拉 */
#define GPIO_PULLDOWN 0x00000002u /* 下拉 */
2.2.4 Speed
用于配置GPIO 的速度,有以下选择项:
#define GPIO_SPEED_FREQ_LOW (GPIO_CRL_MODE0_1) /* 低速 */
#define GPIO_SPEED_FREQ_MEDIUM (GPIO_CRL_MODE0_0) /* 中速 */
#define GPIO_SPEED_FREQ_HIGH (GPIO_CRL_MODE0) /* 高速 */
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
int main(void){
//固定代码
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
led_init();
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); //点亮
while(1){
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET); //点亮
delay_ms(200);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET); //熄灭
delay_ms(200);
//上述等价于
/*HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
delay_ms(200);*/
}
}
每一个文档在最后都要空2行,不然会出现警告
1、HAL_GPIO_WritePin 函数
是 GPIO 口的写引脚函数。其声明如下:
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
(1)形参1:端口号,可以选择范围:GPIOA~GPIOG
(2)形参2:引脚号,可以选择范围:GPIO_PIN_0~GPIO_PIN_15
(3)形参3:要设置输出的状态,有两个选择:GPIO_PIN_SET表示高电平,GPIO_PIN_RESET表示低电平
2、HAL_GPIO_TogglePin 函数
是 GPIO 口的电平翻转函数。其声明如下:
void HAL_GPIO_TogglePin (GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
(1)形参1:端口号,可以选择范围:GPIOA~GPIOG
(2)形参2:引脚号,可以选择范围:GPIO_PIN_0~GPIO_PIN_15