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

GPIO概念

GPIO通用输入输出口

在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作

引脚电平 0v ~3.3v,部分引脚可容任5v

输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议(I2C,SPI)输出时序等

输入模式下可读取端口得高低电平或电压,用读取案件输入,模拟电平输入,ADC电压采集 ,模拟通信协议接收数据等

GPIO管脚得工作模式

每个gpio 管脚可配置为8种输入输出模式

浮空输入          数字输入                                  可读取引脚电平,若引脚悬空则电平不稳定

上拉输入          数字输入                   可读取引脚电平,内部连接上拉电阻 悬空时默认高电平下拉输入          数字输入                   可读取引脚电平,内部连接下拉电阻 悬空时默认低电平

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

开漏输出        数字输出                   可输出引脚电平,高电平为高阻态,低电平为低阻态VSS

推挽输出        数字输出                   可输出引脚电平,高电平接VDD,低电平接VSS

复用开漏输出  数字输出                 由片上外设控制 高电平为高阻态,低电平接VSS

复用推挽输出  数字输出           由片上外设控制 高电平接VDD 低电平接VSS

3.各个工作模式以及应用场景

3.1浮空输入模式

特点:引脚得电平不确定或者外部已经有上拉下拉电阻得情况例如连接外部传感器得输出引脚,当传感器输出信号电平由其他内部电路确定,且不需要单片机额外得得上拉下拉来干扰信号时,就可以采用浮空输入模式,像某系模拟传感器得数字输出引脚,其输出电平传感器由自身电路决定,使用浮空输出可以准确得获取传感器得输出信号。
3.2 上拉输入

特点:

引脚内部连接有一个弱上拉电阻,当外部没有信号或者输入为高阻态得时,引脚会被上拉电阻拉高为高电平(通常为VDD),当外部输入低电平时,引脚的电平被拉低

应用场景:

常用于连接外部按键等输入设备,当按键未按下时,引脚通过上拉电阻保持高电平,当按键按下时,引脚与地连接,电平变为低电平,这样可以方便检测按键是否按下,并且减少外部干扰信号对引脚电平的影响,因为即使外部有短暂的干扰信号,只要其不足以拉低上拉电阻拉高的电平,引脚仍能保持高电平状态

下拉输入

特点:

引脚内部连接弱下拉电阻,当外部没有信号输入或者输入为高阻态的时,引脚会被下拉电阻拉低到低电平(通常为VSS)。当外部输入为高电平,引脚电平被拉高

应用场景:

与上拉输入模式类似,用于输入设备的连接,在一些需要检测的高电平有效信号的场合,如果外部信号容易受到干扰而产生触发,下拉输入模式可以在没有有效信号的输入的时候引脚为低电平,只当输入信号足够强的时候才能将引脚拉高,从而减少误发的情况·,例如在一些具有噪声环境的工业控制场合,检测外部检测传感器的高电平有效信号可以使用下拉输入模式。

模拟输入

特点:

引脚直接连接到芯片内部的模拟电路,用于输入模拟信号,这种模式下,引脚的数字输入缓冲器被禁用,以减少数字电路对模拟信号的干扰、

应用场景:

主要用于连接模拟传感器,如温度传感器,光照传感器,当需要对这些模拟信号进行模数转换处理时,将传感器输出引脚连接配置到模拟输入模式的GPIO引脚,然后通过ADC模块将模拟信号转换为数字信号,以便单片机进行后续的处理和分析

推挽输出 

特点:

可以输出高电平和低电平,输出电流较大,当输出高电平时,引脚通过内部的P-MOS管连接到电源,当输出低电平的时候,引脚通过内部的N-mos管连接到地(VSS)这种模式具有较强的驱动·能力,能够直接驱动一些小功率的外部设备,

应用

广泛应用于驱动LED等小功率负载,当需要点亮LED时,将引脚设置为高电平,电流从vod通过LED和引脚内部的P-MOS管流向地,LED发光,当需要熄灭LED时,将引脚设置为低电平,也可以控制外部继电器等设备的驱动线圈不过对于功率更大的继电器,可能需要额外的驱动电路来增强驱动电路

开漏输出

特点:

