STM32 GPIO控制

STM32 GPIO控制

1. GPIO输出(控制LED数码管,继电器等外设)

(1)开启端口对应总线时钟
(2)定义结构体 配置相关参数
a.设置对应引脚
b.设置引脚模式
c.设置引脚速度
(3)使用相关函数写入配置

/*led.c*/
//以STM32F103VET6为例,说明控制PB0 PB1 PB5   
#include "led.h"
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);
}
/*led.h*/
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

//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)使用相关函数写入配置

/*key.c*/
//以STM32F103VET6为例,说明读取  PA0 PC13电平信号
 #include "key.h"

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);
	
}

/*key.h*/
#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

//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

你可能感兴趣的:(STM32,stm32,单片机)