STM32 GPIO控制
1. GPIO输出(控制LED数码管,继电器等外设)
(1)开启端口对应总线时钟
(2)定义结构体 配置相关参数
a.设置对应引脚
b.设置引脚模式
c.设置引脚速度
(3)使用相关函数写入配置
/**/
//以STM32F103VET6为例,说明控制PB0 PB1 PB5
#include ""
void LED_GPIO_Config(void)
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure = {0};
//开启时钟 LED的端口都是GBIOB所以直接写了LED1_GPIO_CLK
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK, ENABLE);
//选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN;
//设置引脚模式
//通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//引脚速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数初始化GPIOB,端口都是GPIOB所以直接写了LED1_GPIO_PORT
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
//关闭所有LED灯
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN | LED2_GPIO_PIN | LED3_GPIO_PIN);
}
/**/
#ifndef __LED_H
#define __LED_H
#include ""
//R-红色
#define LED1_GPIO_PORT GPIOB //宏定义LED-R的GPIO端口
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB //宏定义LED-R的GPIO端口时钟
#define LED1_GPIO_PIN GPIO_Pin_5 //宏定义LED-RED的引脚
//G-绿色
#define LED2_GPIO_PORT GPIOB //宏定义LED-G的GPIO端口
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB //宏定义LED-G的GPIO端口时钟
#define LED2_GPIO_PIN GPIO_Pin_0 //宏定义LED-G的引脚
//B-蓝色
#define LED3_GPIO_PORT GPIOB //宏定义LED-B的GPIO端口
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB //宏定义LED-B的GPIO端口时钟
#define LED3_GPIO_PIN GPIO_Pin_1 //宏定义LED-B的引脚
#define ON 1
#define OFF 0
//使用固件库函数 \为续行符
#define LED1(a) if (a) \
GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN); \
else \
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN)
#define LED2(a) if (a) \
GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); \
else \
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN)
#define LED3(a) if (a) \
GPIO_ResetBits(LED3_GPIO_PORT, LED3_GPIO_PIN); \
else \
GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN)
/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */
//红
#define LED_RED \
LED1(ON);\
LED2(OFF);\
LED3(OFF)
//绿
#define LED_GREEN \
LED1(OFF);\
LED2(ON);\
LED3(OFF)
//蓝
#define LED_BLUE \
LED1(OFF);\
LED2(OFF);\
LED3(ON)
//黄(红+绿)
#define LED_YELLOW \
LED1(ON);\
LED2(ON);\
LED3(OFF)
//紫(红+蓝)
#define LED_PURPLE \
LED1(ON);\
LED2(OFF);\
LED3(ON)
//青(绿+蓝)
#define LED_CYAN \
LED1(OFF);\
LED2(ON);\
LED3(ON)
//白(红+绿+蓝)
#define LED_WHITE \
LED1(ON);\
LED2(ON);\
LED3(ON)
//黑(全部关闭)
#define LED_RGBOFF \
LED1(OFF);\
LED2(OFF);\
LED3(OFF)
/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
/* 定义控制IO的宏 */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
void LED_GPIO_Config(void);
#endif
2. GPIO输入(读取KEY状态等)
(1)开启端口对应总线时钟
(2)定义结构体 配置相关参数
a.设置对应引脚
b.设置引脚模式c.设置引脚速度(输入无需设置速度)
(3)使用相关函数写入配置
/**/
//以STM32F103VET6为例,说明读取 PA0 PC13电平信号
#include ""
void KEY_GPIO_Config(void)
{
//定义一个GPIO_InitTypeDef类型的结构体
GPIO_InitTypeDef GPIO_InitStructure = {0};
//开启按键时钟
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
//选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN | KEY2_GPIO_PIN;
//设置引脚模式
//浮空输入,引脚电平由外设决定
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//引脚速率 输入模式下不配置为复位状态00
//调用库函数初始化
GPIO_Init(KEY1_GPIO_PORT , &GPIO_InitStructure);
GPIO_Init(KEY2_GPIO_PORT , &GPIO_InitStructure);
}
/**/
#ifndef __KEY_H
#define __KEY_H
#include ""
//KEY1
#define KEY1_GPIO_PORT GPIOA //宏定义KEY1的GPIO端口
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA //宏定义KEY1的GPIO端口时钟
#define KEY1_GPIO_PIN GPIO_Pin_0 //宏定义KEY1的引脚
//KEY2
#define KEY2_GPIO_PORT GPIOC //宏定义KEY2的GPIO端口
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC //宏定义KEY2的GPIO端口时钟
#define KEY2_GPIO_PIN GPIO_Pin_13 //宏定义KEY2的引脚
#define KEY1_DOWN GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN)
#define KEY2_DOWN GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN)
void KEY_GPIO_Config(void);
#endif