当前位置: 首页 > article >正文

【嵌入式】手把手教你入门STM32的GPIO:使用GPIO输入

目录

 GPIO 输入的基本概念

STM32 GPIO 输入配置步骤

注意事项

总结


 GPIO 输入的基本概念

GPIO引脚可以配置为输入或输出模式。在输入模式下,GPIO用于读取外部信号,比如开关、传感器等。以下是关于STM32 GPIO输入的一些基本知识点:

  • 引脚配置:每个GPIO引脚可以独立配置为输入或输出,支持多种输入模式。
  • 输入模式:GPIO输入引脚可以配置为上拉、下拉或浮空输入,以适应不同的电路设计。
  • 中断功能:GPIO输入支持外部中断,可以在信号变化时触发中断处理程序,增强实时响应能力。

STM32 GPIO 输入配置步骤

配置STM32的GPIO输入一般需要以下几个步骤:

选择GPIO引脚

  • 确定要使用的GPIO引脚,参考STM32的引脚图,确保该引脚支持输入功能

启用时钟

    使用RCC(时钟控制器)启用对应GPIO端口的时钟。每个GPIO端口(如GPIOA、GPIOB等)都有各自的时钟,使得该端口能够正常工作。

函数原型:

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

参数说明

  • RCC_APB1Periph:指定需要使能时钟的APB1外设,可以是以下值之一或组合(使用“按位或”操作):

    • RCC_APB1Periph_TIM2:定时器2
    • RCC_APB1Periph_TIM3:定时器3
    • RCC_APB1Periph_TIM4:定时器4
    • RCC_APB1Periph_USART2:USART2
    • RCC_APB1Periph_USART3:USART3
    • RCC_APB1Periph_I2C1:I2C1
    • RCC_APB1Periph_I2C2:I2C2
    • RCC_APB1Periph_CAN1:CAN1
    • RCC_APB1Periph_PWR:电源接口
    • RCC_APB1Periph_BKP:备份接口
    • RCC_APB1Periph_WWDG:独立看门狗
    • 其他设备按需设置。
  • NewState:指定外设时钟的新状态,可选值:

    • ENABLE:使能该外设的时钟。
    • DISABLE:禁用该外设的时钟。

使用示例

例如,要使能USART2的时钟,可以使用如下代码:

#include "stm32f10x_rcc.h"

void RCC_Config(void) {
    // 启用USART2的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOA, ENABLE);
}

配置引脚模式

    使用GPIO_InitTypeDef结构体设置引脚模式、上拉/下拉电阻等属性。引脚模式包括输入模式、输出模式等,具体可根据需要进行设置。

在调用GPIO_Init()函数前,需先定义并设置 GPIO_InitTypeDef 结构体的成员变量。该结构体通常包含以下成员:

typedef struct
{
  uint16_t GPIO_Pin;              // GPIO引脚,可以是GPIO_Pin_0~GPIO_Pin_15
  GPIOMode_TypeDef GPIO_Mode;      // GPIO模式,如输入、输出、复用等
  GPIOSpeed_TypeDef GPIO_Speed;    // GPIO速度,仅在输出模式下有效
} GPIO_InitTypeDef;
  • GPIO_Pin:指定要配置的GPIO引脚,可以是 GPIO_Pin_0GPIO_Pin_15。可以用 | 运算符选择多个引脚。
  • GPIO_Mode:指定GPIO模式,具体如下:
    • GPIO_Mode_AIN:模拟输入模式。
    • GPIO_Mode_IN_FLOATING:浮空输入模式。
    • GPIO_Mode_IPD:下拉输入模式。
    • GPIO_Mode_IPU:上拉输入模式。
    • GPIO_Mode_Out_OD:开漏输出模式。
    • GPIO_Mode_Out_PP:推挽输出模式。
    • GPIO_Mode_AF_OD:复用功能开漏输出模式。
    • GPIO_Mode_AF_PP:复用功能推挽输出模式。
  • GPIO_Speed:指定输出速度,仅在输出模式有效:
    • GPIO_Speed_10MHz:10 MHz速度。
    • GPIO_Speed_2MHz:2 MHz速度。
    • GPIO_Speed_50MHz:50 MHz速度。

