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

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录

    • 一:GPIO输入输出原理
    • 二:GPIO基本结构
    • 三:GPIO位结构
    • 四:GPIO的八种模式
      • 道友:相信别人,更要一百倍地相信自己。

(推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》)
下文图都是从参考手册借阅:STM32F10xxx(中文),大概页数是110/775左右

一:GPIO输入输出原理

GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V(有FT标识)
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

二:GPIO基本结构

GPIO的基本结构图

  • 上图是GPIO的基本结构图。在Stm32中,所有的GPIO都挂载在APB2外设总线上。每个GPIO模块内,包括有寄存器、驱动器、引脚等 寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,从而完成输出电平和读取电平的功能。该寄存器的每一位都对应一个引脚,由于STM32是32位的单片机,所以所有的寄存器都是32位的,也就是说只有寄存器的低16位对应上了相应的GPIO口(好多时候高16位置0,低16位才真正控制寄存器)

  • 驱动器就是增加信号的驱动能力的。

注意:stm32F103c8t6芯片上48个引脚,除了基本的电源和晶振等维持系统外,分别包括PA0~PA15、PB0-PB15、PC0 ~PC15。

三:GPIO位结构

GPIO位结构
上图分为输入部分和输出部分,看虚线框

输入部分:

  • 整个框架从左往右依次是寄存器、驱动器、IO引脚,从上到下分为“输入”、“输出”。
  • 最右侧的IO引脚上两个保护二极管,其作用是对IO引脚的输出电压进行限幅在0~3.3V之间,进而可以避免过高的IO引脚输入电压对电路内部造成伤害。Vdd = 3.3V,Vss = 0V。
  • 过压保护:当I引脚输入10V时,电压从输入引脚到保护二极管再到Vdd,有电压差就能流通,这叫过压保护。
  • 低压保护:当I引脚输入低于0V时,这叫做负电压,此时,电流流向为:从Vss →I引脚,这叫低压保护。
  • 输入驱动器的上、下拉电阻(图中像弹簧那两根):相应的开关可以通过程序进行配置,分别有上拉输入模式(上开关导通,下开关断开)、下拉输入模式(下开关导通&上开关断开)、浮空输入模式(两个开关都断开)。
    下拉电阻的作用几时给引脚输入提供一个默认的输入电平,进而避免引脚悬空导致的不确定。都属于弱上拉,弱下拉。

  • 输入驱动器的触发器:这里是用肖特基管构成的施密特触发器。只有高于上限、低于下限电压才进行变化,作用是对输入电压进行整形,可以消除电压波纹、使电压的上升沿/下降沿更加陡峭。也就是说,stm32的GPIO的端口会自动对输入的数字电压进行整形。比如像那种方波在变化的那个瞬间进行消抖,20ms.

  • “模拟输入”、“复用功能输入”:都是连接到片上外设的一些端口,前者用于ADC等需要模拟输入的外设,后者用于串口输入引脚等需要数字量的外设。

输出部分:

  • 输出数据:可以由输出数据寄存器(普通的IO口输出)、片上外设来指定,数据选择器控制数据来源。
  • 位设置/清除寄存器:单独操作输出数据的某一位,而不影响其他位。
  • 驱动器中的MOS管:MOS管相当于一种开关,输出信号来控制这两个MOS管的开启状态,进而输出信号。可以选择推挽、开漏、关闭三种输出方式(推荐先看文章:《嵌入式-32单片机-GPIO推挽输出和开漏输出》),P-MOS相当于Q1,N-MOS相当于Q2
  • 推挽输出模式:两个MOS管均有效,stm32对IO口有绝对的控制权,也称为强推输出模式。
  • 开漏输出模式:P-MOS无效。只有低电平有驱动能力,高电平输出高阻。
  • 关闭模式:两个MOS管均无效,端口电平由外部信号控制。

