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

STM32基础篇--GPIO

1. 引言

        GPIO的全称是Genral purpose input output,简称IO口,一般用于控制连接在GPIO口上的外设。大家可能只看了STM32的固件库怎么配置,但是可能会遗漏为什么要这样配置。本讲将从GPIO的工作原理出发进行讲解。

2. GPIO工作原理

        GPIO的每个位可由软件配置成多种模式,如下图所示:

        总结来说,GPIO可配置为输入和输出。接下来根据GPIO原理图来介绍各个输入/输出方式,其原理图如下所示:

        从又往左介绍一下上述原理图中的几个关键部分:

2.1 输入

       

        保护二极管:二极管由于单向导电性,具有钳位的作用。此处用于防止外部IO引脚电压过高或者过低,当IO引脚电压过高时,上方二极管导通,此时电压被拉到VDD;当IO引脚电压过低时,下方二极管导通,电压被拉到VSS。这样做的目的是防止不正常的电压进入芯片导致芯片烧毁。

        输入驱动器:很明显,当配置成输入模式时,信号需要从输入驱动器进入。输入驱动器由上下拉电阻、肖特基触发器组成。先来说上拉以及下拉电阻上、下拉电阻的作用是将浮空的引脚拉到一个固定的状态(0或者1)。比如当配置成上拉输入时,代表将浮空引脚上拉到VDD,此时初始的状态确定为1,代表该输入IO口期望输入一个低电平;配置成下拉输入时,代表将引脚拉到GND,此时初始状态确定为0,代表该输入IO口期望输入一个高电平;当都不配置时,默认为浮空输入,此时该输入IO口高电平和低电平都有效(现在明白了配置IO口时不同的输入方式的区别了吗,当你期望给IO口输入一个低电平时,此时就该配置成上拉输入)。

        引申:当使用外部中断时需要指定期望的输入方式,如果不指定,默认为浮空输入,此时无论高电平或者低电平都能误触中断。

        肖特基触发器:当信号经过该触发器以后,模拟信号转换为数字信号0和1。因此当你用ADC功能时,需要配置成模拟输入,就不会经过该触发器,输入的就是模拟信号。

        输入数据寄存器:从该寄存器将输入值读出到芯片

2.2 输出

        说完了输入方式,接下来介绍输出。首先是输出数据寄存器:此寄存器的值会通过输出驱动器输出,用于决定是P-MOS导通,还是N-MOS导通。

        输出驱动器:输出驱动器里边的关键部分是一对P-MOS和N-MOS组成的推挽结构。当配置成推挽输出时,当连接到P-MOS的栅极信号为低电平时,此时P-MOS管导通,VDD经过P-MOS输出到IO口,此时代表输出1;当连接到N-MOS的栅极信号为高电平时,此时N-MOS导通,VSS经过N-MOS输出到IO口,代表输出0(看上图)。因此,实际上点亮一颗LED时,都是靠的外部电源VDD/VSS供电进行点亮的,此时P-MOS/N-MOS就是一个开关。

        当配置成开漏输出时,只能输出低电平0。即N-MOS管导通时,输出低电平;P-MOS断开不能使用,此时为高阻态。当为开漏时要想输出高电平,可在外部接上拉电阻来实现。

        当配置成复用功能输出时,此时外部IO引脚和输出数据寄存器断开,并和片上外设的输出信号连接,即输出信号不再经过输出数据寄存器。

        引申:开漏和推挽的区别--如果想要电平转换速度快,选推挽,但功耗相对较高;如果想要功耗低,且实现“线与”功能,选择开漏。

