浮空输入:可读取引脚电平,引脚悬空时电平不确定,呈高阻态,数据存入IDR寄存器
GPIO_Mode_IN_FLOATING
上拉输入:可读取引脚电平,引脚悬空时是高电平,数据存入IDR寄存器
GPIO_Mode_IPU
下拉输入:可读取引脚电平,引脚悬空时是低电平,数据存入IDR寄存器
GPIO_Mode_IPD
模拟输入:GPIO无效,引脚直接接入内部ADC或外设
GPIO_Mode_AIN
开漏输出:可输出引脚电平,不能输出高电平
GPIO_Mode_Out_OD
推挽输出:可输出引脚电平,驱动能力较强,可输出高电平
GPIO_Mode_Out_PP
复用开漏输出:由外设控制(PWM),而不是寄存器ODR,无法输出高电平(除非外接或内接高电平)
GPIO_Mode_AF_OD
复用推挽输出:由外设控制(PWM),而不是寄存器ODR,可输出高低电平,驱动能力强
GPIO_Mode_AF_PP
1.初始化 时钟设置,参数设置,中断设置,IO设置
2.读函数(可选) 从外设读数据
3.写函数(可选) 往外设写数据
4.中断服务函数(可选) 根据中断标志,处理外设各种中断事务
1.使能时钟 _HAL_RCC_GPIOx_CLK_ENABLE()是个宏
2.设置工作模式 HAL_GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_Init)
3.设置输出状态 HAL_GPIO_WritePin() HAL_GPIO_TogglePin()
4.读取输入状态 HAL_GPIO_ReadPin()
解释 HAL_GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_Init)
参数1是外设寄存器基地址 比如GPIOA,GPIOB
参数2是工作模式结构体基地址(句柄),需要自己定义和赋值,结构体成员如下图
结构体成员赋值选项在stm32f4xx_hal_gpio.c和.h中
设置引脚值HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIO_PinState)
(外设寄存器基地址,引脚号,状态是0或1)
设置翻转引脚值HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
(外设寄存器基地址,引脚号)
LED
//led.c
#include "./BSP/LED/led.h"
/**
* @brief 初始化LED相关IO口, 并使能时钟
* @param 无
* @retval 无
*/
void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct; //创建结构体
__HAL_RCC_GPIOF_CLK_ENABLE(); //GPIO使能
gpio_init_struct.Pin = GPIO_PIN_9; //GPIO引脚选择
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; //GPIO模式选择,推挽输出
gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; //输出速度选择
HAL_GPIO_Init(GPIOF,&gpio_init_struct); //引脚初始化
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET); //设置LED初始状态
}
//led.h
#ifndef __LED_H
#define __LED_H
#include "./SYSTEM/sys/sys.h"
void led_init(void);
#endif
KEY
//key.c
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
void key_init(void)
{
GPIO_InitTypeDef gpio_init_struct; //创建结构体
__HAL_RCC_GPIOE_CLK_ENABLE(); //GPIO使能
gpio_init_struct.Pin = GPIO_PIN_2; //GPIO引脚选择
gpio_init_struct.Mode = GPIO_MODE_INPUT; //GPIO模式选择,输入模式
gpio_init_struct.Pull = GPIO_PULLUP; //上拉输入
HAL_GPIO_Init(GPIOF,&gpio_init_struct); //引脚初始化
}
uint16_t key_scan(void)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
{
delay_ms(10); //消抖
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0)
{
while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0); //等待按键松开
return 1; //按键按下
}
}
return 0;//按键没有按下
}
//key.h
#ifndef __KEY_H
#define __KEY_H
#include "./SYSTEM/sys/sys.h"
uint16_t key_scan(void);
void key_init(void);
#endif
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
key_init(); /* 初始化KEY */
while(1)
{
if(key_scan())
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);//按键按下,led点亮
}
else
{
delay_ms(10);
}
}
}