stm32——GPIO开发
目录
1、什么是GPIO
2、GPIO的作用
3、GPIO的基本结构
4、GPIO引脚的基本结构
5、GPIO端口模式的配置
1. 输入浮空(Input Floating)
2. 输入上拉(Input Pull-Up)
3. 输入下拉(Input Pull-Down)
4. 模拟输入(Analog Input)
5. 开漏输出(Open-Drain Output)
6. 推挽式输出(Push-Pull Output)
7. 推挽式复用功能(Alternate Function Push-Pull)
8. 开漏复用功能(Alternate Function Open-Drain)
6、GPIO重映射
7、GPIO配置的相关寄存器
1、端口配置低寄存器(GPIOx_CRL):
2、端口配置高寄存器(GPIOx_CRH):
3、端口是输入数据寄存器(GPIOx_IDR):
4、端口输出数据寄存器(GPIOx_ODR):
5、端口位设置/清除寄存器(GPIOx_BSSR):
6、端口位清除寄存器(GPIOx_BRR):
7、端口配置锁定寄存器(GPIOx_LCKR):
8、示例
1、开启对应的时钟
2、配置GPIO
3、改变GPIO的数据寄存器
1、什么是GPIO
GPIO(General Purpose Input/Output)是一种通用的输入输出接口,广泛应用于微控制器和单板计算机(如树莓派、Arduino等)。GPIO可以配置为输入或输出,用于控制和读取各种外部设备,比如传感器、开关、LED灯等。
总得来说GPIO是引脚,但是不是所有的引脚都是GPIO
2、GPIO的作用
输出:输出模式下可以控制输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序
输入:输入模式下可以读取端口的高低电平或电压,用于读取按键的输入、外界模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
3、GPIO的基本结构
在STM32中,所有的GPIO都是挂载在APB2外设总线上的,每个GPIO外设各有16个引脚

4、GPIO引脚的基本结构

5、GPIO端口模式的配置
stm32f10x系列芯片举例

从芯片手册可以知道,GPIO有八种模式
1. 输入浮空(Input Floating)
- 功能:引脚处于高阻态,不连接时不会对电路产生影响。此模式适用于读取外部信号。
- 应用:常用于读取开关状态或传感器信号,但在未连接时可能导致引脚浮动,易受干扰。
2. 输入上拉(Input Pull-Up)
- 功能:引脚通过内置的上拉电阻连接到VDD(正电源),未连接时引脚保持高电平。
- 应用:常用于确保输入引脚在未连接时不处于浮动状态,防止误触发。例如,在按钮按下时,读取高电平(按钮未按下时为高电平)。
3. 输入下拉(Input Pull-Down)
- 功能:引脚通过内置的下拉电阻连接到地(GND),未连接时引脚保持低电平。
- 应用:类似上拉输入,常用于确保输入引脚在未连接时保持低电平状态。例如,在按钮按下时,读取低电平(按钮未按下时为低电平)。
4. 模拟输入(Analog Input)
- 功能:引脚被配置为模拟模式,适用于模拟信号的读取,如ADC(模拟数字转换器)的输入。
- 应用:用于连接传感器(如温度传感器、光传感器等),读取模拟信号并转换为数字值。
5. 开漏输出(Open-Drain Output)
- 功能:引脚可以输出低电平(逻辑0),未驱动时引脚处于高阻态。需要外部上拉电阻来将未驱动状态下的引脚拉到高电平。
- 应用:适用于多点连接的信号线(如I2C总线),多个设备可以共享一条线路,避免信号冲突。
6. 推挽式输出(Push-Pull Output)
- 功能:引脚可以输出高电平(逻辑1)或低电平(逻辑0),能够驱动外部负载。
- 应用:用于控制LED、继电器等外部设备,广泛应用于数字输出场景。
7. 推挽式复用功能(Alternate Function Push-Pull)
- 功能:引脚配置为复用模式,能够支持特定外设(如USART、SPI等)的推挽输出。
- 应用:用于数字通信接口,将引脚设置为特定外设的输出引脚。
8. 开漏复用功能(Alternate Function Open-Drain)
- 功能:引脚配置为复用模式,能够支持特定外设(如I2C)的开漏输出。
- 应用:适用于多点连接场景,允许多个设备在同一线路上通信,避免信号冲突。
6、GPIO重映射
GPIO重映射:为了使不同器件封装外设I/O的数量达到最优,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。
7、GPIO配置的相关寄存器
1、端口配置低寄存器(GPIOx_CRL):
配置低八位引脚工作模式的寄存器
2、端口配置高寄存器(GPIOx_CRH):
配置高八位引脚工作模式的寄存器
3、端口是输入数据寄存器(GPIOx_IDR):
保存输入数据的寄存器
4、端口输出数据寄存器(GPIOx_ODR):
设置输出数据的寄存器
5、端口位设置/清除寄存器(GPIOx_BSSR):
对端口位置1和置0的寄存器
6、端口位清除寄存器(GPIOx_BRR):
设置端口位置0的寄存器
7、端口配置锁定寄存器(GPIOx_LCKR):
当执行正确的写序列设置了位16时,这个寄存器可以用来锁定端口的配置,位[15:0]用于锁定GPIO端口的配置,当相应的端口位执行了LOCK序列之后,在下次系统复位前讲不能再更改端口位的配置。每个锁定位锁定口控制寄存器(CRL、CRH)中相应的四个位
8、示例
好的,讲了这么多,各位应该很好奇,那到底应该怎么配置呢,跟着我的步伐,手把手教你配置GPIO
1、开启对应的时钟
从第3点的图中,我们可以知道,GPIO的时钟来自APB2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
这个函数就是标准库为我们封装好的配置APB2时钟的函数
这个函数在stm32f10x_rcc.h中
如果是我一个的keil开发,可以右键这个函数,