3. 软件设计

        了解上述GPIO工作原理之后,怎么通过代码将GPIO用起来呢?答案在寄存器上,通过上述GPIO的工作原理了解到需要从输入/输出数据寄存器上去读或者写。而一般半导体厂商会将寄存器映射到某个地址(如下图所示),因此就可以通过操作地址去操控寄存器了,这也是用C语言开发的原因(由于指针特性)。

        即当将数据写入某个寄存器时,也就是将数据写入到某个地址;当将数据从某个寄存器读出来时,也是去取某个地址的数据。STM32的固件库底层原理就是这样实现的。其他的代码及寄存器配置本讲不再多说,大家可以自行去看一下固件库的具体实现。

4. 参考文献

        [1] STM32中文参考手册_V10;

        [2] STM32F103开发指南

        

        

 

 


文章转载自:

http://jScSSkxM.zqdzg.cn
http://Uz6uAskH.zqdzg.cn
http://J8VoRwDv.zqdzg.cn
http://jpwHB8t0.zqdzg.cn
http://udCLchBi.zqdzg.cn
http://KJMcZClK.zqdzg.cn
http://caRJnLDB.zqdzg.cn
http://0qlvzlxr.zqdzg.cn
http://UhApRVy8.zqdzg.cn
http://uvG7qEQ1.zqdzg.cn
http://T1gxPF2e.zqdzg.cn
http://C8M097xP.zqdzg.cn
http://uR20PBto.zqdzg.cn
http://iMtQ4jiV.zqdzg.cn
http://3s4esK0B.zqdzg.cn
http://DAI0UcDK.zqdzg.cn
http://JQKpqlSY.zqdzg.cn
http://Z1CDCkea.zqdzg.cn
http://7QOlkL8c.zqdzg.cn
http://Eeimkgoi.zqdzg.cn
http://KZaV51sO.zqdzg.cn
http://KOH3T4Ba.zqdzg.cn
http://uBbBQNmM.zqdzg.cn
http://uBwk9GKQ.zqdzg.cn
http://7vhEa8s7.zqdzg.cn
http://M4GIOClo.zqdzg.cn
http://R1BZzYdw.zqdzg.cn
http://ufDHu4m4.zqdzg.cn
http://uNrSAzYx.zqdzg.cn
http://ERg8TCJX.zqdzg.cn
http://www.dtcms.com/a/378840.html

相关文章:

  • 无人机遥控器射频模块技术解析
  • Docker 命令核心语法
  • 第五章:Python 数据结构:列表、元组与字典(一)
  • Python快速入门专业版(二十一):if语句基础:单分支、双分支与多分支(判断用户权限案例)
  • 学习笔记:JavaScript(4)——DOM节点
  • 软考中级习题与解答——第四章_软件工程(3)
  • 消息队列-kafka完结
  • SKywalking Agent配置+Oracle监控插件安装指南
  • Skywalking告警配置+简易邮件告警应用配置(保姆级)
  • 【matlab】YALMIP、GLPK安装资源及安装方法
  • modbus学习
  • 创建GLFW窗口,开启OpenGL之路
  • (网络原理)核心知识回顾 网络核心原理 get和post的理解 解析http 加密+请求和响应的一些关键字 Cookie和session 对密钥的理解
  • 如何提升研发文档的检索体验与效率
  • 分布式事务性能优化:从故障现场到方案落地的实战手记(三)
  • R-Zero:大语言模型的自进化革命,突破数据依赖迈向自主智能
  • RL【8】:Value Function Approximation
  • StringJoiner
  • 【知识堂】制造业与物流数字化全景图:系统缩写大全与专业名词速查手册
  • 项目1——单片机程序审查,控制系统安全漏洞分析和改进建议
  • 中断上半部与中断下半部
  • 吱吱企业即时通讯以安全为基,重塑安全办公新体验
  • ctfshow_web13-----------文件上传.user.ini
  • 112. 路径总和
  • 四,基础开发工具(下)
  • Docker+jenkinsPipeline 运行实现python自动化测试
  • Android图案解锁绘制
  • 分布式事务性能优化:从故障现场到方案落地的实战手记(一)
  • JVM第一部分
  • websocket和socket io的区别