当输出低电平时,引脚通过内部的N_MOS管连接到地(VSS),输出低电平,当输出高电平时时,引脚处于高阻态,需要外部上拉电阻才能将电平拉高,这种模式可以实现线与功能,既多个开漏输出的引脚连接在一起,只要一个引脚输出低电平,整个连接点的电平就为低电平了

应用场景:

在需要实现线与功能的场合使用,如I2C总线协议中的SDA和SCL引脚通常采用开漏输出的模式,在I2C的总线上多个·设备可以通过线与方式共享数据线和时钟线,实现数据的传输和同步,同时需要在外部上拉电阻来灵活的调整输出电平的应用中,也可以使用开漏输出模式

3.7复用开漏输出

特点:

与通用的开漏输出模式类似,也是用于复用功能,当引脚被配置为复用功能且采用开漏输出时,通用内部复用器连接到外设功能模块,输出信号在高电平状态下为高阻态,需要外部上拉电阻来拉高电平

应用场景:

主要用于一些特殊的复用功能外设,如某些通信协议类似于(I2C)的复用功能实现或者需要“线与”功能的复用功能输出的场合,例如,在一些特殊的spi通信模式下,当需要实现数据的线与 或者灵活的外拉上拉电平控制时,可以采用复用开漏输出模式

GPIO_MODER这个寄存器用于GPIO的管脚的工作模式

这个寄存器用于GPIO的管脚的输出类型

这个管脚用于GPIO_OSPEEDR这个寄存器用于管脚的输出速度

GPIOx_PUPDR

这个寄存器用于设置GPIO有无上拉下拉电阻

GPIO_IDR这个寄存器用于保存管脚的输入值

GPIO_ODR用于设置关键输出电平高低

GPIOX_BSRR 可以对odr寄存器的值进行修改

这个寄存器用于清除odr寄存器的对应位

向bit10写1,ODR寄存器bit10会清零

FSMP1A开发板向GPIO输出示例---LED亮灭控制

经过分析我们可知只需要LED1对应的线给三极管输出一个高电平,集电极和发射极可以导通,发光二极管可以亮

所以要确定LED1接在什么位置

设置GPIO的相关寄存器,让PE10可以输出高电平

GPIOE_MODER[21:20] 设置为01,PE10管脚为输出模式

GPIOE_OYTPER[10] 设置为0,PE10推挽输出

GPIOE_OSPEEDR[21:20]设置为00,PE10输出无上拉下拉电阻

GPIOE_ODR[10]设置为1,PE10输出高电平,设置为0,PE10输出低电平

查询RCC寄存器,使能GPIOE外设时钟

确定RCC和GPIOE的地址

RCC的基地址为   0x50000000

GPIOE的基地址为0x50006000

寄存器地址=基地址加偏移量

6.2分析Makefile

NAME=asm-led#指定要编译的汇编的名字
CROSS_COMPILE=arm-linux-guneabihf-  #指定交叉编译工具链前缀
CC=$(CROSS_COMPILE)gcc  #指定gcc编译器的名字LD=(CROSS_COMPILE)ld #指定链接器的名字
OBJCOPY= $(CROSS_COMPILE)objcopy #指定工具名,objcopy工具可以将二进制文件的格式进行切换
OBJDUMP= $(CROSS_COMPILE)objdump #指定生成反汇编文件的工具名字
all:
#编译1汇编文件生成.o文件
$(CC) -O0 -g-c $(NAME).S -o $(NAME).o
#链接。o文件生成elf可执行文件
$(LD) -Ttext=0xC0008000 $(NAME).o -o $(NAME).elf
#将elf可执行文件转换成bin格式
$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin
#生成可执行文件的反汇编文件
$(OBJDUMP) -D $(NAME).elf>$(NAME).dis
clean:
rm-rf *.elf *.bin *.o *.dis

LED2 相关配置:

使能GPIOF外设时钟

RCC_MP_AHB4ENSETER[5] ->1

2设置PF10 为输出

GPIOF_MODER[21:20]->01 //0x50007000

设置PF10为推挽输出

GPIOF_OTYPER[10] ->0//0x50007004

设置PF10为低速输出

GPIOF_OSPEEDER[21:20]-> 00//0X50007008

设置PF10输出时无上拉下拉电阻