第一个就是跳转倒函数的定义
第二个是跳转到函数的声明
/*** @brief Enables or disables the High Speed APB (APB2) peripheral clock.* @param RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.* This parameter can be any combination of the following values:* @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,* RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,* RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,* RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,* RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,* RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,* RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11 * @param NewState: new state of the specified peripheral clock.* This parameter can be: ENABLE or DISABLE.* @retval None*/
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){RCC->APB2ENR |= RCC_APB2Periph;}else{RCC->APB2ENR &= ~RCC_APB2Periph;}
}
这就是配置APB2的函数声明,我们选择参数填入
2、配置GPIO
GPIO_Init(GPIOB,&GPIOB_struct);
调用这个函数,继续跳转函数定义
/*** @brief Initializes the GPIOx peripheral according to the specified* parameters in the GPIO_InitStruct.* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that* contains the configuration information for the specified GPIO peripheral.* @retval None*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
看注释,第一个参数容易,那么第二个参数怎么办呢??一样,选中参数类型跳转定义
/** * @brief GPIO Init structure definition */typedef struct
{uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
ok,就是一个tepedef的结构体,那我们自己定义一个结构体出来就可以了
GPIO_InitTypeDef GPIOB_struct;GPIOB_struct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14;GPIOB_struct.GPIO_Speed = GPIO_Speed_50MHz;GPIOB_struct.GPIO_Mode = GPIO_Mode_Out_PP;
将这个结构体放在GPIO_IInit函数前面定义出来就OK,每一个成员是什么,应该怎么幅值,看注释和继续类型跳转就ok
比如GPIO_Mode,就点击前面的类型GPIOMode_TypeDef跳转至
typedef enum
{ GPIO_Mode_AIN = 0x0,GPIO_Mode_IN_FLOATING = 0x04,GPIO_Mode_IPD = 0x28,GPIO_Mode_IPU = 0x48,GPIO_Mode_Out_OD = 0x14,GPIO_Mode_Out_PP = 0x10,GPIO_Mode_AF_OD = 0x1C,GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
选择我们要的模式,幅值给GPIO_Mode就ok了
到此为止GPIO就配置完成
3、改变GPIO的数据寄存器
GPIO_SetBits(GPIOB,GPIO_Pin_12);
这个函数就可以将GPIOB-12的电平拉高
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
这个函数就可以将GPIOB-12的电平拉低
ok,至此,配置寄存器以及GPIO输出高低电平便已完成,外接一个需要电平的led,我们拉高和拉低电平,便可以实现点灯与灭灯
相关文章:
stm32——GPIO开发
目录 1、什么是GPIO 2、GPIO的作用 3、GPIO的基本结构 4、GPIO引脚的基本结构 5、GPIO端口模式的配置 1. 输入浮空(Input Floating) 2. 输入上拉(Input Pull-Up) 3. 输入下拉(Input Pull-Down) 4. …...
layui 自定义验证单选框必填
对于输入框类型必填验证,只需要在 input 输入框加入 lay-verify "required" 即可。但对于单选按钮这种特殊的该怎么办呢?layui 为我们提供了自定义验证。 1. 在单选按钮上添加自定义验证的名称 2. 验证规则如下 // 单选框自定义验证form.ve…...
Spring 设计模式之策略模式
Spring 设计模式之策略模式 策略模式构成部分java举例 策略模式 策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。 构成部分 Context(上下文&…...
苹果开发 IOS 证书生成步骤
前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后,就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心,创建 profiles 文件,并下载以上步骤即可,就这…...
DDR2 SDRAM(五)初始化
因为DDR2本质上只是更高级的一种SRAM,底层操作原理和SRAM是一样的,所以很多基础的东西就不再赘述了。 一、原理 在初始化之前,DDR2芯片需要先上电,芯片有多个需要提供的电压,其大小和顺序也有要求,这部分…...
Python工具箱系列(五十七)
图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下&#x…...
数据智能驱动金融策略优化:民锋智能分析技术的应用
在现代金融市场中,数据分析与智能化技术的结合为投资策略带来了全新机遇。民锋以智能分析技术为核心,帮助投资者在复杂的市场环境中做出高效决策。本文将深入探讨民锋智能分析技术如何驱动策略优化,为投资者带来更加智能化的支持。 #### 一、…...
1009:带余除法
【题目描述】 给定被除数和除数,求整数商及余数。此题中请使用默认的整除和取余运算,无需对结果进行任何特殊处理。 【输入】 一行,包含两个整数,依次为被除数和除数(除数非零),中间用一个空格隔…...
Jmeter实际应用
环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点,不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码,是要在jmeter中用的 keytool -import -ali…...
C++基础(11.AVL树的实现)
目录 AVL的概念: AVL树的实现: AVL树的结构: AVL树的插⼊: 平衡因⼦更新: 旋转: AVL树的其他功能: AVL树平衡检测: 测试代码*2: 源代码: KV结构: 源代码: AVL…...
c# 抽象方法 虚函数 使用场景
在C#中,抽象方法(abstract method)和虚函数(virtual method)都是用于实现多态性(polymorphism)的重要特性,但它们在使用上有一些关键的区别和各自的用途。 抽象方法(Abs…...
大数据安全方案 验证
一、背景 文档用于记录配置 Kerberos 和 Ranger 后,对 HDFS、Hive 认证和鉴权的功能测试。 二、Kerberos 验证 2.1、验证功能 1,HDFS 认证 2.1.1、访问 HDFS Kerberos 验证前,访问 HDFS 失败。 Kerberos 验证后,访问 HDFS 成…...
电脑软件:推荐一款免费且实用的电脑开关机小工具
目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown,有需要的朋友可以下载试一下! 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具,对于…...
php反序列化靶场随笔分析
项目地址:github.com/mcc0624/php_ser_Class 推荐使用docker部署:https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础,我们直接从class6开始实验 class6 访问页面,传一个序列化的字符串,php代码将其反…...
动态规划 - 编辑距离
115. 不同的子序列 困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 7 取模。 算法思想:利用动态规划,分s[i - 1] 与 t[j - 1]相等,s[i - 1] 与 t[j - 1] 不相等两种情况具…...
力扣——113. 路径总和
113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...
C02S04-Ubuntu基本使用
一、Ubuntu初始配置 1. 使用root用户 Ubuntu系统默认只能使用普通用户,要想使用root用户,需要先设置root用户密码。 进入终端,配置root用户密码。按照提示输入密码。 sudo passwd root配置完成后,执行下面的密码,切换…...
C语言 | Leetcode C语言题解之第525题连续数组
题目: 题解: struct HashTable {int key, val;UT_hash_handle hh; };int findMaxLength(int* nums, int numsSize) {int maxLength 0;struct HashTable* hashTable NULL;struct HashTable* tmp malloc(sizeof(struct HashTable));tmp->key 0, tm…...
Qml-Transition的使用
Qml-Transition的使用 Transition的概述 Transition:定义了当状态发生改变时应用的动画属性animations : list:(Transition)过渡的动画属性enabled : bool:状态发生变化时,是否使能此过渡(Transition)动画…...
Notepad++检索包含多个关键字的行
Notepad检索包含多个关键字的行 在Notepad中,你可以使用正则表达式来检索包含多个关键字的行。以下是具体步骤: 打开Notepad,打开要搜索的文件。 点击菜单栏上的“搜索”选项,然后选择“查找”。 在弹出的查找对话框中…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