补充说明:stm32如何将数据写入寄存器?

  • 通过软件的方式。由于stm32的寄存器只能进行整体读写,所以可以先将数据全部读出,然后代码中用&= 清零、|= 置位的方式改变单独某一位的数据,再将该写后的数据写回寄存器。此方法比较麻烦,效率不高,对于IO口进行操作不合适(这就是基于寄存器开发的麻烦之处,所以有了基于标准库的开发)

  • 通过位设置/清除寄存器。若对某一位 置1,只需对位设置寄存器的相应位值1;若对某一位 清零,则对清除寄存器相应位 清零。这种方式通过内置电路完成操作,一步到位。

  • 通过读写stm32中的“位带”区域。在stm32中,专门分配有一段地址区域,该区域映射了RAM和外设寄存器所有的位。读写这段地址中的数据,就相当于读写所映射位置的某一位。整体流程与51单片机中的位寻址作用差不多。本教程不涉及。

四:GPIO的八种模式

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空则电平不确定,容易受外界影响所以需要连续驱动源
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,会关闭数字输入开启模拟输入,引脚直接接入内部ADC(ADC专属配置)
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接Vss
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接Vss
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接Vss
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接Vss

上表给出了GPIO的八种模式,通过配置GPIO的端口配置寄存器即可选择相应的模式。

  1. 每一个端口的模式由四位进行控制,16个端口就需要64位,所以这里的配置寄存器有两个(一个是端口低配置寄存器,一个是端口配置高寄存器),也就是两个32位寄存器,即端口配置低寄存器、端口配置高寄存器。
  2. 输入模式下,输出无效;而输出模式下,输入有效。这是因为一个端口只能有一个输出,但可以有多个输入,所以直接将输出信号输入回去也没问题。
    3.端口配置低寄存器低16位对应16个引脚,高16位没有使用;端口配置高寄存器,同样是低16位对应16个引脚,高16位没有使用。

在这里插入图片描述

端口位设置/清除寄存器的高16位进行位清除的,低16位是进行位设置的

寄存器:暂时记录数据的模块。

复用开漏/推挽输出:引脚的控制权转移到了片上外设
stm32串口默认是半双工的。

三极管可看成两个二极管构成(背靠背)

参考:B站STM32江协自动化&【哈工大虎慕】

道友:相信别人,更要一百倍地相信自己。

相关文章:

  • vue2 el-table行悬停时弹出提示信息el-popover
  • XXL-Job的搭建接入Springboot项目(详细)
  • RTSP/Onvif安防视频云平台EasyNVR迁移盘符后启动异常的问题排查与解决
  • HashMap学习和线程安全的HashMap
  • 蓝桥杯每日一题----货物摆放
  • web架构师编辑器内容-编辑器组件图层面板功能开发-锁定隐藏、键盘事件功能的开发
  • 中级Python面试问题
  • 概率论与数理统计————3.随机变量及其分布
  • STM32F103标准外设库——中断应用/事件控制器(六)
  • 线性代数的学习和整理23:用EXCEL计算 向量/向量组的点乘 (内积) (建设ing)
  • 数据集成时表模型同步方法解析
  • postman后端测试时invalid token报错+token失效报错解决方案
  • 走迷宫(c语言)
  • Firefox 100 正式发布
  • 接口自动化测试持续集成,Soapui接口功能测试参数化
  • Date型的使用
  • extjs4学习之配置
  • javascript面向对象之创建对象
  • java概述
  • JS笔记四:作用域、变量(函数)提升
  • maya建模与骨骼动画快速实现人工鱼
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • python 学习笔记 - Queue Pipes,进程间通讯
  • vagrant 添加本地 box 安装 laravel homestead
  • WebSocket使用
  • 高性能JavaScript阅读简记(三)
  • 猴子数据域名防封接口降低小说被封的风险
  • 排序算法学习笔记
  • 软件开发学习的5大技巧,你知道吗?
  • 学习笔记TF060:图像语音结合,看图说话
  • 正则表达式小结
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (1) caustics\
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)理解angular中的module和injector,即依赖注入
  • (三)mysql_MYSQL(三)
  • (转)大道至简,职场上做人做事做管理
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET简谈设计模式之(单件模式)
  • :中兴通讯为何成功
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [BUUCTF 2018]Online Tool(特详解)
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [github配置] 远程访问仓库以及问题解决
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [Java]快速入门二叉树,手撕相关面试题
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)