STM32--GPIO

教程

视频

博主教程

STM32系统结构图

GPIO

GPIO(General Purpose Input/Output)是STM32内部的一种外设。

一个STM32芯片内存在多个GPIO外设,每个GPIO外设有16个引脚;

比如GPIOA:PA0~PA15;

GPIOB:PB0~PB15。

每个IO引脚都有输入电路和输出电路。

GPIO8种工作模式

链接

输入模式

由上下拉电阻控制。

上拉模式如何保持高电平

工作原理

  1. 当配置为上拉模式时,GPIO内部会连接一个上拉电阻(通常约30-50kΩ)到VDD

  2. 当没有外部信号驱动时,上拉电阻会将引脚电压拉至高电平

VDD(正电源)

下拉模式如何保持低电平

工作原理

  1. 当配置为下拉模式时,GPIO内部会连接一个下拉电阻(通常约30-50kΩ)到GND

  2. 当没有外部信号驱动时,下拉电阻会将引脚电压拉至低电平

VSS(负电源/地)

输出模式

由正负半导体控制 。

MOS

MOS(金属氧化物半导体)。

PMOS中的"P"

  • P代表Positive(正)

  • 当输出高电平时导通

NMOS中的"N"

  • N代表Negative(负)

  • 当输出低电平时导通

推挽输出

1上高,0下低;

开漏输出

PMOS断开,无效,只有NMOS在工作。

通用和复用输出

复用输出模式,与通用输出模式很是类似。只是输出的高低电平的来源,不是写程序让CPU直接写输出数据到寄存器,取而代之利用片上(stm32芯片上的)外设模块来输出电平信号。

注意:通用模式和复用模式接线不同。

GPIO编程控制步骤

1,使用RCC开启GPIO的时钟;

2,使用GPIO_Init()函数初始化GPIO;

3,使用输出/输出函数控制GPIO口。

GPIO的库函数

设置GPIO引脚电平

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置指定GPIO端口的单个或多个引脚为高电平(置1)

参数

  • GPIOx:GPIO端口(如GPIOA、GPIOB等)

  • GPIO_Pin:要设置的引脚(可使用|组合多个引脚)

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:设置指定GPIO端口的单个或多个引脚为低电平(置0)

参数

  • GPIOx:GPIO端口

  • GPIO_Pin:要清除的引脚(可使用|组合多个引脚)

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

功能:设置指定GPIO端口的单个引脚状态

参数

  • GPIOx:GPIO端口

  • GPIO_Pin:要设置的引脚(只能单个引脚)

  • BitVal:引脚状态(Bit_SETBit_RESET

// 设置GPIOC的Pin4为高电平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_SET);// 设置GPIOC的Pin4为低电平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_RESET);

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

功能:一次性设置整个GPIO端口的输出状态

参数

  • GPIOx:GPIO端口

  • PortVal:16位值,表示所有引脚的状态(每个bit对应一个引脚)

// 设置GPIOA所有引脚状态:Pin0=1, Pin1=0, Pin2=1, 其他=0
GPIO_Write(GPIOA, 0x0005);  // 二进制 0000 0000 0000 0101

获取引脚输入/输出电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

什么时候使用input,什么时候使用output?

函数类别读取的数据来源典型应用场景
Input系列函数读取GPIO引脚当前输入电平检测外部信号(按键、传感器等)
Output系列函数读取GPIO输出寄存器的值验证软件配置的输出状态

(1) 何时使用Input函数

当GPIO配置为输入模式或需要读取实际引脚电平时:

检测外部信号:

// 读取PA0引脚电平(配置为输入模式)
if(GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == Bit_SET) {// 高电平处理(如按键按下)
}

读取多个输入引脚

uint16_t port_val = GPIO_ReadInputData(GPIOB); // 读取PB0-PB15所有引脚
(2) 何时使用Output函数

当需要确认输出寄存器的状态(而非实际引脚电平)时:

验证输出配置

// 检查PC13输出寄存器是否设置为高电平
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_PIN_13) == Bit_SET) {// 软件设置过输出高电平
}

批量读取输出状态

uint16_t output_states = GPIO_ReadOutputData(GPIOD); // 读取PD端口输出寄存器

关键注意

  • 输出函数读取的是输出数据寄存器(ODR)的值,不一定等于实际引脚电平

  • 若外部电路拉低/拉高引脚(如短路),实际电平可能与ODR值不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QUIC协议优化:HTTP_3环境下的超高速异步抓取方案

摘要 随着 QUIC 和 HTTP/3 的普及,基于 UDP 的连接复用与内置加密带来了远超 HTTP/2 的性能提升,可显著降低连接握手与拥塞恢复的开销。本文以爬取知乎热榜数据为目标,提出一种基于 HTTPX aioquic 的异步抓取方案,并结合代理 IP设…

[论文阅读]MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System

MCP Guardian: A Security-First Layer for Safeguarding MCP-Based AI System http://arxiv.org/abs/2504.12757 推出了 MCP Guardian,这是一个框架,通过身份验证、速率限制、日志记录、跟踪和 Web 应用程序防火墙 (WAF) 扫描来…

Redis客户端缓存的4种实现方式

Redis作为当今最流行的内存数据库和缓存系统,被广泛应用于各类应用场景。然而,即使Redis本身性能卓越,在高并发场景下,应用与Redis服务器之间的网络通信仍可能成为性能瓶颈。 这时,客户端缓存技术便显得尤为重要。 客…

