首页 > 其他分享 >STM32学习笔记——GPIO

STM32学习笔记——GPIO

时间:2024-09-06 13:38:28浏览次数:10  
标签:Pin 引脚 void 笔记 STM32 GPIOA GPIO GPIOx

GPIO——General Purpose Input Output——通用输入输出出口

特点:通用性、快速翻转、中断支持、支持多种工作模式。

8种输入输出模式

模式 性质 特征 应用 标识

浮空输入

数字输入

可读取引脚电平,若引脚悬空,则电平不确定

适用于需要读取外部信号的场景,但外部信号状态不确定。

GPIO_Mode_IN_FLOATING

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

用于外部信号默认为高电平的情况,如按钮按下时会拉低信号。

GPIO_Mode_IPU

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

适用于外部信号默认为低电平的情况,如按钮按下时会拉高信号。

GPIO_Mode_IPD

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

适用于需要进行模拟信号处理的场景。

GPIO_Mode_AIN

开漏输出 数字输出

可输出引脚电平,高电平为高阻态,低电平接VSS

适用于需要多个输出端口共享同一信号线的场景,例如I2C的SDA、SCL线。

GPIO_Mode_Out_OD

推挽输出 数字输出

可输出引脚电平,高电平接VDD,低电平接VSS

适用于需要输出到外部设备,需要较大驱动能力的场景。

GPIO_Mode_Out_PP

复用开漏输出 数字输出

由片上外设控制,高电平为高阻态,低电平接VSS

适用于需要实现外设功能,同时共享信号线的场景,例如硬件I2C的SDA、SCL线

GPIO_Mode_AF_OD

复用推挽输出 数字输出 由片上外设控制,高电平接VDD,低电平接VSS 适用于需要实现外设功能,同时需要提供较大驱动能力的场景,例如SPI的SCK、MISO、MOSI线。 GPIO_Mode_AF_PP

引脚电平:0V~3.3V,部分引脚可容忍5V

GPIO的库函数位置

 

 
函数 解释
void GPIO_DeInit(GPIO_TypeDef* GPIOx) gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不在使用某一接口后,可以调用该函数。
void GPIO_AFIODeInit(void) 外设映射设置恢复为默认状态,以重新初始化外设映射配置。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)  GPIO的初始化函数,该函数的作用是对io进行初始化。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)  GPIO结构体的初始化。对GPIO_InitStruct结构体进行默认配置。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)  读取io输入管脚的值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) 读取输入io数据,该函数用于读取一个io分组的所有数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 读取io输出管脚的值
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)  读取输出io数据,该函数用于读取一个io分组的所有数据
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 对io管脚进行置位(输出高电平)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 对io管脚进行复位(输出低电平)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) 对某一位进行写入操作。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal) 对GPIO端口进行写入操作,适用于对统一端口的多个管脚的写入。
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 锁定GPIO寄存器,锁定的寄存器是GPIOx_MODER,   GPIOx_OTYPER,    GPIOx_OSPEEDR,   GPIOx_PUPDR,    GPIOx_AFRL    and    GPIOx_AFRH。在下一次复位前,被锁定的管脚不能被修改。
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 配置GPIO引脚作为事件输出,用于特定的事件通知机制。

void GPIO_EventOutputCmd(FunctionalState NewState)

启用或禁用GPIO事件输出功能。
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) 重新映射指定引脚,以实现不同的引脚功能。(重映射和IO口的复用一样,需要开启AFIO的时钟。)
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 配置外部中断线的GPIO端口和引脚。
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) 配置以太网介质接口。

 

 

通用外设驱动模型:

初始化→读函数→写函数→设置中断

初始化(常用):

void __GPIO_Init(void){            
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    //RCC_APB2Periph_GPIOB-》这里选择的是STM上的B0和B10,所以是GPIOB   ENABLE-》使能
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;            //输入模式
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_10;//端口 可同时定义多个
    GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;        //选择速率
    GPIO_Init(GPIOB,&GPIO_InitStructure);                    //初始化
}

STM32按键控制开关灯实例:

LED灯的配置

#include "stm32f10x.h"

void LED_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    //初始化GPIOA口的PA0、PA2、PA5端口,设置推挽输出
    GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_5);
    //PA0、PA2、PA5端口输出高电平
}

void LED1_ON(void){
    GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
void LED1_OFF(void){
    GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
void LED2_ON(void){
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void){
    GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED3_ON(void){
    GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
void LED3_OFF(void){
    GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//3个LED开关灯操作,低电平点亮,高电平熄灭


void LED1_Turn(void){
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0){
        GPIO_SetBits(GPIOA,GPIO_Pin_0);
    }else{
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
    }
}
//读取PA0端口的LED状态,进行翻转操作

void LED2_Turn(void){
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) == 0){
        GPIO_SetBits(GPIOA,GPIO_Pin_2);
    }else{
        GPIO_ResetBits(GPIOA,GPIO_Pin_2);
    }
}
//读取PA2端口的LED状态,进行翻转操作

void LED3_Turn(void){
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 0){
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
    }else{
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);
    }
}
//读取PA5端口的LED状态,进行翻转操作

