数据库网站 建设方案,十堰网站搜索优化价格,泰州智搜网络科技有限公司,网线制作实验原理寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图#xff08;重点#xff09;输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻#xff08;可配置#xff09;3.施密特触发器4.输入数…
寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图重点输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻可配置3.施密特触发器4.输入数据寄存器输出框图解析输出的三种模式GPIO输出时内部器件及其作用1.输出控制电路2.通用输出寄存器小结举例练习前言
前面啰啰嗦嗦写了一大堆从本文开始正式进入STM32的实际开发过程此系列选用寄存器开发从最底层操作通过查看手册配置寄存器来实现对应的功能整个过程记录下来会显得有些臃肿全文结构大概是前面部分介绍理论知识后半部分介绍实操以及代码。笔者尽量做的简洁点文中如有不足希望各位提出指正。
认识GPIO
GPIO是什么
首先我们需要知道GPIO是个什么东西对于这种问题咱还是老套路先问问“C知道”。 感觉说的不够清楚我们再看看百度百科的回答。 GPIO英语General-purpose input/output通用型之输入输出的简称功能类似8051的P0—P3其接脚可以供使用者由程控自由使用PIN脚依现实考量可作为通用输入GPI或通用输出GPO或通用输入与输出GPIO如当clk generator, chip select等。 既然一个引脚可以用于输入、输出或其他特殊功能那么一定有寄存器用来选择这些功能。对于输入一定可以通过读取某个寄存器来确定引脚电位的高低对于输出一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位对于其他特殊功能则有另外的寄存器来控制它们。 嗯看了百度解释想必学过51系单片机或者其他系单片机的同学已经有了一个大致答案功能和51的P0-P3类似做输入、输出或输入输出都做那他肯定就是和51单片机差不多引脚了吧。 对于没学过其他系单片机的同学可能还是一头雾水我知道你很懵但你先别懵我给你个答案 通俗来讲GPIO就是STM32上的大部分引脚就是如下图所示红圈里的大多数。 注意提取关键字我说的是大多数并不是说所有这就说明二者不能打等号。
#mermaid-svg-2EhwjPxOPS0SpkTu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .error-icon{fill:#552222;}#mermaid-svg-2EhwjPxOPS0SpkTu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2EhwjPxOPS0SpkTu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2EhwjPxOPS0SpkTu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2EhwjPxOPS0SpkTu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2EhwjPxOPS0SpkTu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2EhwjPxOPS0SpkTu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2EhwjPxOPS0SpkTu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2EhwjPxOPS0SpkTu .marker.cross{stroke:#333333;}#mermaid-svg-2EhwjPxOPS0SpkTu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2EhwjPxOPS0SpkTu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .cluster-label text{fill:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .cluster-label span{color:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .label text,#mermaid-svg-2EhwjPxOPS0SpkTu span{fill:#333;color:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .node rect,#mermaid-svg-2EhwjPxOPS0SpkTu .node circle,#mermaid-svg-2EhwjPxOPS0SpkTu .node ellipse,#mermaid-svg-2EhwjPxOPS0SpkTu .node polygon,#mermaid-svg-2EhwjPxOPS0SpkTu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2EhwjPxOPS0SpkTu .node .label{text-align:center;}#mermaid-svg-2EhwjPxOPS0SpkTu .node.clickable{cursor:pointer;}#mermaid-svg-2EhwjPxOPS0SpkTu .arrowheadPath{fill:#333333;}#mermaid-svg-2EhwjPxOPS0SpkTu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2EhwjPxOPS0SpkTu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2EhwjPxOPS0SpkTu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-2EhwjPxOPS0SpkTu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-2EhwjPxOPS0SpkTu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2EhwjPxOPS0SpkTu .cluster text{fill:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu .cluster span{color:#333;}#mermaid-svg-2EhwjPxOPS0SpkTu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2EhwjPxOPS0SpkTu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}是不全是GPIO引脚那么这二者有什么区别呢我们再看一张图这个图具体标注了上面的芯片每个脚对应的名称。 细细观察这里面的脚似乎还挺有规律 1.大部分是PA0-15PB0-15…PE0-15这部分就是上面说到的GPIO也就是说STM32中PXX这种标号的就是GPIO口他们可以做输入、输出也可以既做输入又做输出 2.剩下一大部分是VDD、VSS、VREF、VDDA、VSSA这些这部分在昨天的硬件介绍中提到了就是STM32的各类电源组他们是为整个单片机提供能源输入的接口 3.还有NRST、BOOT0这些就是昨天最小系统中写到的引脚。 好了到这儿我们对GPIO是什么有了一个概念接下解决第二个问题
GPIO有什么用
还是看个图吧我们知道STM32内部有着各种各样的片内外设GPIO也是片内外设的一种但是他与其他片内外设有着一个很大的区别从下图可以看出GPIO的位置在整个芯片的外围只有它能够和外界接触整个芯片的所有片上外设以及内核要和外部传递交换信息都必须经过GPIO才能实现他是连接单片机内部和外部的通道它既可以将内核以及其他片内外设的信息传递出来输出也可以将片外外设的信息传递给内核或者片内外设输入有时候兼顾输入输出的功能。 好了关于GPIO有什么用我们也有了基本的认知接下来我们需要搞定今天的重点内容怎么用。
GPIO怎么用
在探究怎么用之前还需要补充一点STM32上有关GPIO的相关内容
STM32上GPIO的命名以及数量
关于STM32上GPIO命名以及数量的问题这个之前在芯片手册那一段有提到过。 GPIO的端口号是从PA、PB——PI一共9个端口号每个端口号上有0-15共16个管脚号也就是说理论上一块STM32单片机有着16*9144个GPIO。 看到这有的同学会有问题你数理论上有144个GPIO可是你上面的这个STM32F407VE就只有100个脚而且还有那么多是电源和最小系统的专用脚你这前后不对啊。 是的我们的F407VE确实没有144个GPIO还记得我们之前在芯片命名处做过介绍吗根据命名的不同芯片引脚数量是不一样的这中间省略掉的就是GPIO的数量。144个GPIO对于大多数项目来说太多了造成了资源浪费。这也是为什么芯片型号如此丰富的原因了我们在项目中选择主控一定要注重适用性。 这里我们再拿STM32F407VE的芯片手册图来做个细致介绍如下图所示 STM32F407VE一共有82个GPIO口 其用到的GPIO端口号和管脚为
端口号管脚号备注GPIOA0-15通用输入输出GPIOB0-15通用输入输出GPIOC0-15通用输入输出GPIOD0-15通用输入输出GPIOE0-15通用输入输出共80个GPIOGPIOH0-1外部时钟接口
由此可见此款单片机一共有80个GPIO口如果使用内部时钟的话还可以扩展出GPIOH0与GPIOH1这两个外部时钟引脚。
GPIO口的框图重点
接下来就是本文的第一个大重点了关于GPIO框图的解释通过这个图我们需要基本弄清楚1.GPIO口的输入输出模式2.每种模式对应的作用3.使用GPIO不同模式时需要使用哪些片内外设需要使用哪些寄存器。 编程手册中关于GPIO的结构图介绍如下图所示官方是将所有模式以及输入输出整合在一张图上面为了方便理解我们来做个拆分。
输入框图解析
对上图稍微做了一个拆分如下图所示此图为GPIO的输入框图。 首先从最左边开始介绍从图中我们可以看出最终输入单片机内核的方式一共有三种第一种是经过ADC的模拟输入、第二种经过其他片上外设的复用输入第三种是最下面的经过输入数据寄存器后直接输入给内核的接下来我们来看一看这三种输入的介绍。
三种输入模式
1.模拟输入:模拟输入模式见名知意就是从片外外设输入进来的信号是模拟量。 这里需要对模拟量与数字量做个区分我们都知道单片机也好电脑也好他们所能识别以及处理的始终是二进制数也就是0101000…的数据串这个1010100…组成的数据串就是数字量通俗点说就是0和1我数字量0和1对应的模拟量电压的低电平与高电平那么什么是模拟量呢就比如我们常见的电压、温度、湿度等等这些都叫做模拟量总之就是需要经过一定的电路转换后才可以被单片机和电脑识别的量就是模拟量。 也正是因为单片机的内核无法直接识别模拟量的输入所以外设的模拟量信号在进入芯片后需要经过上图中浅绿色的ADC这个模拟量转数字量的片上外设才可以也就是说这种输入模式是专门用来处理模拟信号的当我们确定输入量是模拟量时就必须将GPIO配置成为模拟输入模式。 2.复用输入关于复用输入模式在弄清楚了上面的模拟输入后就可以对照了既然为ADC专门开辟了一条输入道路其他的片上外设自然也得争取一下所以就有了复用输入模式这个复用输入与模拟输入的最大不同在于其接收到的信号都是数字量只是根据不同的片上外设需求对这些数字量进行了定义封装打包在输入内核之前需要经这些对应协议的片上外设进行解析拆包然后再转交给内核处理。类似SPI、I2C、UART这些片上外设都是需要使用到这个模式的当我们确定输入量需要使用这些片上外设进行加工时就必须使用此模式。 3.通用输入最后一种输入模式就是通用输入模式说白了就是输入状态只有0与1两种状态类似按键的按下、未按下某种传感器的阈值超标或者没超标之类的只涉及开与关的监测时就是使用此模式。
GPIO输入时内部器件及其作用
至此关于GPIO的三种输入模式我们已经搞清楚了但是图中还有一些器件的用处没有提到下面来做个简单的介绍从右至左来看
1.保护二极管
1.当外设信号进来之后首先经过的是上下各有一个保护二极管的位置这两个二极管可以成为钳位二极管也就是将输入的电压控制IO口可以接受的范围内当外界输入信号的电压高于VDD_FT时上半部分的保护二极管会导通将高电压带走以此来保护IO以及单片机内部电路如下图所示 同样当输入信号的电压低于VSS时下半部分的保护二管会导通形成一个反向回路从而保护IO口不被烧毁。
2.上下拉电阻可配置
2.经过保护电路后会看到如下图所示的两个可编程控制的上下拉电阻关于这两个电阻一般是不会使用的原因是其上下拉的能力有限不是很稳定为了保证良率一般都是采取IO口外部在上下拉电阻来实现这个在明天的按键输入编程中会有所体现。当然也有部分厂家会节约成本就是用内部上拉下拉来实现控制IO口的初始状态这种现象我们遇到了在来介绍。在这里我们只需要知道这个电路使我们程序里面可以控制的即可。 上拉电阻:上拉功能IO口空闲时间保持高电平 下拉电阻下拉功能IO口空闲时间保持低电平。 3.施密特触发器
3.经过上下拉电阻电路后就是一个施密特触发器这个器件在编程中不需要我们来进行操作可以发现的是第一种模拟输入模式并没有经过它而是直接走到了后面这也从侧面说明了它在此处的作用就是将模拟量的电信号转化成0与1的数字量高电平经过它就会输出1低电平经过它就会输出0.
4.输入数据寄存器
4.最后是输入数据寄存器它的作用就是接收经过施密特触发器转换后的数字量注意只是通用输入模式时才有用复用模式的数字量信号并没有经过它我们在后面通过通用输入模式获取IO的电平状态时就需要使用到这个寄存器。 有关输入部分的介绍就先到这后面设计到相关编程的时候再来细说。
输出框图解析
关于输出框图的解析同样我们还是将官方的图纸简化一下将其中的输出部分单独拿出来。 如下图所示跟上面的输入模式其实差不了太多总的来说也是三种模式1.包含内核直接输出以及间接输出的通用输出模式2.输出经过其他片上外设处理加工后再输出的复用输出模式3.输出经过DAC的模拟输出模式。
输出的三种模式
1.通用输出模式就是直接使用内核控制GPIO输出高低电平进行控制不要经过其他任何片内外设的加工最典型的就是对应LED灯的控制。 2.复用输出模式复用输出模式与上面的复用输入模式一样就是内核的数据输出以后需要经过片上外设进行特殊的加工将数据封装、定义、打包然后再将这些包数据传输给片外外设。一般外设有SPI、I2C、UART这类协议需求或者需要使用其他片上外设的时候就需要使用复用输出模式。 3.模拟输出模式模拟输出模式与上面的模拟输入模式一样当需要直接使用IO口输出模拟量时由于内核是数字量需要经过DAC数字转模拟的转换后再通过GPIO口输出给外界此模式也是DAC专用其他的时候用不上。
GPIO输出时内部器件及其作用
关于输出的整个框图我们还是从右向左来看首先前面的保护二极管以及上下拉电阻的作用还是与输入模式一样我们就不再解释了经过这个部分后我们来看看下图这个红框内电路的作用。
1.输出控制电路
我们可以看见通用输出以及复用输出都需要经过红色框的电路唯独模拟输出不需要经过看了上面的输入部分的框图大家是不是找到了一丝共性输入部分是模拟输入不经过施密特触发器通用输入以及复用输入需要经过施密特触发器这里红框的电路正好是施密特触发器的逆电路作用是将内核已经片上外设的数字量信号0与1转行成高低电平不同点在于此处的红框电路需要我们在程序上进行控制在红框右下方写着推挽、开漏以及静止三种状态但实际编程操作时只有两种状态可以选择一种是推挽模式一种是开漏模式有关这两种模式的具体分析这里给大家贴两个链接感兴趣的可以去了解一下不感兴趣只需要有下面这印象就可以了 **推挽模式**红框内的PMOS与NMOS都可以正常使用也就是说不需要外接什么电路就可以实现高低电平的输出 开漏模式都漏了嘛可以片面的理解为此模式不依靠外部上拉电路的话就没法输出高电平只能输出低电平实际上是PMOS被屏蔽了没法输出高电平在实际使用的过程中只有同一个IO口既要做输入又要做输出切外部有上拉电阻时才使用此模式不然的话多数都是使用推挽模式。 1.GPIO推挽输出和开漏输出模式区别详解http://t.csdn.cn/M0zIQ 2.深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入开漏输出推挽输出的区别以STM32为例)http://t.csdn.cn/HJ9Y7 3.开漏输出和推挽输出http://t.csdn.cn/k9zGX
2.通用输出寄存器
最后就是下图的输出数据寄存器以及置位/复位寄存器了关于这两个寄存器后面一般使用的是内核直接输出数据到输出数据寄存器来实现高低电平内核经过置位/复位寄存器后再输出到输出数据寄存器的间接输出很少使用。
小结
至此关于GPIO的结构以及输入输出模式的介绍就结束了我们来总结一下关于GPIO的输入输出 GPIO的输入模式三种通用、复用、模拟 GPIO的输出模式也是三种通用、复用、模拟 其中输入输出是模拟量的时候使用的就是模拟输入模式以及模拟输出模式 输入输出需要使用到片上外设时就需要使用复用输入模式以及复用输出模式 内核通过GPIO直接控制GPIO进行输入以及输出时就是用通用输入以及通用输出模式。 然后是上下拉一般不用都是采取外部电路来实现的配置过程中一般采用浮空 再就是输出中的推挽以及开漏模式推挽是可以不借助外部电路就输出高低电平开漏需要借助外部上拉电路才可以实现开漏模式一般用于IO口既要作为输入又要作为输出时例如I2C的数据线单总线的DS18B20、DHT11等等。
举例练习
上面介绍了这么多我们来几个实际的例子来看一下 首先是常见的LED电路很明显为了驱动LED小灯我们需要选用输出模式此电路中没有上拉电路为了控制小灯的亮灭我们需要使用推挽输出模式由于整个过程只需要通过内核控制GPIO即可实现所以最终PA6与PA7的模式选择就是通用推挽输出模式且输出低电平小灯亮输出高电平小灯灭。 然后是按键输入电路如下图所示首先肯定要配置为通用输入模式由于有外部上拉电路空闲状态是高电平所以不需要配置上下拉。 再看一个特例下图中就是没有外部上拉的按键输入首先通用输入模式由于没有外部上拉我们需要保证空闲状态可控且能够有效检测按下的低电平这时候就需要额外配置一步上拉模式。