便携的GPIO初始化

STM32学习日志_便携的GPIO初始化

单独的硬件GPIO初始化.c和.h文件,方便项目增删改查


提示:硬件为STMF07,使用标准库编写


前言

提示:这里可以添加本文要记录的大概内容:

一般的STM32项目的GPIO是跟着所使用的外设配置文件一起,包含在Init函数中的,例如Init_Uart(),Init_Adc()等,查找GPIO的配置属性都要找半天,完全可以不这样搞,把要用的GPIO在一个文件中配置完整,再统一初始化,省时省力,方便删改查找。


提示:以下是本篇文章正文内容,下面案例可供参考

一、.H文件

定义和声明GPIO结构体、初始化函数。

代码如下(示例):

#ifndef __GPIO_H__
#define __GPIO_H__

#include "Config.h"

#define GPIONUMBERS  (15U)									//GPIO数量

typedef struct
{
	GPIO_TypeDef*	 	GPIOX;
	GPIO_InitTypeDef	Gpio_Devstructure;
	uint8 				GPIO_InitStatus;
}Gpio_DevInitStructure;

extern Gpio_DevInitStructure stGpioStruction[GPIONUMBERS];	//定义GPIO结构体数组
extern void Gpio_Dev_Init(void);							//GPIO初始化函数

#endif

二、.C文件

GPIO结构体数组初始化和初始化函数。

1.初始化结构体数组

代码如下(示例):

#include "Gpio_Dev.h"

/***************************************************
*GPIO 初始化列表
****************************************************/
Gpio_DevInitStructure stGpioStruction[GPIONUMBERS] = 
{
	/*********************GPIOA*******************/
	{GPIOA,{GPIO_Pin_0,GPIO_Mode_IN,GPIO_Speed_100MHz,NULL,GPIO_PuPd_DOWN},NULL},  					//WK_UP
	{GPIOA,{GPIO_Pin_5,GPIO_Mode_AN,NULL,NULL,GPIO_PuPd_NOPULL},NULL},
	{GPIOA,{GPIO_Pin_9,GPIO_Mode_AF,GPIO_Speed_50MHz,GPIO_OType_PP,GPIO_PuPd_UP},NULL},			//UART1_RX
	{GPIOA,{GPIO_Pin_10,GPIO_Mode_AF,GPIO_Speed_50MHz,GPIO_OType_PP,GPIO_PuPd_UP},NULL},		//UART1_TX
	/*********************GPIOB*******************/
	{GPIOB,{GPIO_Pin_3,GPIO_Mode_AF,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_UP},NULL},		//SPI1_SCK
	{GPIOB,{GPIO_Pin_4,GPIO_Mode_AF,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_UP},NULL},		//SPI1_MISO
	{GPIOB,{GPIO_Pin_5,GPIO_Mode_AF,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_UP},NULL},		//SPI1_MOSI
	{GPIOB,{GPIO_Pin_8,GPIO_Mode_OUT,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_UP},Bit_SET},		//Soft_I2C_SCL
	{GPIOB,{GPIO_Pin_9,GPIO_Mode_OUT,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_UP},Bit_SET},		//Soft_I2C_SDA
	/*********************GPIOC*******************/

	/*********************GPIOD*******************/
	
	/*********************GPIOE*******************/
	{GPIOE,{GPIO_Pin_2,GPIO_Mode_IN,GPIO_Speed_100MHz,NULL,GPIO_PuPd_UP},NULL},	//KEY_2
	{GPIOE,{GPIO_Pin_3,GPIO_Mode_IN,GPIO_Speed_100MHz,NULL,GPIO_PuPd_UP},NULL},	//KEY_1
	{GPIOE,{GPIO_Pin_4,GPIO_Mode_IN,GPIO_Speed_100MHz,NULL,GPIO_PuPd_UP},NULL}, //KEY_0

	/*********************GPIOF*******************/
	{GPIOF,{GPIO_Pin_8,GPIO_Mode_OUT,GPIO_Speed_100MHz,GPIO_OType_PP,GPIO_PuPd_DOWN},Bit_RESET},	//Beep
	{GPIOF,{GPIO_Pin_9,GPIO_Mode_OUT,GPIO_Speed_50MHz,GPIO_OType_PP,GPIO_PuPd_UP},Bit_RESET},			//LED1
	{GPIOF,{GPIO_Pin_10,GPIO_Mode_OUT,GPIO_Speed_50MHz,GPIO_OType_PP,GPIO_PuPd_UP},Bit_RESET}			//LED2
	
};