eNSP中路由器OSPF协议配置完整实验和命令解释

本实验使用三台华为路由器(R1、R2和R3)相连,配置OSPF协议实现网络互通。拓扑结构如下: 实验IP规划 R1: GE0/0/0: 192.168.12.1/24 (Area 0)Loopback0: 1.1.1.1/32 (Area 0) R2: GE0/0/0: 192.168.12.2/24 (Area 0)GE0/0/1: 192.…

内网渗透——红日靶场三

目录 一、前期准备 二、外网探测 1.使用nmap进行扫描 2.网站信息收集 3.漏洞复现(CVE-2021-23132) 4.disable_function绕过 5.反弹shell(也,并不是) 6.SSH登录 7.权限提升(脏牛漏洞) 8.信息收集 9.上线msf 三…

解决Win11下MySQL服务无法开机自启动问题

问题描述 在win11系统中,明明将MySQL服务设置成了自动启动,但在重启电脑后MySQL服务还是无法自动启动,每次都要重新到计算机管理的服务中找到服务再手动启动。 解决方式 首先确保mysql服务的启动类型为自动。 设置方法:找到此电…

后端项目进度汇报

项目概述 本项目致力于构建一个先进的智能任务自动化平台。其核心技术是一套由大型语言模型(LLM)驱动的后端系统。该系统能够模拟一个多角色协作的团队,通过一系列精心设计或动态生成的处理阶段,来高效完成各种复杂任务&#xff…

深度学习中学习率调整:提升食物图像分类模型性能的关键实践

深度学习中学习率调整:提升食物图像分类模型性能的关键实践 接上篇保存最优模型,在深度学习模型训练过程中,学习率作为核心超参数,其设置直接影响模型的收敛速度与最终性能。本文将结合食物图像分类项目,深入探讨学习…

Vue 3零基础入门:从环境搭建到第一个组件

Vue 3零基础入门:从环境搭建到第一个组件 一、Vue 3简介 Vue.js是一款渐进式JavaScript框架,用于构建用户界面。Vue 3是Vue的最新主要版本,于2020年9月发布,带来了许多改进和新特性: 更快的渲染速度更小的包体积Com…

为了结合后端而学习前端的学习日志(1)——纯CSS静态卡片案例

前端设计专栏 使用纯CSS创建简洁名片卡片的学习实践 在这篇技术博客中,我将分享我的前端学习过程,如何使用纯HTML和CSS创建一个简洁美观的名片式卡片,就像我博客首页展示的那样。这种卡片设计非常适合作为个人简介、产品展示或团队成员介绍…

k8s监控方案实践(一):部署Prometheus与Node Exporter

k8s监控方案实践(一):部署Prometheus与Node Exporter 文章目录 k8s监控方案实践(一):部署Prometheus与Node Exporter一、Prometheus简介二、PrometheusNode Exporter实战部署1. 创建Namespace(p…

谷歌最新推出的Gemini 2.5 Flash人工智能模型因其安全性能相较前代产品出现下滑

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【Python】PDF文件处理(PyPDF2、borb、fitz)

Python提供了多种方法和库用于处理PDF文件,这些工具可以帮助开发者实现诸如读取、写入、合并、拆分以及压缩等功能。以下是几个常用的Python PDF操作库及其基本用法(PyPDF2、borb、fitz)。 1. PyPDF2 PyPDF2 是一个功能强大的库&#xff0…

websocketd 10秒教程

websocketd 参考地址:joewalnes/websocketd 官网地址:websocketd websocketd简述 websocketd是一个简单的websocket服务Server,运行在命令行方式下,可以通过websocketd和已经有程序进行交互。 现在,可以非常容易地构…

Spring Boot 基于 Cookie 实现单点登录:原理、实践与优化详解

前言 在多系统交互的应用场景中,单点登录(SSO)能够显著提升用户体验,减少重复登录的繁琐操作。基于 Cookie 的单点登录方案,凭借其简单直观、浏览器原生支持的特性,成为快速实现单点登录的有效方式。本文将…

ModBus协议详解:从基础概念到C#实现RTU与TCP通讯

ModBus协议是莫迪康公司为了让PLC之间进行数据通信而设计出来的协议。它是一种总线协议,是一种一对多,上下级的关系。 它的应用广泛,具有免费开源,操作简单的有点,并且可以兼容串口和网络通讯,兼容也不错。…

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中,数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表,还是分析日志信息,合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数(如 sort()、rsort()、asort() 等)&#…

RabittMQ-高级特性2-应用问题

文章目录 前言延迟队列介绍ttl死信队列存在问题延迟队列插件安装延迟插件使用事务消息分发概念介绍限流非公平分发(负载均衡) 限流负载均衡RabbitMQ应用问题-幂等性保障顺序性保障介绍1顺序性保障介绍2消息积压总结 前言 延迟队列介绍 延迟队列(Delaye…

HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面

文章目录 为什么需要模拟 Windows 环境?一、修改 User-Agent 模拟 Windows 浏览器方法 1:通过 Chrome 开发者工具修改 UA方法 2:使用浏览器插件 二、模拟 Windows 的字体和滚动条样式1. 模拟 Windows 字体2. 强制显示滚动条(模拟 …

如何删除豆包本地大模型

由于无法选择大模型的安装位置,因此会占用C盘大量空间,然后又找到不卸载的地方,经排查豆包大模型安装位为:C:\Users\[当前电脑用户]\AppData\Local\Doubao\User Data,只能进行手动卸载。