开关的配置

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void Key_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    //初始化PB0和PB10端口,分别连接了两个开关,使用上拉输入模式
}


uint8_t Key_GetNum(void){
    uint8_t KeyNum = 0;
    
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){            //读取PB0端口数据判断是否为0(低电平)
        Delay_ms(20);                                        //延时过滤
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0);    //当为0时跳出循环
        Delay_ms(20);                                        //延时过滤
        KeyNum = 1;                                            //标志位置1
    }

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0){
        Delay_ms(20);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0);
        Delay_ms(20);
        KeyNum = 2;
    }
    
    return KeyNum;                                            //返回标志位
}

主函数

#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
    LED_Init();        //灯初始化
    Key_Init();        //开关初始化
    
    while(1){
        KeyNum = Key_GetNum();    //获取标志位
        
        if(KeyNum == 1){        
            LED1_Turn();
        }
        if(KeyNum == 2){
            LED2_Turn();
            LED3_Turn();
        }
                                //标志位为1时,翻转LED1,为2时翻转LED2和LED3
    }
}

标签:Pin,引脚,void,笔记,STM32,GPIOA,GPIO,GPIOx
From: https://www.cnblogs.com/husai/p/18399359

相关文章

  • Python全网最全基础课程笔记(五)——选择结构+Python新特性Match
    本专栏系列为Pythong基础系列,每篇内容非常全面,包含全网各个知识点,非常长,请耐心看完。每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。以至于为什么要写的这么详细:自己也是学过Python的,很多新手只是简单的过一篇语法,其实对......
  • 蓝桥杯-STM32G431RBT6工程创建和程序烧录(保姆级图文详解)
    文章目录前言蓝桥杯嵌入式赛道所使用的开发板为STM32G431RBT6 CT117E-M4开发板(新版),如下图:一、需要安装的环境keilMDK,stm32cubemx,官方提供的资源包二、使用步骤(STM32cubemx部分)1,首先打开STM32cubemx注:蓝桥杯用HAL库更节省比赛时间,也更方便修改2,创建项......
  • FT232使用libusb控制GPIO
    FT232使用官方驱动控制GPIO很简单打开FT_OpenEx,FT_SetBitMode(FT_BITMODE_ASYNC_BITBANG)写FT_Write读FT_Read使用libusb方式打开// libusb-win32(v1.2.6.0)BOOL CHubGpio::InitLibusb(){ structusb_interface_descriptor*setting; structusb_bus *bus;......
  • InternLM 大模型实战营笔记-7
    基础岛第5关XTuner微调个人小助手认知目的:用internlm2-chat-1_8b模型,通过QLoRA的方式来微调一个自己的小助手1.微调前的模型对话进行端口映射,XXXXX是自己开发机的端口ssh-CNg-L8501:127.0.0.1:[email protected]激活环境,运行Stream......
  • openHarmony南向开发笔记(四)Linux设备树
    openHarmony南向开发笔记(四)Linux设备树文章目录openHarmony南向开发笔记(四)Linux设备树一、什么是设备树二、设备树的组成部分三、设备树基本语法四、dts常用符号含义一、什么是设备树Linux设备树(DeviceTree)是Linux内核用来描述硬件信息的一种数据结构,它在内核启动......
  • 【STM32项目设计】STM32F411健康助手--MAX30102 心率血氧传感器(5)
    硬件设计硬件连接MAX30102   STM32SDAPB7SCLPB6INTPB8GNDGND3V33V3软件设计max30102.c#include"max30102.h"#include"delay.h"u8max30102_Bus_Write(u8Register_Address,u8Word_Data){ /*采用串行EEPROM随即读取指令序列,连续读取若干字节*/ /*第1......
  • 【STM32项目设计】STM32F411健康助手--MPU6050陀螺仪驱动(6)
    硬件设计 软件设计此项目使用的是软件I2C,MPU6050的SCL连接到STM32的PB10,SDA连接到STM32的PB9mpuiic.c#include"mpuiic.h"#include"delay.h"//MPUIIC延时函数voidMPU_IIC_Delay(void){ delay_us(2);}//初始化IICvoidMPU_IIC_Init(void){ GPIO_Init......
  • 机器学习笔记-集合算法
    集合算法(EnsembleLearningAlgorithms)是通过将多个模型(通常是弱学习器)组合在一起,以提高整体预测性能的机器学习方法。它们在分类、回归等任务中非常常见。主要的集合算法包括以下几类:1.Bagging(BootstrapAggregating)原理:通过对数据集进行有放回的采样,训练多个独立的模型......
  • 驱动编写——《Android深度探索(卷1):HAL与驱动开发》笔记
    设备驱动大致骨架驱动代码.c文件#include<linux/module.h>#include<linux/init.h>#include<linux/slab.h>//使用kmalloc就需要includestaticunsignedcharmen[100000];//设备文件file,buf数据位置,count可读字节数,ppos偏移量staticssize_t驱动读函数(structfile*......
  • HTML/CSS/JS学习笔记 Day2(HTML)
    跟着该视频学习,记录笔记:【黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p=12&vd_source=04ee94ad3f2168d7d5252c857a2bf358Day2 内容梳理:目录HTML2.0网页开发的标签2.1基础标签的含义......