/***************************************************
*@brief:GPIO Config
*@author: yw 2022-02-12
*@param:None
*@retval:None
****************************************************/
void Gpio_Dev_Init(void)
{
	//未用到的时钟组可以不写
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	GPIO_DeInit(GPIOA);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	GPIO_DeInit(GPIOB);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	GPIO_DeInit(GPIOC);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	GPIO_DeInit(GPIOD);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	GPIO_DeInit(GPIOE);
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	GPIO_DeInit(GPIOF);
	
	uint8 i = 0;
	for(i = 0;i < GPIONUMBERS;i++)
	{
		GPIO_Init(stGpioStruction[i].GPIOX,&stGpioStruction[i].Gpio_Devstructure);
		if(stGpioStruction[i].GPIO_InitStatus == Bit_SET)
		{
			GPIO_SetBits(stGpioStruction[i].GPIOX,stGpioStruction[i].Gpio_Devstructure.GPIO_Pin);
		}
		else if(stGpioStruction[i].GPIO_InitStatus == Bit_RESET)
		{
			GPIO_ResetBits(stGpioStruction[i].GPIOX,stGpioStruction[i].Gpio_Devstructure.GPIO_Pin);
		}
		else
		{
			//error
		}
	}
}

2.使用

在结构体数组中添加你要初始化的GPIO和祥光属性,主函数中调用void Gpio_Dev_Init(void)即可:

总结

学习的一点心得,主要是查找方便,知道GPIO号即可,不用一个一个问价去翻找是在哪个外设中使用的。

如有错误,欢迎指正,原创不易,转载留名!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在树莓派上使用GPIO之前,需要进行GPIO初始化。以下是GPIO初始化的步骤: 1. 导入所需的Python库 使用树莓派GPIO需要使用RPi.GPIO Python库。可以使用以下命令安装它: ``` sudo apt-get install python3-rpi.gpio ``` 2. 设置GPIO编号模式 树莓派有两种GPIO编号模式:BCM(Broadcom SOC Channel)和BOARD。BCM模式使用GPIOGPIO编号(如GPIO17),而BOARD模式使用GPIO的物理位置编号(如PIN11)。 在Python中使用BCM模式,可以使用以下代码: ```python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) ``` 在Python中使用BOARD模式,可以使用以下代码: ```python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) ``` 3. 设置GPIO的输入/输出模式 在使用GPIO之前,需要确定每个GPIO引脚的输入/输出模式。要设置GPIO引脚为输入模式,可以使用以下代码: ```python GPIO.setup(channel, GPIO.IN) ``` 要设置GPIO引脚为输出模式,可以使用以下代码: ```python GPIO.setup(channel, GPIO.OUT) ``` 其中,channel是GPIO引脚的编号。 4. 设置GPIO的初始状态 在设置GPIO引脚为输出模式时,还可以设置GPIO引脚的初始状态。要将GPIO引脚设置为高电平(3.3V),可以使用以下代码: ```python GPIO.output(channel, GPIO.HIGH) ``` 要将GPIO引脚设置为低电平(0V),可以使用以下代码: ```python GPIO.output(channel, GPIO.LOW) ``` 其中,channel是GPIO引脚的编号。 完成以上步骤后,就可以使用GPIO进行各种控制操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值