GPIOF_PUPDR[21:20]->00//0x5000700C

PF10输出高低电平

GPIOF_ODR[10] //0x50007014

1.LED3 相关配置

使能 GPIOE外设时钟

RCC_MP_AHB4ENSETER[4]->1

2.设置PE8为输出

GPIOE_MODER[17:16]->01 //0x50006000

3设置PE8为推挽输出

GPIOF_OTYPER[8] ->00//0x50006004

4,设置PE8低速输出

GPIOF_OSPEEDRP[17:16]->00//0x50006008

5,设置PE8输出时无上拉下拉电阻

GPIOF_PUPDR[17:16]->00 //0x5000600C

6.PE8 输出高低电平

GPIOF_ODR[8] //0x50006014

C语言代码

main.c

 int main()
{
led_init();
while(1)
{led_ctl(1,1);
led_ctl(2,0);
led_ctl(3,0);
delay_ms(500);
led_ctl(1,0);
led_ctl(2,1);
led_ctl(3,0);
delay_ms(500);
led_ctl(1,0);
led_ctl(2,0);
led_ctl(3,1);
delay_ms(500);}
return 0;
}
#include "delay.h"void delay_ms(int ms)
{int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++)
{}}}

上面是延迟函数

#include "led.h"
void led_init()
{
//gpio的初始化
//将RCC_MP_AHB4ENSETER 寄存器的[5:4]设置为1,使能GPIOE时钟
RCC |=(0X3<<4)
GPIOE.MODER &=(~(0X3<<20));//先清零
GPIOE.MODER |=(0X1<<20);//再置位
//GPIOF_MODER[21:20]设置为01,PE10管脚为输出模式
GPIOF.MODER &=(~(0x3<<20)); //先清零GPIOF.MODER|=(0X1<<20)//在置位
//GPIOE_OTYPER[10]设置为0,PE10推挽输出
GPIOE.OTYPER &=(~(0x1<<10))//先清零GPIOF.OTYPER &=(~(0x1<<10))//先清零
GPIOE.OTYPER &=(~(0x1<<8))//先清零
//3.GPIOE_OSPEEDR[21:20]设置为00,PE10低速输出
GPIOE.OSPEEDR &=(~(0X3)<<20);//先清0
GPIOF.OSPEEDR &=(~(0X3)<<20);//先清0
GPIOE.OSPEEDR &=(~(0X3)<<16);//先清0
GPIOE.PUPDR &=(~(0X3<<20));
GPIOF.PUPDR &=(~(0X3<<20));
GPIOE.PUPDR &=(~(0X3<<16));}
void led_ctl(int which,int cmd)
{
switch(which)
{
case 1:
if(cmd ==0)
GPIOE.ODR &=(~(0X1<<10));
else if(cmd==1)
GPIOE.ODR |=(0X1<<10);
break;
case 2:
if(cmd ==0)
GPIOF.ODR &=(~(0X1<<10));
else if(cmd==1)
GPIOF.ODR |=(0X1<<10);
break;case 3:
if(cmd ==0)
GPIOE.ODR &=(~(0X1<<8));
else if(cmd==1)
GPIOE.ODR |=(0X1<<8);
break;}}

相关文章:

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

Node.js, Bun, Deno 比较概述

以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl&#xff08;Node.js 原作者&#xff09;Jarred Sumner运行时引擎V8&#xff08;Chrome&#xff09;V8&#xff08;Chrome&#xff09;JavaScriptCore&#…...

C# 类库打包dll文件

目录 前言操作流程注意事项 前言 在C#中&#xff0c;有多种方式可以对代码进行加密&#xff0c;以保护源代码不被轻易查看或修改&#xff0c;这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中&#xff0c;选择“创建新项目”。 选…...

Linux中的UDP编程接口基本使用

UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式&#xff0c;有了这些理论基础之后&#xff0c;下面先从UDP编程开始从操作部分深入网络 在本篇中&#xff0c;主要考虑下面的内容&#xff1a; 创建并封装服务端&#xff1a;了解创建服务端的…...

RAG项目实战:金融问答系统