假设我们要将GPIOAPA0配置为上拉输入模式,代码如下:

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

void GPIO_Config(void) {
    // 启用GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;

    // 配置PA0为上拉输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 设置速度,不影响输入模式
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

初始化引脚

    调用GPIO_Init()函数完成引脚的初始化,确保引脚配置生效。  

参数说明

  • GPIOx:指定GPIO端口,可以是GPIOAGPIOB等(视具体芯片而定)。
  • GPIO_InitStruct:指向GPIO_InitTypeDef结构体的指针,该结构体定义了引脚的初始化设置。

读取引脚状态

  使用GPIO_ReadInputDataBit()函数读取引脚的状态,以获取外部信号的当前状态。

参数说明 

  • GPIOx:指定GPIO端口,可以是GPIOAGPIOB等(具体端口视芯片不同而变化)。
  • GPIO_Pin:指定GPIO引脚,可以是 GPIO_Pin_0GPIO_Pin_1 等。

返回值

  • 1:表示引脚为高电平。
  • 0:表示引脚为低电平。
uint8_t pinState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);

if (pinState) {
    // 引脚状态为高电平
} else {
    // 引脚状态为低电平
}

注意事项

在进行GPIO输入配置时,以下注意事项值得关注:

  • 确保时钟启用:在配置GPIO之前,必须正确启用时钟。没有启用时钟的GPIO引脚将无法正常工作。
  • 外部中断配置:使用外部中断时,除了配置GPIO引脚外,还需要正确配置NVIC(中断控制器),以处理相应的中断服务例程(ISR)。
  • 信号去抖动:在读取开关等机械信号时,可能会出现抖动现象。可以通过软件去抖动或硬件滤波器来提高信号的稳定性。

总结

STM32的GPIO输入功能为外部设备交互提供了灵活的解决方案。通过正确配置GPIO引脚,开发者可以有效地读取外部信号,并在需要时触发中断,增强系统的响应能力。希望本文能够帮助您更好地理解和使用STM32的GPIO输入功能。在实际应用中,根据具体需求灵活配置GPIO将极大提升系统的性能与可靠性。


http://www.kler.cn/a/406570.html

相关文章:

  • 【1.2 Getting Started--->Installation Guide】
  • Flutter:shared_preferences数据存储,数据持久化,token等信息存储
  • JavaWeb——Mybatis
  • 【UCIE协议系列-1】
  • Linux(命令行扩展+命令行历史 大白话+图片)
  • 如何删除Kafka中的数据以及删除topic
  • SpringBoot入门准备——Maven的使用
  • Web3与智能合约:区块链技术下的数字信任体系
  • Python世界:力扣题解875,珂珂爱吃香蕉,中等
  • Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)
  • uniapp跨域问题解决方案
  • 博客文章怎么设计分类与标签
  • Java SE 与 Java EE:基础与进阶的探索之旅
  • PAL(Program-Aided Language Model)
  • android 使用MediaPlayer实现音乐播放--获取音乐数据
  • Spring Boot 3.0废弃了JavaEE,改用了Jakarta EE
  • Linux云平台Oracle 12c安装与数据迁移
  • 大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
  • el-tree扩展vue-easy-tree虚拟树的使用(解决页面卡顿)
  • 力扣 LeetCode 701. 二叉搜索树中的插入操作(Day10:二叉树)
  • wpf 事件转命令的方式
  • 【微服务】Spring AI 使用详解
  • [模版总结] - 树的基本算法4 -最近公共祖先 LCA
  • python语言基础
  • C/C++基础知识复习(26)
  • 【遵守孤儿规则的External trait pattern】