stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)

今天有网友私信我,问我怎么没有更新文章,我有点惭愧没有能够及时更新文章。因为都没有太多时间准备,所以更新的有点慢,但是我还是决定每天给大家分享一点知识。之前我们讲了STM32的时钟,讲完时钟之后我开始为大家讲一些外设我们从最基本的GPIO开始讲。我们打开STM32的手册(由于STM32的手册网上很多,大家可以自己找,如果没有的朋友也可以私信我,我会及时反馈并将资料给到你),我们看第9章 General-purpose and alternate-function I/Os (GPIOs and AFIOs)。这节主要讲STM32的通用IO与复用IO相关知识,我们看任何一款芯片一定要把官方给的参考手册看透,这样才能对芯片了如指掌。首先我们来了解一下IO口的模式以及该模式的一些相关知识:

输入:浮空输入 ─ 上拉输入 ─ 下拉输入 ─ 模拟输入

输出:开漏输出 ─ 推挽输出 ─ 开漏复用输出 ─ 开漏复用输出

针对这些我们逐一分析:

首先是浮空输入,什么是浮空输入:就是IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的,这种输入一般用作按键的检测。

我们从图中可以看出,当我们外部IO口没有电压的时候其实这个功能是失效的,根本没用,所以再我们设置开漏的时候外部一定要接上拉电阻,这样我们就可以通过控制CTRL端控制外部的输入。

推挽输出:

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(1)

   上图就是推挽输出,当我们的CTRL信号为高电平的时候,Q1导通、Q3截至,IO口输出高电平,当CTRL信号输出低电平的时候,Q1截至Q3导通,IO口输出低电平。

而复用推挽输出以及复用开漏其实是作为第二功能时的配置说明,使用方法与此方法一致。

  讲完了IO口的模式,我们再来讲讲STM32IO口的相关的寄存器,我们从下图文档中:

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(2)

可以看出,每个通用IO口都有2个32位的配置寄存器,2个32位的数据寄存器,一个32位的置位/复位寄存器,一个16位的复位寄存器以及一个32位锁存寄存器。我们先看通用IO口,在通用IO口的复位期间以及刚复位后,复用功能未开启状态,IO口是被设置成为浮空输入的,所以这点我们要注意,在设计的时候一定要考虑到开机的时候这些IO的状态会不会影响我们的设计,我之前在设计的时候就碰到过这样的情况。我们看手册中,有些特定的总线手册给了我们一些GPIO的模式配置,这些配置在第9章的9.1.11章节中,我们以后配置的时候一定要看清楚是否与是按照这些配置来配置的,千万不要搞错了。

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(3)

我们正式进入GPIO寄存器相关知识,我们先看GPIOx_CRL和GPIOx_CRH这两个寄存器,这两个寄存器是IO口配置寄存器,主要配置IO是输入还是输出以及IO口的速度。

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(4)

我们先看复位的值,我们将0x4444 4444分解为二进制,他的值就是0100 0100 0100 0100 0100 0100 0100 0100,我们将这些数字一一对应带入该寄存器的对应位,我们拿MODE0和CNF0作为对象,可以知道CNF0[1:0] = 01 ,MODE0[1:0] = 00,通过这两个数值然后根据下面的图示查询可以得出,默认的状态是InputMode,01:Floating Input状态,与我们之前手册上的一致,这就是我们分析GPIOx_CRL与GPIOx_CRH寄存器的方法。

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(5)

由于我们的引脚有16个引脚,而每个寄存器只能配置8个引脚,所以我们需要两个寄存器来配置这些引脚。GPIOx_CRL配置的低8个引脚,而GPIOx_CRH配置的高8个的引脚。

分析完模式,我们再来分析端口输入寄存器GPIOx_IDR。

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(6)

我们从图中可以看出,该寄存器的高16位作为预留位置未使用,而使用了低16位。该寄存器的IDR0~IDR15对应的就是引脚0~15的输入值,而高16位都是0,这些位只能是只读的模式并且只能以字的形式读出。

看完端口输入寄存器我们再来看看端口输出寄存器GPIO_ODR:

stm32中gpio的8种工作模式(从STM32分享各种硬件以及总线之GPIO简介)(7)

与GPIO_IDR相识,端口输出寄存器的高16位也是保留的,而只用了低16位,每一位都可以读也可以写。ODR0控制这GPIOx_Pin0,ODR15控制这GPIOx_Pin15,这些位也只能以字(16位)的形式进行操作。今天有点晚了,该休息了,明天接着写,谢谢大家,大家晚安!!!!!

也希望大家劳逸结合,身体健康,喜欢我的朋友给我加个关注,有需要什么资料的也可以找我,我尽我所能给大家帮助,谢谢大家了!!!!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页