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;

}










}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展&#xff0c;本地部署大型语言模型&#xff08;LLM&#xff09;已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私&#xff0c;还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2&#xff08;24GB 内存&#xff09;上部署 DeepS…

530 Login fail. A secure connection is requiered(such as ssl)-java发送QQ邮箱(简单配置)

由于cs的csdN许多文章关于这方面的都是vip文章&#xff0c;而本文是免费的&#xff0c;希望广大网友觉得有帮助的可以多点赞和关注&#xff01; QQ邮箱授权码到这里去开启 授权码是16位的字母&#xff0c;填入下面的mail.setting里面的pass里面 # 邮件服务器的SMTP地址 host…

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑

背景 对于一些内部使用的管理系统来说&#xff0c;可能没有引入Redis&#xff0c;又想基于现有的基础设施处理并发问题&#xff0c;而数据库是每个应用都避不开的基础设施之一&#xff0c;因此分享个我曾经维护过的一个系统中&#xff0c;使用数据库表来实现事务锁的方式。 之…

【 实战案例篇三】【某金融信息系统项目管理案例分析】

大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式&#xff1a;GET和POST请求 GET:从服务器获取&#xff0c;请求参数直接附在URL之后&#xff0c;便于查看和分享&#xff0c;常用于获取数据和查询操作 POST&#xff1a;用于向服务器提交数据&#xff0c;其参数不会显示在URL中&#xff0c;而是包含在…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

题解 | 牛客周赛83 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…

netty如何处理粘包半包

文章目录 NIO中存在问题粘包半包滑动窗口MSS 限制Nagle 算法 解决方案 NIO中存在问题 粘包 现象&#xff0c;发送 abc def&#xff0c;接收 abcdef原因 应用层&#xff1a;接收方 ByteBuf 设置太大&#xff08;Netty 默认 1024&#xff09;滑动窗口&#xff1a;假设发送方 25…

【Linux】I/O操作

目录 1. 整体学习思维导图 2. 理解文件 2.1 文件是什么&#xff1f; 2.2 回顾C语言库函数的文件操作 2.3 stdin/stdout/stderr 2.4 系统的文件I/O操作 2.4.1 了解位图标记位方法(宏) 2.4.2 认识系统I/O常用调用接口 2.5 对比C文件操作函数和系统调用函数 2.5.1 fd是什么…

ISP CIE-XYZ色彩空间

1. 颜色匹配实验 1931年&#xff0c;CIE综合了前人实验数据&#xff0c;统一采用700nm&#xff08;红&#xff09;、546.1nm&#xff08;绿&#xff09;、435.8nm&#xff08;蓝&#xff09;​作为标准三原色波长&#xff0c;绘制了色彩匹配函数&#xff0c;如下图。选定这些波…

5G学习笔记之BWP

我们只会经历一种人生&#xff0c;我们选择的人生。 参考&#xff1a;《5G NR标准》、《5G无线系统指南:如微见著&#xff0c;赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中&#xff0c;默认所有终端均能处理最大2…

计算机毕业设计SpringBoot+Vue.js智能无人仓库管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

qt-C++笔记之QToolButton和QPushButton的区别

qt-C笔记之QToolButton和QPushButton的区别 code review! 文章目录 qt-C笔记之QToolButton和QPushButton的区别1.运行2.main.cpp3.main.pro 1.运行 QToolButton 适用于工具栏或需要较紧凑、图标化显示的场合。通过 setAutoRaise(true) 与 setToolButtonStyle(Qt::ToolButtonTe…

[含文档+PPT+源码等]精品基于Python实现的vue3+Django计算机课程资源平台

基于Python实现的Vue3Django计算机课程资源平台的背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、教育行业发展背景 1. 教育资源数字化趋势 随着信息技术的快速发展&#xff0c;教育资源的数字化已成为不可逆转的趋势。计算机课程资源作为教育领域的重要组成部…

项目准备(flask+pyhon+MachineLearning)- 3

目录 1.商品信息 2. 商品销售预测 2.1 机器学习 2.2 预测功能 3. 模型评估 1.商品信息 app.route(/products) def products():"""商品分析页面"""data load_data()# 计算当前期间和上期间current_period data[data[成交时间] > data[成…

老牌工具,16年依然抗打!

在电脑还没普及、操作系统为Windows XP/7的时代&#xff0c;多媒体文件的转换操作常常面临格式不兼容的问题。这时一款名为格式工厂的软件成为了众多用户的首选工具。格式工厂以其简洁易用的界面和强大的功能&#xff0c;轻松地进行各种文件格式的转换。成为很多修小伙伴的喜爱…

LM studio 加载ollama的模型

1.LM 下载&#xff1a; https://lmstudio.ai/ 2.ollama下载&#xff1a; https://ollama.com/download 3.打开ollama&#xff0c;下载deepseek-r1。 本机设备资源有限&#xff0c;选择7B的&#xff0c;执行ollama run deepseek-r1:7b 4.windows chocolatey下载&#xff1a; P…

Linux内核以太网驱动分析

1.网络接口卡接收和发送数据在Linux内核中的处理流程如下&#xff1a; 1. 网络接口卡&#xff08;Network Interface Card, NIC&#xff09; 作用&#xff1a;负责物理层的数据传输&#xff0c;将数据包从网络介质&#xff08;如以太网线&#xff09;读取到内存中&#xff0c;或…

unity中使用spine详解

一.Spine概述 Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程&#xff0c;以创建游戏所需的动画。 Spine原理&#xff1a;将一个模型&#xff0c;根据动画的需求分成一些骨骼&#xff0c;一个骨骼对应一张贴图&#xff0c;控制骨骼…