需求痛点 私有知识很多&#xff0c;如何让大模型只选择跟问题有关的知识进行参考呢&#xff1f; 需求分析 是否可以使用关键词匹配呢&#xff1f;以前的搜索主要使用关键词匹配&#xff0c;这个要求太高了&#xff0c;需要提前抽取准备好关键词&#xff0c;有点像以前SEO的工…...

大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化

假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解&#xff0c;接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化&#xff0c;以下是详细介绍及代码示例&#xff1a; 1. React 高级特性的深入学习 1.1 React 并发模式&#xff08;Con…...

虚拟机Linux操作(持续更新ing)

虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机&#xff0c;可以选择数字或者具体时间 shutdown -h now # 立刻重启&#xff0c;可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...

【开源-线程池(Thread Pool)项目对比】

一些实现**线程池&#xff08;Thread Pool&#xff09;**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用&#xff0c;代码简洁&#xff1b;适合快速原型开发。功能较为基础&#xff0c;不支持动态调整线程数…...

JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)

JMeter 实战项目脚本录制最佳实践&#xff08;含 BadBoy 录制方式&#xff09; 一、项目背景 在软件测试过程中&#xff0c;使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制&#xff0c;并完善脚本以…...

Jackson注解实战:@JsonInclude的妙用

在日常的Java开发中&#xff0c;我们经常需要将Java对象序列化为JSON格式&#xff0c;以便进行数据传输或存储。然而&#xff0c;有时候我们并不希望在JSON中包含某些空值或不必要的字段&#xff0c;这不仅会增加数据的冗余性&#xff0c;还可能对后续的处理造成困扰。Jackson库…...

CAN总线通信协议学习1——物理层

首先来看看CAN是怎么产生的&#xff1a;简单理解&#xff0c;CAN就是一种“拥有特别连接方式”的数据传输的总线&#xff0c;其有特定的一些规则。 &#xff08;注&#xff1a;资料及图片来源于知乎博主TOMOCAT。&#xff09; CAN总线的结构 查阅参考文献&#xff0c;OSI标准…...

Vim 常用快捷键大全:跳转、编辑、查找替换全解析

摘要&#xff1a; Vim 是一款非常强大的文本编辑器&#xff0c;许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令&#xff0c;从基本模式、光标移动、编辑操作到查找替换&#xff0c;再到文件保存等常用操作&#xff0c;帮助你快速上手并提…...

【Python 数据结构 2.时间复杂度和空间复杂度】

Life is a journey —— 25.2.28 一、引例&#xff1a;穷举法 1.单层循环 所谓穷举法&#xff0c;就是我们通常所说的枚举&#xff0c;就是把所有情况都遍历了的意思。 例&#xff1a;给定n&#xff08;n ≤ 1000&#xff09;个元素ai&#xff0c;求其中奇数有多少个 判断一…...

【Qt QML】QML鼠标事件(MouseArea)

QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …...

LeetCode 202. 快乐数 java题解

https://leetcode.cn/problems/happy-number/description/ 哈希表 class Solution {public boolean isHappy(int n) {if(n1) return true;HashSet<Integer> setnew HashSet<>();while(n!1&&!(set.contains(n))){//没找到结果&#xff1b;没有重复出现过se…...

《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》

--- ## 前言&#xff1a;为什么传统学习法正在杀死你的竞争力&#xff1f; 在新能源汽车领域&#xff0c;我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时&#xff0c;固态电池已进入量产倒计时&#xff1b;当自动驾驶还在L2级徘…...

PHP环境安装达梦数据库驱动实操

PHP环境安装达梦数据库驱动实操 一、环境准备 达梦数据库安装 从达梦官网下载对应系统版本的DM8开发版或企业版&#xff0c;完成安装并确保数据库服务正常运行。安装后需记录数据库的安装路径&#xff08;如Windows默认路径为D:\dmdbms&#xff0c;Linux为/dm/server&#xff0…...

Electron + Vite + React + TypeScript 跨平台开发实践指南

Electron Vite React TypeScript 跨平台开发全栈实践指南 开发环境的搭建(node.js&#xff0c;npm的安装)请参见我的文章 2025Q1 核心组件版本矩阵 组件版本关键改进特性Electron30.0.0原生ESM支持、V8引擎性能优化30%Vite6.0.0多核编译加速、SSR增强模式React21.0.0并发…...

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…...

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...