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号即可,不用一个一个问价去翻找是在哪个外设中使用的。
如有错误,欢迎指正,原创不易,转载留名!