无人机底层驱动+STM32F4学习心得-1.GPIO初始化

普通IO口,用于测量端口电平,输出使能端口电平。

模转数端口,由于某些传感器采集回来的参数不是高低电平的,而是可变电平的(0V~3.3V)。主要用于采集传感器的值,并且该传感器仅仅是输出模拟电压数值的传感器。

数转模端口,这类端口为输入端口,根据电压大小来控制外部设备。用途:音量控制,音频解码器的输入等。

复用模式:仅仅只是将一些特殊的输入输出电平次序组合成一套标准,并且将这套标准集合在硬件上。用在串口通讯、IIC通讯、SPI通讯、USB通讯等。

#include "bsp_GPIO.h"
#include "stm32f4xx.h"

//函数输入:
//1. GPIOx : 选择需要初始化的端口组
//2. GPIO_Pin : 选定端口组的引脚
//3. GPIO_Mode :端口的模式 0 : 输出 0 : 输入
//4. GPIO_OType : 端口输出类型(仅在端口为输出状态使用)
//5. GPIO_PuPd : 上拉\下拉\悬空
//函数返回 : 无
//函数功能 : 根据初始化内容进行数据初始化

void GPIO_Initilize(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIOMode_TypeDef GPIO_Mode,GPIOOType_TypeDef GPIO_OType,GPIOPuPd_TypeDef GPIO_PuPd)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    if(GPIOx == GPIOA)
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    else if(GPIOx == GPIOB)
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    else if(GPIOx == GPIOC)
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
    else if(GPIOx == GPIOD)
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    else if(GPIOx == GPIOE)
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode;
    GPIO_InitStruct.GPIO_OType = GPIO_OType;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd;
    GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
    GPIO_Init(GPIOx,&GPIO_InitStruct);
}

//函数输入 :
//1. GPIOx : 选择需要初始化的端口组
//2. GPIO_Pin : 选定端口组的引脚
//3. out : 函数输出 0:输出低电平 1:输出高电平
//函数返回 : 无
//函数功能 : 设定指定引脚的高低电平状态

void GPIO_Set(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,unsigned char out)
{
    if(out == 0)
        GPIO_ResetBits(GPIOx,GPIO_Pin);
    else if(out == 1)
        GPIO_SetBits(GPIOx,GPIO_Pin);
}

//函数输入 :
//1. GPIOx : 选择需要初始化的端口组
//2. GPIO_Pin : 选定端口组的引脚
//函数返回 : 指定引脚的状态 0:低电平 1:高电平
//函数功能 : 读取当前端口的高低电平的状态

uint8_t GPIO_Get(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
    return GPIO_ReadOutputDataBit(GPIOx,GPIO_Pin); 
}

//函数返回 : 初始化4个LED灯的状态
//函数功能 : 初始化4个LED灯,且除了LED2默认为亮,其他LED灯为灭

void LED_Init(void)
{
        GPIO_Initilize(GPIOE,GPIO_Pin_0,GPIO_Mode_OUT,GPIO_OType_PP,GPIO_PuPd_UP);
        GPIO_Initilize(GPIOE,GPIO_Pin_1,GPIO_Mode_OUT,GPIO_OType_PP,GPIO_PuPd_UP);
        GPIO_Initilize(GPIOE,GPIO_Pin_2,GPIO_Mode_OUT,GPIO_OType_PP,GPIO_PuPd_UP);
        GPIO_Initilize(GPIOE,GPIO_Pin_3,GPIO_Mode_OUT,GPIO_OType_PP,GPIO_PuPd_UP);
        
        GPIO_Set(GPIOE,GPIO_Pin_0,1);
        GPIO_Set(GPIOE,GPIO_Pin_1,0);
        GPIO_Set(GPIOE,GPIO_Pin_2,1);
        GPIO_Set(GPIOE,GPIO_Pin_3,1);
}

//GPIO_Mode_IN:输入模式

//GPIO_Mode_OUT:输出模式

//GPIO_Mode_AF:复用模式,将gpio端口复用到别的外设功能。

//GPIO_Mode_AN:模拟输入。用来ADC模拟输入或低功耗省电。

//GPIO_OType_PP:推挽模式。当配合输出模式时,可以输出高低电平,0或1。

//GPIO_OType_OD:开漏模式。用于连接不同电平的器件,当接上拉电阻时才能输出高电平,否则只能输出低电平。

猜你喜欢

转载自blog.csdn.net/qq_41422043/article/details/83752181