创作原因
距离实验室给大一新生开始布置任务已经过去了一个多星期,当新生交完布置的作业之后,我们会开始问一些问题,通过提问,我看到了一个问题,那就是大部分新生由于自身对于电路方面基础不够扎实,而导致看到原理介绍部分时粗粗略过,让我想起了自己刚开始学习的时候也是这样的,现在随着自己能力的提升,原理之类的也能够看懂了
在我看来原理部分还是很重要的,理解了原理之后才能够更好地去做一些事情,对于未来的发展会有很大帮助,所以我整理了关于GPIO方面的知识对大一的同学进行了分享,同时利用总结的知识,写下了这篇博客,这就是我的创作原因
正文部分
在开始原理部分的讲解时,我们先对GPIO作一个简介
GPIO简介
GPIO,英文全称General Purpose Input Output,中文翻译为:通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V,关于哪些引脚可以容忍5V电压,参考一下图片
该图片来自于STM32的引脚定义,在引脚定义中,在I/O口电平选项标志有FT(Five Tolerante)的引脚即可容忍5V电压
简介完了,接下来我们开始对GPIO的基本结构进行介绍
GPIO的基本结构
话不多说,直接给大家上图,会看的比较直观
GPIO部分总线架构图
芯片的总线架构图可以让我们直接的观察到芯片上各个部分资源的挂载和分配,以F4的中文参考手册为例,该部分位于
大家有兴趣也可以自己多去看看
GPIO基本架构说明
通过刚才的图片,我们可以观察到:在STM32中所有的GPIO都挂载在APB2总线上
寄存器的本质
不知道大家有没有想过寄存器的本质是什么,
其实,寄存器的本质就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,也正是通过对寄存器的读写,完成读取和输出电平的功能
关于读取和输入电平的功能
寄存器的每一位对应一个引脚
输出寄存器写1,对应引脚输出高电平,输出寄存器写0,对应引脚输出低电平
输入寄存器读取为1,说明引脚输入为高电平,输入寄存器读取为0,说明引脚输入为低电平
寄存器有多少位?16?不,32!
从上面的图片我们可以看到,STM32的寄存器引出了十六个引脚,一个引脚对应一个位,那么我们可以得出结论,STM32的寄存器是十六位的
真的可以吗?真的是十六位吗?答案显然是否定的
关于STM32的命名
大家知道为什么STM32叫STM32,而不是叫STM16、STM64之类的吗
之所以这样命名,是因为,STM32系列都是32位的单片机,至于STM32的命名,是这样来的
ST:意法半导体 M:MCU/MPU 32:32位
多余的位去哪了?
由于STM32都是32位的单片机,所以STM32内部的寄存器都是32位的,但是端口(引脚)只有16个,所以寄存器只有低16位对应有端口,高16位没有用到
高十六位没有用到,他们去哪了?
在STM32微控制器中,寄存器通常是32位的,但有些寄存器只使用了其中的低16位,而高16位保留不用。这些高16位通常被称为"保留"或"保留位",在大多数情况下,它们不影响寄存器的功能或操作。
高16位的保留通常用于对齐或填充寄存器,以使其结构在硬件层面上保持一致。在使用寄存器时,程序员通常只需要关注低16位的值,而忽略高16位。
虽然高16位在软件开发中通常不会被直接操作或使用,但在某些特殊情况下,可能会有一些特定的功能或配置需要设置高16位。因此,当查看寄存器的手册或数据表时,程序员应该注意到这些保留位的存在,以确保在使用寄存器时没有误操作。
至于什么时候会用到高16位,我给大家介绍一下
一个典型的高16位的应用示例是使用定时器(TIM)外设的自动重载寄存器(TIMx_ARR)。在STM32中,TIMx_ARR寄存器是一个32位寄存器,用于设置定时器的自动重载值,以确定定时器的周期。
通常情况下,我们会将定时器的周期值直接写入TIMx_ARR寄存器的低16位,这样可以设置一个较小的周期值。但是,在某些情况下,可能需要设置更大的周期值,超过了16位的范围。这时就可以利用TIMx_ARR寄存器的高16位来扩展周期值。
举个例子,假设我们需要设置一个周期为10000的定时器。由于16位的寄存器最大只能表示65535,无法直接写入10000。这时,我们可以将10000拆分为两个部分,高16位设置为0,低16位设置为10000。然后将这两部分分别写入TIMx_ARR寄存器的高16位和低16位,从而实现设置周期为10000的定时器。
驱动器
我们可以看到,和寄存器放在一起的还有一个驱动器,驱动器是用来作什么的呢?
驱动器是用来加强信号的驱动能力
寄存器只负责存储数据,如果需要进行电灯这样的操作的话,还是需要驱动器来增大驱动能力
GPIO的位结构
I/O端口的基本结构图
整个结构可以分成两个部分:上面是输入部分,下面是输出部分
输入部分
保护电路
可以看到,输入部分接了两个保护二极管对输入电压进行限幅,上面二极管接vdd3.3V,下面二极管接vss0V
如果输入电压大于3.3v,那上面的二极管就会导通,输入电压产生的电流就会直接流入vdd而不会流入内部电路
如果输入电压小于0v,那下面的二极管就会导通,电流从vss流出而不会从内部电路汲取电流,起到保护内部电路的作用
决定输入模式的部分
在这里可以决定除了模拟输入之外的输入模式:上拉输入、下拉输入以及浮空输入
接通上方电阻为上拉输入(默认为高电平),接通下方电阻为下拉输入(默认为低电平),如果两个电阻都不接通,则为浮空输入
TTL肖特基触发器(施密特触发器)
接下来是TTL肖特基触发器,英文翻译应该是施密特触发器,这里应该是翻译错误
施密特触发器作用是对输入电压进行整形
执行逻辑:输入电压大于某一阈值,输出瞬间升为高电平;输入电压小于某一阈值,输出瞬间降为低电平
设置了上下两个阈值
如果输入电压在设置的低阈值附近反复横跳且没有高于高阈值,那大于低阈值部分也变成低电平;在高阈值附近横跳同理
接下来,经过施密特触发器整形的波形就可以直接写入输入数据寄存器,我们就可以使用程序读取输入寄存器对应的某一位的数据,就可以知道端口的输入电平了
最后的两个线路
最后上面还有两路线路,这些就是连接到片上外设的一些端口
第一个线路没有经过施密特触发器整形直接作为模拟信号输入到ADC
第二个线路是复用功能输入,这个连接到其他需要读取端口的外设上
输出部分
对寄存器的操作
数字部分可以有输出数据寄存器或片上外设控制,两种控制方式通过数据选择器接到了输出控制部分
如果通过输出数据寄存器进行控制,就是普通的I/O口输出,写数据的某一位就可以操作对应的端口
单独控制某一位的三种方式
左边还有个“位设置/清除寄存器”,可以单独操纵输出数据寄存器的某一位而不影响到其他位
输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写
想单独控制某一个端口而不影响其他端口,需要一些特殊的操控方式
第一种方式是先读出这个寄存器,然后通过按位与和按位或的方式更改某一位
第二种方式是通过设置“位设置/位清除寄存器”
如果要对某一位进行置1的操作,在位设置寄存器的对应位写1,剩下不需要的位写0即可,这样它内部就会有电路,自动将输出数据寄存器对应位置写1,而剩下写0的位则保持不变,这样就保证了只操作一位而不影响到其他位,并且这是一步到位的操作;同理如果想对某一位进行清零操作,在位清除寄存器的对应位写1即可
第三种方式,读写STM32中的位带区域,位带作用和51单片机位寻址作用差不多,在STM32中专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读取这段地址中的数据,就相当于读写所映射位置的某一位
Mos管决定的输出模式
接下来到了MOS管的位置,可以理解成一种电子开关
我们的信号来控制开关的导通和关闭,开关负责将I/O口接到VDD或者VSS
通过MOS管控制的输出方式如图
开漏输出模式可以作为通信协议的驱动方式,比如IIC通信的引脚,就是选择的开漏输出模式,在多机通信的情况下,这个模式可以避免各个设备的相互干扰
另外开漏模式还可以用于输出5v的电平信号
复用模式这里就不介绍了
术语解释
刚刚在输出部分的介绍提到了ROM,就来给大家解释一下ROM和RAM
ROM
ROM(也称为程序存储器)
英文全称是Read Only Memory
功能:ROM是一种只读存储器,其中存储的数据在正常操作期间无法更改。它用于存储固定的程序代码和常量数
据,例如固件、引导程序和配置信息等
特点:ROM具有非易失性,这意味着其中存储的数据在断电后仍然保持不变。ROM中的数据一般由制造商在生产过程中写入,用户无法直接修改内容
类型:常见的ROM类型包括Mask ROM、PROM、EPROM、EEPROM和Flash ROM等。它们之间的区别主要在于数
据写入方式和擦除机制的不同
RAM
RAM(也称为数据存储器)
英文全称是Random Access Memory
功能:RAM是一种用于临时存储数据的存储器,其内容可以根据需要进行读取、写入和修改。RAM用于存储程序
的运行时数据、变量和堆栈信息等
特点:RAM具有易失性,这意味着其中存储的数据会在断电后丢失。RAM的读写速度通常比ROM快,但成本也更
高,并且需要持续电源供应来保持数据
类型:常见的RAM类型包括SRAM(静态随机存储器)和DRAM(动态随机存储器)。SRAM速度较快,但密度较
低,成本较高;而DRAM的密度较高,但速度较慢、
GPIO模式的总结
GPIO共有八种模式
分别是四种输出模式和四种输入模式
输出:推挽输出、开漏输出、复用推挽输出、复用开漏输出
输入:上拉输入、下拉输入、浮空输入、模拟输入
在上面已经对这几种模式有过介绍,这里就不过多说明
结语
怎么样呢,这篇博客有帮到你吗?有的话就点点关注、赞、收藏之类的吧