赞
踩
参考STM32G0x0系列
目录
GPIO(General Purpose Input/Output)是通用输入输出引脚的缩写,是嵌入式系统中非常重要的基本硬件资源之一。GPIO是一种非常灵活的接口,可以实现数字输入、数字输出、模拟输入、模拟输出等多种功能。
在嵌入式系统中,GPIO通常在芯片引脚和外部电路之间起到了一个桥梁的作用。通过GPIO,我们可以将内部的信号或数据与外部的设备或传感器进行连接和交互。例如,可以通过GPIO读取按键的状态、控制LED的亮灭,或者连接各种传感器读取温度、湿度、光强等物理量。
因为GPIO非常通用,所以几乎所有的微控制器都具有GPIO功能。在开发嵌入式系统时,我们通常会使用GPIO来实现各种基本的输入输出功能,因此对GPIO的掌握是非常必要的。
在实际应用中,GPIO的使用非常灵活,并且需要根据具体的场景和需求进行配置和操作。掌握GPIO的基本概念、寄存器结构和操作方法,是开发嵌入式系统的重要基础之一。
GPIO(General Purpose Input/Output)是一种通用的输入输出接口,用于连接微控制器、嵌入式系统或其他电子设备与外部世界进行交互。它通过引脚(Pin)来提供数字输入和输出功能。
数字输入:GPIO可以读取外部设备或传感器的数字信号。例如,读取按键状态、检测外部开关状态、接收来自其他设备的数据等。
数字输出:GPIO可以控制外部设备或执行器的状态。例如,控制LED灯的亮灭、驱动蜂鸣器发声、控制继电器开关等。
中断功能:通过将GPIO配置为中断模式,可以在外部事件触发时产生中断请求,以实现实时响应或处理特定事件。
模拟输入/输出:某些GPIO引脚支持模拟信号输入输出,可以读取或输出模拟量信号,如读取光强传感器的光照值、控制电机的转速等。
多功能引脚:有些GPIO引脚具有多种功能,可以通过配置选择不同的工作模式,如串行通信接口(SPI、I2C、UART)、定时器输入/输出等。
当我们说到操作一个外设或者是完成某一个功能时,其实都是在操作寄存器,那么到底什么是寄存器呢?简单说:寄存器就是一个内存单元,一个具有特殊功能的内存单元。比方说,这一块地址的功能是管理输出能力的,那么我们为了方便,就给它起一个名字,叫做输出寄存器。目前可能还不是很好理解,下面我会给出详解。先看一张图片:
图3-1 存储器映像图
简单说说这张图,最左边的八大块,每一块都有一个地址范围,大小都是512M,那么加起来刚好是4G,也就是2^32,这刚好就是STM32刚好是32位,类比,你一个8位的单片机,内存可能就是1G。上面提到过,为了方便管理以及使用,将每一个内存单元划分为不同的模块,每个模块的功能各有不同。举个例子:一栋楼,每一层楼都是一个部门,每个部门负责的任务不一样,那么为了方便,出现研发部,市场部……寄存器划分同样如此。
那么到底是怎么规定的呢?或者说到底怎么就说实质是在操作寄存器呢?看看下面两张图,需要结合起来看。
图3-2 寄存器配置图
图3-3 引脚视图
你可以想象一下,一个32位的小盒子,管理0~15,16个部门,那么也就是说两个盒子控制一个部门。配置1号盒子,也就是图中划出的部分,我将二三位配置为00,代表我的一号引脚就是输出模式,这样说应该很清楚吧?对于如何将某两位配置为00,你可以参考以下的过程
图3-4 配置过程图
在不改变以前每一位数的情况下(3向左移位2再取反),将二三位都改成了0,代表一号引脚的模式就是输出模式。上述还给给出了一个叫偏移地址的东西,那么这么理解呢?
图3-5 结构体地址偏移图
定义一个结构体,那么这个结构体会在内存单元中存储下来,比如这个结构体存储在0x22222222这个内存单元 ,那么对于b成员的首地址,它就是0x22222226,里面的0x04就是偏移地址,偏移这个结构体的地址,也就是相对于这个结构体而言。最后在过一下“操作外设就是操作寄存器这句话”。倘若你有一个结构体,
图3-6 寄存器访问图
比如我定义一个结构体,名字就叫GPIOA,当你GPIOA->MODER &= (~(3<<2))的时候,是不是很熟悉?这个不就是在操作寄存器吗?你结合结构体想一想,我通过宏定义取到一个地址,这个地址就是寄存器的地址,直接给寄存器赋值,你使用的时候就是通过一个结构体成员来赋值,其实是一样的,只是为什么使用结构体,这个结构体怎么来的,你真的知道吗?分析一下,为什么我使用无符号32位int,为什么我使用32位?以及*号是否可以去掉?我就说一句:16号引脚,每个引脚占两位,刚好就是32位,为什么取地址,因为我要的就是某个寄存器的地址,不加*号怎么能是地址呢?不还是一个数字吗?
结合以上的图,多看两遍,我相信你对这句话一定会有自己独特的认识。
图3-7 GPIO引脚输入/输出
图3-8 GPIO功能描述
IO端口 - 施密特触发器 - 输入数据寄存器 - 读(信号路径)
由于浮空输入一般多用于外部按键输入,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的,易受干扰。
优点:这一种输入模式的电平会完全取决于外部电路而与内部电路无关。
缺点:在没有外部电路接入的时候,IO脚浮空会使得电平不确定
应用:该模式是STM32复位之后的默认模式,一般用作对开关按键的读取或用于标准的通讯协议,比如IIC、USART的等。
IO端口 - 上拉电阻 - 施密特触发器 - 输入数据寄存器 - 读(信号路径)
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,上拉电阻会将输入信号钳在高电平,此时引脚始终读到高电平信号。
IO端口 - 下拉电阻 - 施密特触发器 - 输入数据寄存器 - 读(信号路径)
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。
IO端口 - 片上外设模块(电压信号)(信号路径)
信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。 所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。
应用:当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
输出数据寄存器'0'——>输出控制‘1’——>NMOS激活
图3-9 推挽输出低电平
输出数据寄存器'1'——>输出控制‘0’——>PMOS激活
图3-10 推挽输出高电平
输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。具备输出高低电平的能力。推挽输出就是可以需要利用两个不同的MOS管来实现输出。推挽输出模式下(P-MOS管+N-MOS管),通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。
输出寄存器上的的’0’激活 N-MOS,输出寄存器上的’1’将端口置于高阻状态 (P-MOS 从不被激活 )。
图3-11 开漏输出低电平
图3-12 开漏外接上拉电阻
开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。可以利用改变上拉电源的电压来适应所需,进而提高外部电路的驱动能力。MOS管的漏极等于啥也没接,处于一个开路状态,所以这个模式称之为开漏模式 。
优势1:虽然我们可以看到开漏输出是没有办法在内部输出一个高电平,但是这一个看似是缺点。其实实际上是一种优点。当给一个低电平的时候,MOS管没有导通,此时电压不确定导致无法输出高电平,但是一旦我们在外部增加一个上拉,那么这一个缺点就会被有效避免。并且,因为是我们自己设计一个上拉,这个上拉的电压是由我们自己确定,这样我们就可以根据外部电路需要多少V的高电平来给这一个上拉的电压,可以更好的适应更多情况。
优势2:开漏输出的实质其实就是一个OD门(OD:漏极输出(Open Drain))。而在数电中,OD门有一个非常重要的特性就是可以实现线与的功能,简单来说,就是在像IIC这样的总线协议中,只要有一个给低电平,那么总线都会被拉低。
控制LED灯:GPIO可以用来控制LED灯的亮灭状态,通过设置GPIO引脚为输出模式,并控制引脚的电平状态,实现LED灯的开关和闪烁效果。
按键输入:GPIO可以作为输入接口,用于读取外部按键的状态。通过配置GPIO引脚为输入模式,并读取引脚的电平状态,可以实现按键的检测和触发相应的操作。
传感器接口:许多传感器(如温度传感器、湿度传感器等)可以通过GPIO与嵌入式系统进行通信。例如,通过I2C或SPI协议将传感器连接到特定的GPIO引脚,从而读取传感器提供的数据。
驱动电机:GPIO可以用作控制电机的引脚,通过控制引脚的电平状态和时序,实现电机的正转、反转、速度控制等功能。
触摸屏输入:某些嵌入式设备使用触摸屏作为主要的输入方式。GPIO可以用于读取触摸屏的输入信号,通过配置GPIO引脚为输入模式,并使用相应的驱动程序,实现触摸屏的触摸检测和坐标获取。
外部设备控制:除了上述应用场景,GPIO还可以用于与其他外部设备进行通信和控制。例如,与LCD显示屏、蜂鸣器、继电器等设备进行连接,通过GPIO控制这些设备的工作状态。
关于使用GPIO实现点亮一盏灯,这是单片机入门的一个实验。首先要做的就是查看手册,找到相应的部件,会看电路原理图,一点不难,看懂应该输出高电平还是低电平,看懂连到哪一个GPIO端口就可以实现了。
图5-1 LED原理图
图5-2 核心板原理图
图5-3 芯片原理图
操作寄存器为例:
- RCC->IOPENR |= 1<<1; //使能时钟
- GPIOB->MODER &= ~(0x3<<4); //模式清零
- GPIOB->MODER |= 1<<4; //模式置位
- GPIOB->OTYPER &= ~(1<<2); //输出类型
- GPIOB->ODR &= ~(1<<2); //输出数据
GPIO是通用输入输出端口,常见于嵌入式系统和单片机中。它具有多种应用和扩展能力,通过控制引脚的输入输出状态,实现了与外部设备的交互和数据传输,扩展了系统的功能和灵活性。
GPIO的使用需要对引脚的输入输出模式、读取和写入状态、中断等概念进行理解和掌握,在使用过程中需要注意GPIO特性和限制,以及避免误触发等问题。
为了更好地应用GPIO进行嵌入式系统开发和硬件控制,大家可以借助系统提供的命令或编程语言的函数来实现GPIO引脚模式的设置、读取和写入状态等操作。同时,也可以参考GPIO的应用案例以及常见问题和解决方案,提高GPIO的使用技巧和问题解决能力。
总之,GPIO作为通用输入输出接口,在嵌入式系统和单片机中具有重要的地位。理解和掌握GPIO的使用方法和注意事项,对于嵌入式系统开发者来说是非常重要的。希望本篇GPIO能够帮助大家更好地了解和掌握GPIO的知识和应用方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。