第五章 初识STM32 GPIO

目录

5.1 STM32 GPIO

5.1.1 GPIO结构框图分析

5.1.2 GPIO工作模式


5.1 STM32 GPIO

        STM32的GPIO(通用输入/输出)是一种非常重要的外设,可以通过GPIO控制外部电路和设备。STM32的GPIO可以配置为输入或输出模式,支持上拉或下拉电阻、推挽或开漏输出、低速、中速或高速输出等多种属性。

        在STM32中,GPIO的使用通常需要遵循以下步骤:

        (1)配置GPIO端口的基本属性:包括端口地址、端口模式、输出类型、输出速度、上下拉电阻等,这些属性可以通过寄存器来设置和修改。

        (2)配置GPIO引脚的具体属性:比如输入或输出模式、上下拉电阻、输出类型等。

        (3)读取或写入GPIO引脚的值:可以通过读写寄存器的方式,控制GPIO引脚的电平和状态,以控制外部电路和设备。

        此外,在使用GPIO时,还需要注意以下几点:

        (1)避免多个引脚同时输出高电平:如果多个引脚同时输出高电平,可能会导致电流过大,对系统造成损害。

        (2)避免短路:在连接GPIO引脚和外部电路时,需要注意防止短路,以保证系统的稳定性和安全性。

        (3)避免干扰:如果GPIO引脚和其他信号线距离较近,可能会发生互相干扰的现象,需要注意防止干扰。

        总之,STM32的GPIO是一种非常灵活和强大的外设,可以广泛应用于各种嵌入式系统中,但需要注意合理使用,以保证系统的稳定性和可靠性。

5.1.1 GPIO结构框图分析

        (1)保护二极管即上下拉电阻

        保护二极管是一种被设计用来保护电子设备免受静电放电和电压过高的损坏的器件。STM32GPIO的保护二极管是指内置于STM32芯片GPIO引脚上的保护二极管,它的作用是在输入电压超出芯片正常工作电压范围时,将过高或过低的电压转向芯片供电电源或地,从而保护芯片引脚免受损坏。

        引脚的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于 VDD 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管有这样的保护,并不意味着 STM32 的引脚能直接外接大功率驱动器件,如直接驱动电机,强制驱动要么电机不转,要么导致芯片烧坏,必须要加大功率及隔离电路驱动。

        总之,STM32GPIO的保护二极管和上下拉电阻是保护芯片免受电压损坏和确保输入电路正确工作的重要工具。

        (2)P-MOS管和N-MOS管

        GPIO 引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出模式”结构。先看输出模式部分,线路经过一个由 P-MOS 和 N-MOS 管组成的单元电路。这个结构使 GPIO 具有了“推挽输出”和“开漏输出”两种模式。

        所谓的推挽输出模式,是根据这两个 MOS 管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后, N-MOS 管导通, P-MOS 关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通, P 管负责灌电流, N 管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为 0 伏,高电平为 3.3 伏,具体参考图推挽等效电路 ,它是推挽输出模式时的等效电路。

        而在开漏输出模式时,上方的 P-MOS 管完全不工作。如果我们控制输出为 0,低电平,则 P-MOS管关闭, N-MOS 管导通,使输出接地,若控制输出为 1 (它无法直接输出高电平) 时,则 P-MOS管和 N-MOS 管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,参考图开漏电路 中等效电路。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平, 0 伏。

        推挽输出模式一般应用在输出电平为 0 和 3.3 伏而且需要高速切换开关状态的场合。在 STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。

        开漏输出一般应用在 I2C、 SMBUS 通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出 5 伏的高电平,就可以在外部接一个上拉电阻,上拉电源为 5 伏,并且把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出 5 伏的电平,具体见图 STM32_IO 对外输出 5V 电平。

        (3)输出数据寄存器

        STM32的输出数据寄存器(Output Data Register,简称ODR)是用于控制GPIO端口输入/输出状态的寄存器。每个GPIO端口都有一个对应的ODR寄存器,它由32位二进制数值组成,每一位代表一个引脚的状态。

        在将GPIO设置为输出模式后,可以通过设置ODR寄存器来控制输出电平。例如,将ODR寄存器某一位置为1,则相应的引脚输出高电平;反之,将该位置为0,则输出低电平。同时,也可以通过读取ODR寄存器来获取当前引脚的状态。

        需要注意的是,在使用ODR寄存器时,需要确保所有相关的输入/输出缓冲器已经配置好并启用。此外,也需要根据具体的芯片型号和GPIO引脚布局来确定ODR寄存器的具体地址和位定义。

        输出数据寄存器是开发STM32嵌入式系统中一个非常基础、重要的概念。熟练掌握ODR寄存器的基本操作,将有助于更好地设计和实现各种嵌入式应用程序。

        (4)复用功能输出

        STM32的复用功能输出(Alternate Function Output,简称AF)是一种特殊的GPIO功能模式,常用于控制外设的输入/输出信号。每个GPIO引脚都可以配置为普通GPIO输入/输出、复用功能输入或复用功能输出。

        在将GPIO设置为复用功能输出模式后,可以通过AF寄存器来配置该引脚所对应的外设类型和对应的GPIO复用编号。这样就可以将该引脚与特定外设进行连接,实现数据的收发等操作。

        下面以STM32F103ZET6为例,介绍其AF寄存器的详细信息:

        ①地址

        STM32F103C8T6共有三个GPIO端口,分别为PORTA、PORTB和PORTC。每个GPIO端口都有一个对应的AF寄存器,其地址如下:

PORTA->AFR[0]和PORTA->AFR[1]: 0x40010820, 0x40010824
PORTB->AFR[0]和PORTB->AFR[1]: 0x40010C20, 0x40010C24
PORTC->AFR[0]和PORTC->AFR[1]: 0x40011020, 0x40011024

         其中,AFR[0]代表低位字节,AFR[1]代表高位字节,每个字节内包含了8个引脚对应的AF值。

         ②复用编号

        STM32芯片支持的外设类型非常多,每个外设类型都对应着一个复用编号,例如USART1对应着复用编号为0x07,SPI1对应着复用编号为0x05等。使用AF寄存器时,需要根据具体的外设类型和引脚编号来选择合适的复用编号。

        ③配置方法

        在将GPIO设置为复用功能输出模式后,需要通过AF寄存器来配置该引脚所对应的外设类型和复用编号。具体的配置方法如下:

        首先,将GPIO所对应的复用编号写入到对应的AFR寄存器中。  然后,通过GPIO的模式寄存器(MODER)将GPIO设置为复用功能输出模式。

        例如,若要将PA9引脚配置为USART1的Tx输出引脚,可以使用以下代码:

// 将PA9引脚配置为USART1的Tx输出引脚 
// 将复用编号为0x07写入到PA9引脚对应的AFR[1]中 
GPIOA->AFR[1] |= (0x7 << ((9 - 8) * 4)); 
// 将PA9引脚设置为复用功能输出模式 
GPIOA->MODER &= ~(GPIO_MODER_MODE9_Msk); 
GPIOA->MODER |= (GPIO_MODE_AF_PP << GPIO_MODER_MODE9_Pos);

        其中,(9 - 8) * 4表示将复用编号0x07放在AFR[1]的第7~8位上。在将复用编号写入到AFR寄存器中后,将PA9引脚设置为复用功能输出模式即可。

        STM32的复用功能输出是一种重要的GPIO功能模式,能够极大地扩展STM32芯片的应用范围。熟练掌握AF寄存器的使用方法,并结合各类外设的配置,可以更好地实现嵌入式系统的设计和开发。

        (5)输入数据寄存器

        STM32的输入数据寄存器(Input Data Register,简称IDR)是用于读取GPIO端口输入状态的寄存器。每个GPIO端口都有一个对应的IDR寄存器,它由32位二进制数值组成,每一位代表一个引脚的状态。

        当将GPIO设置为输入模式后,可以通过读取IDR寄存器来获取输入电平。例如,若要读取PA5引脚的状态,可以使用以下代码:

// 读取PA5引脚的状态 
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);

        其中,GPIO_ReadInputDataBit() 函数返回引脚的状态。如果PA5引脚为高电平,则函数返回值为Bit_SET;反之,如果PA5引脚为低电平,则函数返回值为Bit_RESET。

        需要注意的是,在使用IDR寄存器时,需要确保所有相关的输入/输出缓冲器已经配置好并启用。此外,也需要根据具体的芯片型号和GPIO引脚布局来确定IDR寄存器的具体地址和位定义。下面以STM32F103ZET6为例,介绍其IDR寄存器的详细信息:

        ①地址

        STM32F103ZET6共有五个GPIO端口,分别为PORTA、PORTB、PORTC、PORTD和PORTE。每个GPIO端口都有一个对应的IDR寄存器,其地址如下:

PORTA->IDR:0x40010808
PORTB->IDR:0x40010C08
PORTC->IDR:0x40011008
PORTD->IDR:0x40011408
PORTE->IDR:0x40011808

        ②位定义

        每个IDR寄存器由32位二进制数值组成,每一位代表一个引脚的状态。具体的位定义如下:

Bit[0]Bit[15]:分别代表P0P15引脚的状态

Bit[16]~Bit[31]:保留位,必须为0

        例如,若要读取PA5引脚的状态,可以使用以下代码:

// 读取PA5引脚的状态 
if ((GPIOA->IDR & GPIO_Pin_5) == Bit_SET) 
// PA5引脚为高电平 
else 
// PA5引脚为低电平 

        其中,使用按位与操作符(&)将GPIO_PIN_5和GPIOA->IDR进行按位与操作,判断PA5引脚的状态是否为GPIO_PIN_SET即可。

        输入数据寄存器是开发STM32嵌入式系统中一个非常基础、重要的概念。熟练掌握IDR寄存器的基本操作,将有助于更好的设计和实现各种嵌入式应用程序。

        (6)复用功能输入

        复用功能输入是指在STM32微控制器上,通过将GPIO引脚的功能配置为不同的复用功能,实现多种外设和功能的共享使用。例如,一个GPIO引脚可以被配置为UART的TX输出端口,在另一个时刻则可以被配置为SPI的主机输出端口,这就是复用功能输入的作用。由于STM32系列支持的复用功能类型较多,因此可以大大节省芯片引脚资源,提高了开发的灵活性和效率。

        (7)模拟输入输出

        STM32模拟输入输出是指STM32微控制器中用于接收模拟信号并进行模拟处理的功能。模拟输入输出主要涉及到模拟信号采集、模拟信号放大和滤波、ADC (Analog to Digital Converter) 转换等方面。

        以下是STM32模拟输入输出的详细介绍:

        ①模拟输入输出需要使用专门的模拟输入引脚,通常在芯片上会标有“ADCx_INx”的标记。

        ②在进行模拟输入时,需要将对应的GPIO口初始化为模拟输入模式,并设置相关参数如采样时间等。在进行模拟输出时,则需要将DAC (Digital to Analog Converter) 模块初始化,并配置数据寄存器等参数。

        ③在进行模拟信号处理时,常常需要进行放大、滤波等操作来获得更加精确的信号。这可以通过使用外部电路或者内部的模拟电路来实现。

        ④ADC转换是模拟输入输出的重要环节之一,其作用是将采集到的模拟信号转换为数字信号,以便后续的计算和处理。STM32中的ADC模块支持多种转换模式和采样速率,可以根据实际需求进行选择和配置。

        ⑤DAC转换则是模拟输出的核心部分,其作用是将数字信号转换为模拟信号并输出。与ADC类似,STM32中的DAC模块也提供了多种转换模式和输出选项,可以根据具体应用需求进行配置和使用。

        总之,STM32模拟输入输出是非常重要的功能之一,它可以帮助开发者实现模拟信号采集和处理,并将模拟信号转换为数字信号或者模拟输出信号,从而满足各种不同的应用需求。

5.1.2 GPIO工作模式

        总结一下,由 GPIO 的结构决定了 GPIO 可以配置成以下模式:

typedef enum
{ 
	GPIO_Mode_AIN = 0x0,             // 模拟输入
	GPIO_Mode_IN_FLOATING = 0x04,    // 浮空输入
	GPIO_Mode_IPD = 0x28,            // 下拉输入
	GPIO_Mode_IPU = 0x48,            // 上拉输入
	GPIO_Mode_Out_OD = 0x14,         // 开漏输出
	GPIO_Mode_Out_PP = 0x10,         // 推挽输出
	GPIO_Mode_AF_OD = 0x1C,          // 复用开漏输出
	GPIO_Mode_AF_PP = 0x18           // 复用推挽输出
}GPIOMode_TypeDef;

        在固件库中, GPIO 总共有 8 种细分的工作模式,稍加整理可以大致归类为以下三类:

5.1.2.1 输入模式(模拟/浮空/上拉/下拉)

        在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR 读取 I/O 状态。STM32的GPIO引脚可以配置为不同的输入模式,包括模拟输入,浮空输入,上拉输入和下拉输入。这些输入模式在电路设计和应用开发中都具有重要作用。

        以下是STM32的几种常见输入模式的介绍:

        模拟输入:该模式用于接收模拟信号,通常需要使用 ADC (Analog to Digital Converter) 模块进行采集和转换。在该模式下,GPIO引脚会通过一个放大器输入到ADC模块中,以便将模拟信号转换为数字信号进一步处理。

        浮空输入:该模式用于接收未连接任何外设的引脚信号。在该模式下,GPIO引脚的输入状态是不确定的,但是通常会受到周围环境的电磁噪声或者其它干扰因素影响,因此需要进行特殊处理,如加入外部上拉或下拉电阻等。

        上拉输入:该模式用于接收高电平信号,并且当引脚未连接时,也能确保引脚处于高电平状态。在该模式下,GPIO引脚默认被连接到 MCU 内部的上拉电阻,以保证在未连接外部驱动源时,引脚的输入状态为高电平。

        下拉输入:该模式用于接收低电平信号,并且当引脚未连接时,也能确保引脚处于低电平状态。在该模式下,GPIO引脚默认被连接到 MCU 内部的下拉电阻,以保证在未连接外部驱动源时,引脚的输入状态为低电平。

        总之,STM32的不同 GPIO 引脚输入模式可根据应用需求来选择和配置。对于模拟输入,需要使用 ADC 模块进行采样和转换;对于浮空输入,需要考虑周围环境和干扰因素,可以加入外部上拉或下拉电阻;而对于上拉和下拉输入,则可以保证在未连接外部驱动源时,引脚的输入状态为高电平或低电平。

5.1.2.2 输出模式(推挽/开漏)

        推挽输出:该模式是STM32 GPIO引脚的默认输出模式。在该模式下,引脚会通过一个 MOSFET 或 BJT (双极性晶体管) 输出高电平或低电平信号。当输出高电平时,引脚将连接到 Vcc 电源;当输出低电平时,引脚将连接到 GND 地线。该模式具有较强的输出能力,可驱动大多数外部设备。

        开漏输出:该模式在输出低电平时将引脚与 GND 地线相连,而在输出高电平时则处于高阻态。在该模式下,如果需要输出高电平,则需要外接上拉电阻将引脚连接到 Vcc 电源。该模式适用于驱动一些特殊的外设,如 LED 灯等。

        总之,STM32的推挽输出和开漏输出模式具有不同的功能和特点,可以根据需要进行选择和配置。对于需要高输出功率的情况,可以使用推挽输出模式,而对于需要驱动一些特殊外设的情况,可以使用开漏输出模式。

5.1.2.3 复用功能(推挽/开漏)

        复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。

        通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的工作模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》中对应外设的寄存器说明。

        在 GPIO 外设中,控制端口高低控制寄存器 CRH 和 CRL 可以配置每个 GPIO 的工作模式和工作的速度,每 4 个位控制一个 IO, CRH 控制端口的高八位, CRL 控制端口的低 8 位,具体的看 CRH 和 CRL 的寄存器描述。

谢谢阅读!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KermanXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值